首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >推送局部变量

推送局部变量
EN

Stack Overflow用户
提问于 2010-11-29 20:56:00
回答 2查看 11.9K关注 0票数 8

阿洛

在阅读了http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames中有关函数和堆栈的内容之后,我有一个关于局部变量的问题。

本文快照:

代码语言:javascript
复制
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代码片段和相应的组装代码:

代码语言:javascript
复制
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

记住,推基本上就是这样做的:

代码语言:javascript
复制
sub esp, 4   ; "allocate" space for the new stack item
mov [esp], X ; put new stack item value X in

为什么局部变量不像这样推到堆栈中:

代码语言:javascript
复制
push 10
push 5
push 2

而不是

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-29 21:07:20

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

票数 2
EN

Stack Overflow用户

发布于 2010-11-30 15:27:14

实际上,如果您知道需要多少堆栈空间,并将其保留在一个操作中,那么您就可以使用mov指令,它执行的速度比插入的推快(特别是现在偏移量计算有专用的硬件)。还有一个遗留组件可能与推送插件在80186/80188处理器发布之前无法在x86上使用这一事实有关。到那时,副/动会议已经成为一种既定的模式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4308021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档