栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

32位x86组件中堆栈对齐的责任

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

32位x86组件中堆栈对齐的责任

GCC 在中进行此额外的堆栈对齐

main
;该功能很特别。
如果您查看其他任何函数的代码源,除非您拥有带有
alignas(32)
或的局部语言,否则您将看不到它。

GCC只是采取了一种防御性的方法

-m32
,不假设
main
使用正确的16B对齐堆栈来调用该方法。还是从当初
-mpreferred-stack-boundary=4
只是一个好主意,而不是法律而留下的特殊待遇。

多年以来,i386 System V ABI一直保证/要求ESP + 4在功能上进行16B对齐。(即,ESP必须 CALL指令 之前 对齐16B
,因此堆栈上的args从16B边界开始。这与x86-64 System V相同。)

ABI还保证新的32位进程以在16B边界上对齐的ESP开始(例如

_start
,在ELF入口点,ESP指向argc,而不是返回地址),并且glibc
CRT代码保持该对齐。

就调用约定而言,EBP只是另一个保留呼叫的寄存器。但是,是的,编译器的输出

-fno-omit-frame-pointer
确实
pushebp
要先于其他保留呼叫的寄存器(例如EBX),因此保存的EBP值会形成一个链表。(因为
mov ebp,esp
在完成该推送之后,它还负责设置帧指针。)


也许gcc是防御性的,因为一个非常古老的Linux内核(从i386
ABI修订版之前的版本开始,当时所需的对齐方式仅为4B)可能违反了这一假设,而且这只是一条额外的指令,在运行期间存在一次流程(假设程序没有

main
递归调用)。


与gcc不同,clang假设堆栈在进入main时已正确对齐。clang还[假设狭窄的args已被符号化或零扩展为32位,即使当前的ABI修订版尚未指定该行为(尚未)。gcc和clang都发出在调用方执行的代码,但仅clang取决于被调用方。这发生在64位代码中,但我没有检查32位。)

如果您有兴趣,可以在http://gcc.godbolt.org/上查看编译器输出,以获取main和main以外的功能。


前几天,我刚刚更新了x86标签Wiki中的ABI链接。
http://x86-64.org/仍然死了,似乎还没有回来,所以我更新了System V链接,以指向HJ
Lu的github repo中当前版本的PDF以及他的带有links的页面。

请注意,SCO网站上的最新版本 不是
当前版本,并且不包括16B堆栈对齐要求。

我认为某些BSD版本仍然不需要/保持16字节堆栈对齐。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412368.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号