推送局部变量

时间:2010-11-29 20:56:00

标签: 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

这意味着可以通过引用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

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

sub esp, 4   ; "allocate" space for the new stack item
mov [esp], X ; put new stack item value X in

<小时/> 为什么局部变量没有像这样进入堆栈:

push 10
push 5
push 2

而不是

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

实际上,如果您知道需要多少堆栈空间并在单个操作中保留它,则可以使用mov指令,该指令的执行速度比推送时更快(特别是现在偏移计算具有专用硬件)。也许有一个遗留组件与在80866/80188处理器发布之前x86上没有推出immed的事实有关。到那时,sub / mov惯例已经成为一种完善的模式。