我是汇编的初学者,所以我对从另一个函数调用函数时传递参数感到困惑。具体来说,我有这样的代码: 汇编:
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
我尝试分析,但我仍然不明白 foo() 函数中的 esp - 8 bytes 是否可以相当于 bar() 函数 esp - 16 bytes 中读取的位置?两个函数之间的偏移量(如 12、8、4)是否相关?我对此真的很困惑。如果有人向我解释或给我一个具体的例子来理解这个问题,我将非常感激和赞赏。谢谢