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