我不确定何时使用ldrsh vs ldrsh和strh vs strsh
我知道一个用于未签名而另一个用于签名,但我们如何知道何时需要保存签名或未签名?
例如,
short a[5];
short *ptr;
*(a+3) = a[1];
ldrsh r3, [fp, -12]
strh r3, [fp, -8]
这是我的工作表中的ARM汇编代码片段。我只是不明白为什么我们为了一条指令而对另一条指令感到厌恶。
答案 0 :(得分:1)
ldrsh
指令加载一个半字,即16位(h
中的ldrsh
)和符号扩展(s
中的ldrsh
)它到寄存器的32位。
ldrh
指令将加载的16位零扩展为32位。
您获得符号扩展行为的原因是因为short
类型是签名类型。
要存储一个半字,您总是使用strh
指令,该指令只占用寄存器的最后16位并存储它们。没有strsh
指令,因为不需要特定于符号的处理来获取最后16位。
由于您的代码加载了16位值并立即将其存储为16位值,因此ldrh
指令也可以完成该任务。在这种情况下,无所谓。但是如果你想对它们之间的值进行任何算术运算,你肯定希望ldrsh
能够进行正确的符号扩展。