从我通常的VC ++领域冒险进入GCC世界(通过MINGW32)。试图创建一个主要由NOP组成的Windows PE,ala:
for(i = 0; i < 1000; i++)
{
asm("nop");
}
但要么我使用了错误的语法,要么编译器正在通过它们进行优化,因为那些NOP在编译过程中无法生存。
我正在使用-O0标志,否则默认。关于如何哄骗编译器让NOP保持原样的任何想法?
答案 0 :(得分:4)
获取1000个内联nop
的便捷方法是使用GNU汇编器的Common_SagaStateMachine
example:
void thousand_nops(void) {
asm(".rept 1000 ; nop ; .endr");
}
答案 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