assembly 如何使用堆栈从函数返回值?

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

假设这段代码:

int add(int a, int b){
    int c = a+b;
    return c;
}

int main(){
  printf("%d\n", add(3,4));
}

以下是在程序集中通常如何实现的:
1.将4推入堆栈
1.将3推入堆栈

  1. push返回地址,这是下一个指令print()的地址,要堆栈
    1.调用add
    1.执行加法并将c压入堆栈
  2. pop c from stack(?)
    1.返回main
    那么返回值会发生什么呢?它不能在add帧上,因为它将在最后被清除。它会被放到main的堆栈上吗?
    让我们假设值被压入堆栈而不是寄存器。
lzfw57am

lzfw57am1#

这取决于体系结构和调用约定。在x86-32中,对于64位结果,几乎每个调用约定都有eaxedx:eax中的返回值。所以你的add函数可能有这样的指令:

mov eax, dword ptr [esp+4] ; put 1st arg in eax
add eax, dword ptr [esp+8] ; add eax with 2nd arg
ret                        ; return

不需要额外的工作,因为返回值已经假定在eax中。
也就是说,除非您询问的是特定的架构,否则您不会找到一个“一般情况”的答案,即使这样,也可能有多个不同的调用约定。

相关问题