【发布时间】:2012-07-27 22:01:59
【问题描述】:
下面是我用 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
【问题讨论】:
-
您是否尝试将“=r”更改为“r”?这是我正在使用的语法。
-
它应该是 "=r" 因为
tmp是输出的。无论如何,如果我将其更改为“r”,我会收到此错误。193:3: error: output operand constraint lacks '=' 193:3: error: invalid lvalue in asm output 0 -
对此有什么想法吗?我一直无法找到解决此问题的方法。
-
如果代码只是您所显示的,那么编译器只是在抱怨您正在将数据加载到寄存器中而不是使用它。 ARM 不支持内存到内存的操作,所以你需要将数据 LDR 到寄存器中,然后将数据 STR 回内存。
-
不,我已经从代码中删除了许多细节。但我不明白你的评论。您从哪条消息中得出的结论是我没有使用数据?无论如何,即使我没有使用数据,它也应该是一个警告,显然我没有从编译器收到任何警告消息。另外,为什么说我在做 mem to mem 操作? LDR 清楚地从一个地址(此处为
blk,“m”表示允许内存操作数,具有机器支持的任何类型的地址)加载到寄存器(此处为tmp,“r”表示 ARM 内核寄存器)。最后,在这段代码中,我不存储任何数据。对不起,我没有得到你。
标签: c gcc arm inline-assembly