GCC 内联 asm NOP 循环在编译时未展开
走出我通常的 VC++ 领域,进入 GCC 的世界(通过 MINGW32)。试图创建一个主要由 NOP 组成的 Windows PE,唉:
for(i = 0; i < 1000; i++)
{
asm("nop");
}
但是要么我使用了错误的语法,要么编译器正在通过它们进行优化,因为这些 NOP 无法在编译过程中幸存下来。
我使用 -O0 标志,否则使用默认值。关于如何让编译器保持 NOP 完好无损,有什么想法吗?
Venturing out of my usual VC++ realm into the world of GCC (via MINGW32). Trying to create a Windows PE that consists largely of NOPs, ala:
for(i = 0; i < 1000; i++)
{
asm("nop");
}
But either I'm using the wrong syntax or the compiler is optimising through them because those NOPs don't survive the compilation process.
I'm using the -O0 flag, otherwise defaults. Any ideas on how I can coax the compiler into leaving the NOPs intact?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
获得 1000 个内联 nop 的便捷方法是使用 GNU 汇编器的
.rept
指令:尝试godbolt 。
A convenient way to get 1000 inline
nop
s is to use the.rept
directive of the GNU assembler:Try on godbolt.
您是否期望它将循环展开到 1000
nop
秒?我使用gcc
进行了快速测试,但没有看到(一个)nop
消失:使用
gcc -S -O3 -funroll-all-loops< /code> 我看到它展开循环 8 次(因此 8
nop
),但我认为如果你想要 1000,这将是最容易做到的:然后使用
NOP10(); ...
Are you expecting it to unroll the loop in to 1000
nop
s? I did a quick test withgcc
and I don't see the (one)nop
disappear:With
gcc -S -O3 -funroll-all-loops
I see it unroll the loop 8 times (thus 8nop
) but I think if you want 1000 it's going to be easiest to do:And then use
NOP10(); ...
最近关于不带条件循环到 1000 的问题导致使用模板递归的聪明答案实际上可以用来生成 1000 个
nop
函数,而无需重复asm("nop")
。有一些警告:如果您不让编译器内联该函数,您最终将得到一个 1000 深的单个nop
函数的递归堆栈。此外,gcc
的默认模板深度限制为 500,因此您必须显式指定更高的限制(请参见下文,但您可以简单地避免超过nop<500>()
) 。编译为:
This recent question about looping to 1000 without conditionals resulted in a clever answer using template recursion which can actually be used to produce your 1000
nop
function without repeatingasm("nop")
at all. There are some caveats: If you don't get the compiler to inline the function you will end up with a 1000-deep recursive stack of individualnop
functions. Also,gcc
's default template depth limit is 500 so you must specify a higher limit explicitly (see below, though you could simply avoid exceedingnop<500>()
).Compiled with:
除了@BenJackson的答案之外,它还可以通过(二进制)除法以更少的深度进行递归。
in addition to the answer by @BenJackson, it can recurse with way less depth by (binary) division.