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

Ell*_*ens 3 assembly arm

我不确定何时使用 ldrsh 与 ldrsh 以及 strh 与 strsh

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

例如,

short a[5];
short *ptr;

*(a+3) = a[1];
ldrsh    r3, [fp, -12]
strh     r3, [fp, -8]
Run Code Online (Sandbox Code Playgroud)

这是我的工作表中的 ARM 汇编代码片段。我只是不明白为什么我们对一条指令使用 ldrsh,而对另一条指令使用 strh。

小智 6

ldrsh指令加载半字,即 16 位(hin ldrsh)并将其符号扩展(sin ldrsh)到寄存器的 32 位。该ldrh指令会将加载的 16 位零扩展为 32 位。获得符号扩展行为的原因是因为该short类型是有符号类型。

要存储半字,您始终会使用strh仅获取寄存器底部 16 位并存储它们的指令。没有strsh指令,因为不需要特定于符号的处理来仅获取底部 16 位。

由于您的代码加载一个 16 位值并立即将其存储为 16 位值,因此ldrh指令也可以完成这项工作。在这种情况下,这并不重要。但是,如果您想对两者之间的值进行任何算术运算,您肯定希望ldrsh进行适当的符号扩展。