函数调用大致的汇编表示……

`
void f() {

int a; /* -4(%ebp) */
int b; /* -8(%ebp) */
g(a, b);
next:
int sum = a + b;
}

f:
...
;可选,如果需要的话
;pushl %eax | %ecx | %edx;
;从右往左压栈
pushl -8(%ebp); 参数b压栈
pushl -4(%ebp); 参数a压栈
call _g; 把返回地址next:压栈,跳转到函数g
...

g:
pushl %ebp; 保存%ebp
movel %esp, %ebp; 设置基址指针%ebp
;可选,如果需要的话:
;push1 %ebx | %esi | %edi;

...

;函数处理过程,设置返回值

...

;可选,如果需要的话:
;popl %ebx | %esi | %edi;
;以下两句相当于leave指令
movel %ebp, %esp ; 恢复栈指针%esp
pushl %ebp; 恢复%ebp
ret; 对应call,弹出返回地址,并跳转至该位置next:

f:
;可选,如果需要的话;
;popl %eax | %ecx | %edx;
...
`

updatedupdated2022-02-222022-02-22