推送局部变量

chi*_*ech 6 assembly

ALO

在我从http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames上读到函数和堆栈后,我对局部变量有疑问.

文章快照:


push ebp     ; save the value of ebp
mov ebp, esp ; ebp now points to the top of the stack
sub esp, 12  ; space allocated on the stack for the local variables
Run Code Online (Sandbox Code Playgroud)

这意味着可以通过引用ebp来访问局部变量.考虑以下C代码片段和相应的汇编代码:

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
Run Code Online (Sandbox Code Playgroud)

请记住,推送基本上是这样的:

sub esp, 4   ; "allocate" space for the new stack item
mov [esp], X ; put new stack item value X in
Run Code Online (Sandbox Code Playgroud)


为什么局部变量没有像这样进入堆栈:

push 10
push 5
push 2
Run Code Online (Sandbox Code Playgroud)

代替

sub esp, 12

mov [ebp -  4], 10  ; location of variable a
mov [ebp -  8], 5   ; location of b
mov [ebp - 12], 2   ; location of c
Run Code Online (Sandbox Code Playgroud)

Fli*_*sch 2

这更多的是语义问题而不是技术正确性:pushpop用于保存和恢复寄存器或值;但为函数提供局部变量并不符合push/的常规用途pop。所以,这里手动管理堆栈( 和 除外push ebppop ebp因为这里我们实际上想要ebp真正意义上的push/保存和恢复pop)。