正在编译 GCC NOP

Rus*_*hyo 3 assembly gcc nop

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

for(i = 0; i < 1000; i++)
{
    asm("nop");
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*son 5

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

        xorl    %eax, %eax
        .p2align 4,,7
.L2:
#APP
        nop
#NO_APP
        addl    $1, %eax
        cmpl    $1000, %eax
        jne     .L2
Run Code Online (Sandbox Code Playgroud)

我看到gcc -S -O3 -funroll-all-loops它展开循环 8 次(因此 8 nop),但我认为如果你想要 1000 次,那么最容易做到:

#define NOP10() asm("nop;nop;nop;nop;nop;nop;nop;nop;nop;nop")
Run Code Online (Sandbox Code Playgroud)

然后使用NOP10(); ...


Nat*_*dge 5

获得 1000 个内联nops 的便捷方法是使用GNU 汇编程序的.rept指令

void thousand_nops(void) {
    asm(".rept 1000 ; nop ; .endr");
}
Run Code Online (Sandbox Code Playgroud)

尝试一下godbolt