首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ASM栈帧分配大小差

ASM栈帧分配大小差
EN

Stack Overflow用户
提问于 2017-07-30 20:47:21
回答 1查看 322关注 0票数 0

目前,我正在阅读凯伦·米勒( Karen )的“使用英特尔奔腾的计算机体系结构汇编语言简介”(An assembly to computer architecture )一书。

首先,对call和ret进行了解释,解释了返回入口的节省问题。其次,解释了叶程序与非叶程序的区别:叶程序不调用其他程序,而非叶过程调用。这将为堆栈帧的其余部分留出1 dword (32位)更少的空间:

此返回地址被视为过程框架的一部分。帧内的第一个双字是返回地址。对于非叶过程,分配给帧其余部分的空间数量比帧的大小少一个双字,因为调用指令为返回地址分配(并使用)空间。

在此之后,给出了一个代码示例,这就引出了我的主要问题。

代码语言:javascript
复制
A: sub ESP, 20 ; allocate frame for A
               ; return address is at [ESP+20] in A's frame
   call B
   call C
   add ESP, 20 ; deallocate A's frame
   ret

B: sub ESP, 20 ; allocate frame for B
               ; return address is at [ESP+20] in B's frame
   call D
   add ESP, 20 ; deallocate B's frame
   ret

C: sub ESP, 12 ; allocate frame for C
   ; unnecessary cope of C's return address is at [ESP+12]
   add ESP, 12 ; deallocate C's frame
   ret

D: sub ESP, 20 ; allocate frame for D
               ; return address is at [ESP+20] in D's frame
   call D
   add ESP, 20 ; deallocate D's frame
   ret

E: sub ESP, 12 ; allocate frame for E
   ; unnecessary cope of E's return address is at [ESP+12]
   add ESP, 12 ; deallocate E's frame
   ret

过程C和E都是叶程序,因为它们不调用任何东西。为什么这些叶程序只得到12位(如果我也错了,请纠正我),而非叶程序只得到20位(?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-31 20:16:29

编译器可以使用SUB,为局部变量分配空间和/或根据某种约定正确地对齐堆栈指针。在纯程序集中,您设置了约定,可以做任何您喜欢的事情。不知道12和20是从哪里来的。我会忽略这一点,尝试下一章。

博·佩尔松

这些代码片段很可能是为了实现本书后面描述的东西而发明的,或者它们是从高级编译器输出中获得的,而没有经过适当的重新思考。我希望第一个变体是真的,但在这种情况下,你应该先阅读整本书,然后再决定它的质量。

由Netch

那是字节,对我来说没有任何意义。

杰斯特

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

https://stackoverflow.com/questions/45404540

复制
相关文章

相似问题

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