ldrsh,ldrh,strh和strsh之间的区别

时间:2018-06-10 00:06:19

标签: assembly arm

我不确定何时使用ldrsh vs ldrsh和strh vs strsh

我知道一个用于未签名而另一个用于签名,但我们如何知道何时需要保存签名或未签名?

例如,

short a[5];
short *ptr;

*(a+3) = a[1];
ldrsh    r3, [fp, -12]
strh     r3, [fp, -8]

这是我的工作表中的ARM汇编代码片段。我只是不明白为什么我们为了一条指令而对另一条指令感到厌恶。

1 个答案:

答案 0 :(得分:1)

ldrsh指令加载一个半字,即16位(h中的ldrsh)和符号扩展(s中的ldrsh)它到寄存器的32位。 ldrh指令将加载的16位零扩展为32位。 您获得符号扩展行为的原因是因为short类型是签名类型。

要存储一个半字,您总是使用strh指令,该指令只占用寄存器的最后16位并存储它们。没有strsh指令,因为不需要特定于符号的处理来获取最后16位。

由于您的代码加载了16位值并立即将其存储为16位值,因此ldrh指令也可以完成该任务。在这种情况下,无所谓。但是如果你想对它们之间的值进行任何算术运算,你肯定希望ldrsh能够进行正确的符号扩展。