下面是我用C和内联汇编编写的一段代码,用于将数组blk
中的一些short
值加载到ARM R
寄存器中。
...
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抱怨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
tmp
是输出。无论如何,如果我将其更改为 "r",就会出现此错误。193:3: error: output operand constraint lacks '=' 193:3: error: invalid lvalue in asm output 0
- aminfarblk
,而 "m" 表示允许内存操作数,带有机器支持的任何类型的地址)加载到寄存器(这里是tmp
,而 "r" 表示 ARM 核心寄存器)。最后,在这段代码中,我没有存储任何数据。很抱歉我不理解你的意思。 - aminfar