编译器使用局部变量而不调整 RSP
- 2024-10-18 09:01:00
- admin 原创
- 76
问题描述:
在问题编译器:理解从小程序生成的汇编代码中,编译器使用两个局部变量而不调整堆栈指针。
不调整RSP以使用局部变量似乎不安全,因此编译器似乎依赖于硬件在发生中断时自动切换到系统堆栈。否则,出现的第一个中断会将指令指针推送到堆栈上并覆盖局部变量。
该问题的代码是:
#include <stdio.h>
int main()
{
for(int i=0;i<10;i++){
int k=0;
}
}
该编译器生成的汇编代码是:
00000000004004d6 <main>:
4004d6: 55 push rbp
4004d7: 48 89 e5 mov rbp,rsp
4004da: c7 45 f8 00 00 00 00 mov DWORD PTR [rbp-0x8],0x0
4004e1: eb 0b jmp 4004ee <main+0x18>
4004e3: c7 45 fc 00 00 00 00 mov DWORD PTR [rbp-0x4],0x0
4004ea: 83 45 f8 01 add DWORD PTR [rbp-0x8],0x1
4004ee: 83 7d f8 09 cmp DWORD PTR [rbp-0x8],0x9
4004f2: 7e ef jle 4004e3 <main+0xd>
4004f4: b8 00 00 00 00 mov eax,0x0
4004f9: 5d pop rbp
4004fa: c3 ret
局部变量i
位于[rbp-0x8]
和k
。[rbp-0x4]
有人能解释一下这个中断问题吗?硬件确实切换到系统堆栈了吗?怎么做到的?我的理解错了吗?
解决方案 1:
这就是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链接观察到此代码生成。
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD