3

short以下は、配列blkから ARMRレジスタにいくつかの値をロードするために C およびインライン アセンブリで記述したコードの一部です。

...
short *blk; 
... //blk memory allocation and initialization
short tmp0, tmp1, tmp2;
asm volatile (
"ldrh %[tmp0], [%0]\n\t"
"ldrh %[tmp1], [%1]\n\t"
"ldrh %[tmp2], [%2]\n\t"
: [tmp0] "=r" (tmp0), [tmp1] "=r" (tmp1), [tmp2] "=r" (tmp2)
: "m" (blk[0])  , "m" (blk[8]), "m" (blk[8*2])
: 
);

arm gcc 4.6 からこのエラー メッセージが表示されます

/tmp/ccDEBLCN.s:266: Error: ARM register expected -- `ldrh r3,[[r5,#0]]'

GCC は line について不平を言ってldrh %[tmp2], [%2]いますが、その理由がわかりません。私はLDRH指示を見て、私の指示テンプレートが正しいように思えます。

Load memory halfword [15:0] from register address + 5-bit immediate offset
LDRH <Rd>, [<Rn>, #<immed_5> * 2]

ところで、これは私がこれをコンパイルするために使用しているコマンドです:

arm-none-linux-gnueabi-gcc -O2 -march=armv7-a -mthumb 
4

2 に答える 2

2
asm (
"ldrh %[tmp0], %[ref0]\n\t"
"ldrh %[tmp1], %[ref1]\n\t"
"ldrh %[tmp2], %[ref2]\n\t"
: [tmp0] "=&r" (tmp0), [tmp1] "=&r" (tmp1), [tmp2] "=r" (tmp2)
: [ref0] "m" (blk[0])  , [ref1] "m" (blk[8]), [ref2] "m" (blk[8*2])
: 
);
于 2012-07-29T02:18:24.947 に答える
1

コードが実際には何もしないとコンパイラが不平を言っているようです。これはあなたが本当にやりたかったことですか?

...
short *blk; 
... //blk memory allocation and initialization
short tmp0, tmp1, tmp2;
asm volatile (
"ldrh r0,[%[BLK]]\n\t"
"ldrh r1,[%[BLK], #8]\n\t"
"ldrh r2,[%[BLK], #16]\n\t"
"strh r0,[%tmp0] \n\t"
"strh r1,[%tmp1] \n\t"
"strh r2,[%tmp2] \n\t"
: [tmp0] "r" (tmp0), [tmp1] "r" (tmp1), [tmp2] "r" (tmp2), [BLK] "r" (blk)
: "r0", "r1", "r2"
: 
);
于 2012-07-29T05:24:07.523 に答える