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

使用局部变量的编译器,无需调整RSP

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

使用局部变量的编译器,无需调整RSP

这就是x86-64 ABI的所谓“红色区域”
。维基百科的摘要:

在计算中,红色区域是函数堆栈帧中超出当前堆栈指针的固定大小区域,该区域未被该函数保留。被调用方函数可以使用红色区域来存储局部变量,
而无需修改堆栈指针 。中断/异常/信号处理程序不能修改此内存区域。System V使用的x86-64
ABI要求一个128字节的红色区域,该区域直接从堆栈指针的当前值开始。

在64位Linux用户代码中,只要使用的字节数不超过128个即可。这是叶函数(即不调用其他函数的函数)最主要使用的优化


如果使用该选项将示例程序编译为带有 GCC (或兼容的编译器)的64位Linux程序,

-mno-red-zone
则会生成如下所示的代码:

main:        push    rbp        mov     rbp, rsp        sub     rsp, 16;     <<============  Observe RSP is now being adjusted.        mov     DWORD PTR [rbp-4], 0.L3:        cmp     DWORD PTR [rbp-4], 9        jg      .L2        mov     DWORD PTR [rbp-8], 0        add     DWORD PTR [rbp-4], 1        jmp     .L3.L2:        mov     eax, 0        leave        ret

可以在此godbolt.org链接上观察到此代码的生成。


对于32位Linux用户程序,不调整堆栈指针将是一件坏事。如果要将问题中的代码编译为32位代码(使用

-m32
选项),
main
则会显示以下代码:

main:        push    ebp        mov     ebp, esp        sub     esp, 16;     <<============  Observe ESP is being adjusted.        mov     DWORD PTR [ebp-4], 0.L3:        cmp     DWORD PTR [ebp-4], 9        jg      .L2        mov     DWORD PTR [ebp-8], 0        add     DWORD PTR [ebp-4], 1        jmp     .L3.L2:        mov     eax, 0        leave        ret

您可以在此gotbolt.org链接中观察到此代码的生成。



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

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

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