阿洛
在阅读了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发布于 2010-11-29 21:07:20
与其说是技术正确性,不如说是语义问题:push和pop用于保存和恢复寄存器或值;但是为函数提供局部变量并不符合push/pop的常规用途。因此,堆栈在这里是手动管理的(除了push ebp和pop ebp,因为这里我们实际上希望保存和恢复真正意义上的push/pop)。
发布于 2010-11-30 15:27:14
实际上,如果您知道需要多少堆栈空间,并将其保留在一个操作中,那么您就可以使用mov指令,它执行的速度比插入的推快(特别是现在偏移量计算有专用的硬件)。还有一个遗留组件可能与推送插件在80186/80188处理器发布之前无法在x86上使用这一事实有关。到那时,副/动会议已经成为一种既定的模式。
https://stackoverflow.com/questions/4308021
复制相似问题