我是汇编语言的初学者,所以我对从另一个函数调用函数时传递参数感到困惑。具体来说,我有这样的代码:组装方式:
bar:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $555, -4(%ebp)
movl 12(%ebp), %eax
movl 8(%ebp), %edx
addl %edx, %eax
movl %eax, -8(%ebp)
leave
ret
foo:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $222, 4(%esp)
movl $111, (%esp)
call bar
leave
ret
原始C代码:
void
bar(int a, int b)
{
int x, y;
x = 555;
y = a+b;
}
void
foo(void) {
bar(111,222);
}
在汇编代码中,我不明白为什么foo()
movl $222, 4(%esp)
movl $111, (%esp)
call bar
也可以通过bar()读取:
movl 12(%ebp), %eax
movl 8(%ebp), %edx
我试图分析,但我仍然不明白,如果esp - 8字节的foo()函数可以等同于位置读取bar()函数esp - 16字节?这两个函数之间的偏移量数字(如12、8、4)是否相关?我真的很困惑。如果有人给我解释一下,或者给予我一个具体的例子来理解这个问题,我会非常感激和感激。谢谢
1条答案
按热度按时间nukf8bse1#
让我们想象一些样本值,并跟踪ESP/EBP发生了什么。另外请记住,按下某些内容(包括隐藏在
call
中的“push eip
“)将使ESP递减。