2

我想定义一个这样的预处理器语句:

#define INSERT_NOPS(num) .......

在我的代码中的某个地方

INSERT_NOPS(10);

现在我希望我的预处理器推出以下代码:

asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");

我怎么能意识到这一点?(0<=num<100000)

我不想在我的宏中使用任何 if/else 语句。

提前致谢!

4

2 回答 2

3

这对于手工滚动来说绝非易事。查看Boost Preprocessor Library,它适用于 C 和 C++。BOOST_PP_REPEAT做你想做的事:

#include <boost/preprocessor/repetition/repeat.hpp>

#define INSERT_NOP(z, n, data) asm volatile("nop");
#define INSERT_NOPS(num) BOOST_PP_REPEAT(num, INSERT_NOP, )

INSERT_NOPS(10)

证明:

$ g++ -E test.cc
[...]
asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop");
于 2013-11-06T20:08:36.523 回答
1

我想我在不使用 Boost 的情况下找到了更好的解决方案:

#pragma GCC push_options
#pragma GCC optimize ("unroll-loops")
#pragma GCC optimize ("O2")
void nops() {
 int i = 0;
 for(; i < 10 ; i++) {
   asm volatile("nop");
 }
}
#pragma GCC pop_options

int main(void) {
  nops();
}

编译:

gcc -c -o test.o -O3 test.c 

拆机看看:

objdump -d test.o

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <nops>:
   0:   90                      nop
   1:   90                      nop
   2:   90                      nop
   3:   90                      nop
   4:   90                      nop
   5:   90                      nop
   6:   90                      nop
   7:   90                      nop
   8:   90                      nop
   9:   90                      nop
   a:   c3                      retq   

Disassembly of section .text.startup:

0000000000000000 <main>:
   0:   31 c0                   xor    %eax,%eax
   2:   e8 00 00 00 00          callq  7 <main+0x7>
   7:   f3 c3                   repz retq 
于 2013-11-07T15:00:31.297 回答