AT&T 32 位汇编在函数调用后是否推送字符串?

AT&T 32-bit assembly does pushing strings after function call works?

我目前正在尝试理解 AT&T 的 32 位汇编代码,我偶然发现了这些指令,我正在尝试理解它们:

_start:
        jmp B

A:
   # fd = open("libtest.so.1.0", O_RDONLY);
   xorl %ecx, %ecx
   movb , %al
   popl %ebx
   xorl %ecx, %ecx
   int [=10=]x80


B:
   call A
   .string "/lib/libtest.so.1.0"

A继续有点长但是没关系,我的问题在B,调用指令发出后如何压入字符串?除了某种我还不理解的参数传递外,我看不出字符串以任何方式结束在 ebx 中。

call 将 return 地址压入堆栈,即 call 之后的地址,这将是此处路径字符串的地址。

通常 ret 然后将其弹出并将 return 控制权交给调用者,但此处代码将地址弹出到 ebx 并将其用作中断的参数.

Linux 将从 _start 标签开始 运行 程序,然后它的第一行跳转到 BB 调用 A 这将导致处理器在调用后将 return 指令地址(在本例中只是字符串地址)压入堆栈,然后处理器将转到 A 从那里执行指令, A 继续执行指令直到完成,但它不会 return 使用 ret 指令(这将导致从堆栈弹出 return 地址并跳转到该地址)所以处理器将继续按正常顺序执行指令,这意味着它将再次执行调用指令(无限循环)。