我刚刚开始学习 ARM,但无法理解加载和存储指令的具体功能。
加载说明:
ldrsb
ldrb
ldrsh
ldrh
ldr
存储说明:
strb
strh
str
“加载半字”有符号或无符号是什么意思?或者“加载字节”有符号或无符号?有符号和无符号之间有什么区别,以及在哪些特定应用中某些加载/存储指令可以实际使用?
总而言之,我正在寻求对这些说明的作用的直观理解,因为我仍然对它们的工作原理和目的感到困惑。
最佳答案
当谈论 ARM 时,“字”是 32 位,“半字”是 16 位,“字节”是 8 位。如果您阅读 ARM 架构引用手册中的指令集文档(如果您不知道该获取哪一个,则只需获取 ARMv5 的指令集文档,infocenter.arm.com),您将看到 ldrb 将字节加载到 的低 8 位中目标寄存器将高 24 位填充为零。 ldrsb 将签署扩展而不是用零填充。半字也是如此。
如果你有这样的代码:
char a,b,c;
...
c = a+b;
if(c<0)
{
}
当您需要执行此加法时,a 或 b 或两者都在内存中,那么您理想情况下希望进行符号扩展(假设您已告诉编译器 char 已签名)加载以保存指令符号扩展寄存器,以便您可以执行数学运算并设置正确的标志以进行比较。
来自 ARM ARM。
LDRSB(加载寄存器有符号字节)从内存加载一个字节,对其进行符号扩展以形成 32 位字,并将结果写入通用寄存器。
LDRB(加载寄存器字节)从内存中加载一个字节,对其进行零扩展以形成一个32位字,并将结果写入通用寄存器。
关于assembly - ARM 的加载和存储字节和半字指令如何工作?签名与未签名有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14430522/