assembly 获取程序集中的参数值

wkyowqbh  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(108)

我是汇编语言的初学者,所以我对从另一个函数调用函数时传递参数感到困惑。具体来说,我有这样的代码:组装方式:

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)是否相关?我真的很困惑。如果有人给我解释一下,或者给予我一个具体的例子来理解这个问题,我会非常感激和感激。谢谢

nukf8bse

nukf8bse1#

让我们想象一些样本值,并跟踪ESP/EBP发生了什么。另外请记住,按下某些内容(包括隐藏在call中的“push eip“)将使ESP递减。

bar:  ;ESP=88
pushl   %ebp    ;ESP=84
movl    %esp, %ebp   ;EBP=84
subl    $16, %esp    ;ESP=78
movl    $555, -4(%ebp)
movl    12(%ebp), %eax   ;@96->EAX
movl    8(%ebp), %edx    ;@92->EDX
addl    %edx, %eax
movl    %eax, -8(%ebp)
leave
ret
foo:
pushl   %ebp         ;starting here:
movl    %esp, %ebp   ;let's assume ESP=100,EBP=100
subl    $8, %esp     ;ESP=92
movl    $222, 4(%esp) ;222->96
movl    $111, (%esp)  ;111->92
call    bar
leave
ret

相关问题