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

 兔牙的猪蹄 发布于 2023-02-12 09:05

考虑一段C++代码:

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

我使用g ++(Ubuntu 4.8.1-2ubuntu1~12.04)使用命令在amd64系统上编译它,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的是零,然后设置后重新检查结果再一次alZF?为什么不test eax,eax\n jne .L2呢?

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有