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)
这更多的是语义问题而不是技术正确性:push和pop用于保存和恢复寄存器或值;但为函数提供局部变量并不符合push/的常规用途pop。所以,这里手动管理堆栈( 和 除外push ebp,pop ebp因为这里我们实际上想要ebp真正意义上的push/保存和恢复pop)。
| 归档时间: |
|
| 查看次数: |
8717 次 |
| 最近记录: |