栈帧的访问
有两类指令可以访问栈帧,一种是栈操作指令,push 和 pop;一种是移动指令 mov。由于栈帧只支持访问父函数的顶部数据,故而需要借助 ESP,EBP 寄存器来访问。
x 86 默认以 4 字节为单位。高地址对应栈顶,低地址对应栈底。故而,访问栈帧的举例如下:
push eax #将寄存器eax的值压栈
push 985 #将立即数985压栈
push [ebp+8] #将主存地址[ebp+8]里的数据压栈
pop eax #栈顶元素出栈,写入寄存器eax
pop [ebp+8] #栈顶元素出栈,写入主存地址[ebp+8]
[ebp+8],意味着访问栈帧中的第二个调用参数。
若要访问本级函数的局部变量,那么就要进行如下操作,以 add 函数为例:
int add(int a, int b) {
int a = 10, b = 5; c = 2;
...
}
那么对应的语句就为:
mov [ebp - 4], 10 ; location of variable a
mov [ebp - 8], 5 ; location of b
mov [ebp - 12], 2 ; location of c