1

インライン アセンブリで整数パラメータを使用するにはどうすればよいですか? 次の関数パラメーターがあります。

unsigned int __MRC(uint32 coproc, uint32 opcode1, uint32 CRn, uint32 CRm, uint32 opcode2)

CRn CRm を r0 と r1 に移動しました

register unsigned int r0 asm("r0") = (unsigned int) (CRn);

register unsigned int r1 asm("r1") = (unsigned int) (CRm);

そして今、それを次の形式で書きたいと思います:

__asm__(" MRC ... ");

これはフォーマットです:

MRC <copr>, <op1>, Rd, CRn, CRm{, <op2>}
4

1 に答える 1

3

あなたの質問を正しく理解できれば、答えはGCC 拡張 ASM機能を使用することだと思います。コード行を避けて、register unsigned int ... asm("r*") ...拡張 ASM 構文を使用してインライン アセンブリ ステートメントを記述するだけです。

いくつかの定数を展開する必要があるという事実については、おそらく最善の策は、プリプロセッサの文字列化、インライン ASM、および複合ステートメント式を組み合わせて使用​​することです。すべてのパラメータが定数である次のようなもの:

#define MRC(coproc, opcode1, CRn, CRm, opcode2)\
  ({unsigned int rd; __asm__(\
    "MRC p" #coproc ", " #opcode1 ", %0, c" #CRn ", c" #CRm ", " #opcode2 \
    :"=r"(rd)); rd; })

unsigned int foo(void) {
  // expands to something like:
  // MRC p15, 0, r0, c0, c0, 0
  return MRC(15, 0, 0, 0, 0);
}
于 2013-08-23T12:56:12.883 に答える