- 论坛徽章:
- 0
|
你就不能自已画一画 stack 的结构出来
画一画什么都清楚了。
再改一改 c 代码:
void caller()
{
callee(1,2);
}
void callee(int a, int b)
{
int c = a+b;
... ...
}
对应的汇编代码:
caller:
push ebp
mov ebp, esp
push 2 /* arg2 */
push 1 /* arg1 */
call callee /* ----> callee() */
pop ebp
ret
callee:
push ebp
mov ebp, esp
sub esp, 4
mov eax, [ebp+8] /* arg1 */
add eax, [ebp+0xc] /* arg2 */
mov [ebp-4], eax /* c = a + b */
add esp, 4
pop ebp
ret
stack:
/ ----------
| 2 ---------> arg2 ========> [ebp+0xc]
| -----------
caller() | 1 ---------> arg1 ========> [ebp+8]
| -----------
\ eip ========================> [ebp+4]
----------- \
[ebp] (esp) --> ebp | ===> push ebp =======> [ebp] 也就是 esp
----------- |
[ebp-4] ---> c | =======> [ebp-4]
----------- | ----> callee
XXX XXX |
----------- |
XXX XXX /
-----------
当:
push ebp ========> [esp] = ebp
mov ebp, esp ========> [ebp] = ebp |
|