gpt4 book ai didi

assembly - 为什么会生成如此奇怪的代码?

转载 作者:行者123 更新时间:2023-12-03 06:41:41 24 4
gpt4 key购买 nike

考虑一段 C++ 代码:

int main()
{
volatile int a=0;
if(!a)
++a;
}

我在 amd64 系统上编译它g++ (Ubuntu 4.8.1-2ubuntu1~12.04) 使用命令 g++ test.cpp -S -o test.S -masm=intel并得到以下代码:

...
mov eax, DWORD PTR [ebp-4]
test eax, eax
sete al
test al, al
je .L2
mov eax, DWORD PTR [ebp-4] ; don't use result of sete
add eax, 1
mov DWORD PTR [ebp-4], eax
.L2:
mov eax, 0 ; also drop result of sete
...

这段代码确实让我惊讶。起初我认为这与 64 位模式有关。但是当我尝试使用 -m32 进行编译时,这一点保持不变。

为什么要检查 eax为零,然后在设置 al 后再次检查结果至ZF ?为什么它不这样做 test eax,eax\n jne .L2

最佳答案

我认为这与 C 和 C++ 中 bool 的处理方式不同有关。在您的代码中,if(!a) 首先将 a 转换为 bool(这就是 test eax, eax; sete al 执行),然后然后测试该 bool 值(在 al 中)的真/假。

如果您重命名为 .c 并使用 gcc 编译相同的代码,它将生成预期的代码

    mov DWORD PTR [rbp-4], 0
mov eax, DWORD PTR [rbp-4]
test eax, eax
jne .L3
mov eax, DWORD PTR [rbp-4]
add eax, 1
mov DWORD PTR [rbp-4], eax
.L3:

在 C 中,似乎整型变量的 bool 测试发生时没有中间转换为 bool。请注意,从不涉及 al,因此这意味着在测试该值是否为非零之前,永远不会将该值“转换”为一字节 bool

关于assembly - 为什么会生成如此奇怪的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com