我不确定何时使用 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进行适当的符号扩展。