从我通常的 VC++ 领域冒险进入 GCC 的世界(通过 MINGW32)。试图创建一个主要由 NOP 组成的 Windows PE,ala:

for(i = 0; i < 1000; i++)
{
    asm("nop");
}

但是要么我使用了错误的语法,要么编译器正在通过它们进行优化,因为这些 NOP 无法在编译过程中幸存下来。

我正在使用 -O0 标志,否则为默认值。关于如何诱使编译器保持 NOP 完好无损的任何想法?

最佳答案

您是否希望它将循环展开为 1000 nop s?我用 gcc 做了一个快速测试,我没有看到(一个)nop 消失了:

        xorl    %eax, %eax
        .p2align 4,,7
.L2:
#APP
        nop
#NO_APP
        addl    $1, %eax
        cmpl    $1000, %eax
        jne     .L2

使用 gcc -S -O3 -funroll-all-loops 我看到它展开循环 8 次(因此是 8 nop ),但我认为如果你想要 1000,它最容易做到:
#define NOP10() asm("nop;nop;nop;nop;nop;nop;nop;nop;nop;nop")

然后使用 NOP10(); ...

关于正在编译 GCC NOP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4567220/

10-12 15:34