2

次のようなプリプロセッサ ステートメントを定義したいと思います。

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

そして私のコードのどこかに

INSERT_NOPS(10);

ここで、プリプロセッサに次のコードを展開させたい:

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

どうすればこれを理解できますか?(0<=数値<100000)

マクロ内で if/else ステートメントを使用したくありません。

前もって感謝します!

4

2 に答える 2

3

これは、手で転がすのは簡単なことではありません。C と C++ で動作するBoost Preprocessor Libraryをご覧ください。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 に答える