3

私は次の質問を見ました: cppマクロで改行を生成する方法は?

C++プリプロセッサの改行の必要性について簡単に説明します。C++コードで埋め込みアセンブリコードを使用するコードでARMRealviewコンパイラ3.1に取り組んでいます。

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, ##val];bl vThunk_##op;ldr lr, [sp,##val];bx lr; \
    } \
   void vThunk_##op(void*)

DEFINE_FUNCTION(void*, mov_lt, #0x04)
{
     // do some operation
}

上記のマクロは、関数本体の各ステートメント間に強制的に改行を必要とする埋め込みアセンブリ関数を宣言します。

これは、関数本体のテキストがARMコンパイラによって盲目的にARMアセンブラに送信されるためだと思います。

なぜC++プリプロセッサはまだ複数行の置換をサポートしていないのですか?また、置換文字列で#を使用することはできません。たとえば、この種のアセンブリの場合、

str lr, [sp, #0x04]

私はたくさんの方法と方法を試しましたが、実際には何もうまくいきませんでした。ARMアセンブラ/コンパイラは非常に基本的であるため、GCCにはasmvolatileのようなAPIはありません。

DEFINE_FUNCTIONマクロは多くの場所で使用されているため、無視することもできません。

したがって、最終的な手段として、次の解決策について考えます。

  • C++プリプロセッサの代わりにm4プリプロセッサを使用する
  • C ++テンプレートを使用してこれを何らかの方法で実現し、grep/sedを使用してDEFINE_FUNCTIONを置き換えます

誰かが私に上記のことをするための指針や方法を教えてもらえますか?ARMRealviewコンパイラ3.1以外のコンパイラは使用できません。

、、の新しい行を使用して、以下のような拡張が必要です DEFINE_FUNCTION(void*, mov_lt, #0x04) {}

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
  }
4

3 に答える 3

3

GNUm4プリプロセッサを使用して上記の問題を正常に解決しました。

m4_define('DEFINE_FUNCTION','
     __asm rtype nt_$2(void*) {  
      str lr, [sp, $3];
      bl vThunk_$1;
      ldr lr, [sp,$3];
      bx lr;
    } 
   void vThunk_$2(void*)')

DEFINE_FUNCTION(void*, mov_lt, 0x04)
{
}

m4を使用して上記のコードを前処理すると、コード内の改行要件の問題が解決しました。プリビルドイベントとしてm4-Pを実行し、Cプリプロセッサとコンパイル段階が始まる前でもソースファイルが処理されるようにしました。

助けてくれてありがとう、そしてたくさん混乱してすみません。しかし、最新のC ++コンパイラには、優れたマクロプリプロセッサの余地があります。

于 2009-10-12T11:11:43.523 に答える
1

ガスバージョンごとに異なる改行置換文字があります。たとえば、AVRはARMガスバージョンの文字を$で検索します。

于 2011-01-29T13:23:03.543 に答える
0

あなたの例は非常に紛らわしいですが、これはうまくいきませんか?

#define DEFINE_FUNCTION(rtype, op, val) \
    __asm rtype nt_##op(void*) { \   
      str lr, [sp, val];\
      bl vThunk_##op;\
      ldr lr, [sp,val];\
      bx lr;\
    }\
   void vThunk_##op(void*)

そしてのように呼ばれるとき

DEFINE_FUNCTION(void*, mov_lt, 0x04)  // notice no # here
{
     // do some operation
}

あなたが得るだろう

__asm void* nt_mov_lt(void*) {   
      str lr, [sp, 0x04];
      bl vThunk_mov_lt;
      ldr lr, [sp,0x04];
      bx lr;
    }
 void vThunk_mov_lt(void*)
 {
     // do something
 }

それはまさにあなたが求めているものです。

于 2009-10-10T14:14:11.273 に答える