小编Jam*_*mes的帖子

使用 gcc -O1 优化检查是否在 unsigned int 中设置了第 31 位

我正在使用 gcc 为 32 位处理器编译 C 代码。它适用于-O0优化,但是-O1(也尝试过-Ofast)它会产生不正确的输出。

void foo()
{
    volatile unsigned int *reg = (volatile unsigned int *)0x1000;
    unsigned int reg_value;
    unsigned int busy;

    do {
        reg_value = *reg;
        busy = (reg_value & 0x80000000U);
    } while (busy == 0);
}
Run Code Online (Sandbox Code Playgroud)

随着-O1编译器产生:

1030cea6 <foo>:
1030cea6:   a1 00 10 00 00          mov    0x1000,%eax
1030ceab:   85 c0                   test   %eax,%eax
1030cead:   79 f7                   jns    1030cea6 <foo>
1030ceaf:   c3                      ret
Run Code Online (Sandbox Code Playgroud)

此输出的问题是 'test %eax,%eax' 检查所有 32 位,而不仅仅是位 …

c x86 assembly gcc bit

2
推荐指数
1
解决办法
72
查看次数

标签 统计

assembly ×1

bit ×1

c ×1

gcc ×1

x86 ×1