栈帧的访问

有两类指令可以访问栈帧,一种是栈操作指令,pushpop;一种是移动指令 mov。由于栈帧只支持访问父函数的顶部数据,故而需要借助 ESPEBP 寄存器来访问。

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