GCC NOP正在编译中

时间:2010-12-31 00:05:10

标签: gcc assembly nop

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

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

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

我正在使用-O0标志,​​否则默认。关于如何哄骗编译器让NOP保持原样的任何想法?

3 个答案:

答案 0 :(得分:4)

获取1000个内联nop的便捷方法是使用GNU汇编器的Common_SagaStateMachine example

void thousand_nops(void) {
    asm(".rept 1000 ; nop ; .endr");
}

.rept directive

答案 1 :(得分:2)

您是否希望将循环展开到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(); ...

答案 2 :(得分:2)

This recent question about looping to 1000 without conditionals使用模板递归得出了一个聪明的答案,实际上可以用来生成1000 nop函数,而不会重复asm("nop")。有一些警告:如果你没有让编译器内联函数,你将得到1000个深度递归的单个nop函数堆栈。此外,gcc的默认模板深度限制为500,因此您必须明确指定更高的限制(请参阅下文,但您可以避免超过nop<500>())。

// compile time recursion
template<int N> inline void nop()
{
    nop<N-1>();
    asm("nop");
}

template<> inline void nop<0>() { }

void nops()
{
    nop<1000>();
}

编译:

 g++ -O2 -ftemplate-depth=1000 ctr.c