Procedure Framework in Assembly Language
1 ; int Fun(char x, char y) ;
2
3 Fun PROC NEAR32
4 push ebp ; Always the first pushed.
5 mov ebp, esp ; Backup base pointer for stack.
6 sub esp, 40 ; Space for local variable.
7 pushf
8
9 ; Do something
10
11 popf
12 mov esp, ebp ; Restore esp from stack base pointer
13 pop ebp ; Always the last poped.
14 ret 1 + 1 ; Return and discarding parameters(char x, char y).
15 Fun ENDP
思考:
第 1 行是在 C 中的函数声明.
第 4 行是将 procedure 中会用到的 ebp 寄存器保存. ebp 用于记录当前函数调用的栈基础位置. 假设是在 80x86 下编程, 栈是向下增长的, 那么小于 ebp 的位置将按地址倒序存放返回地址和各个参数, 但是各个参数的顺序由编程者而定. ebp 自身将存放函数调用之前的老 ebp 值. ebp 以上的地址将按地址升序存放 local variable 以及各个在 procedure 中会用到的寄存器.
第 5 行是将此时栈顶指针复制给 ebp 保存, 这也是 ebp 寄存器的标准用法.
第 6 行是在 ebp 地址之下为了给局部变量留出空间, 本例假设局部变量为大小为 40 bytes.
第 7 行是在函数内部保存了标志寄存器的值, 以便函数执行后还原状态.
...
第 11 行不解释. 此时函数 esp 指针正好位于 local varialbe 上.
第 12 行将 esp 跳过 local varialbe 直接指向老 ebp 的位置(在步骤 4 中压入栈的 ebp).
第 13 行不解释. 此时函数 esp 指向函数的返回地址.
第 14 行恢复 EIP 指针并将 esp 跳过所有参数.