assembly - ARM 的加载和存储字节和半字指令如何工作?签名与未签名有何作用?

标签 assembly arm instructions

我刚刚开始学习 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/

相关文章:

compilation - RISC-V 压缩指令子集 (RVC) 是否总是在二进制文件中组装成 32 位指令?

assembly - 就64位除法而言,是否可以在不分支的情况下执行128位/64位除法?

assembly - 我如何知道汇编指令被命中的次数

c - 开发内核并在虚拟机中测试它们

assembly - 我可以从 EAX/RAX 获取 int 到 FPU 的寄存器(如 st0)吗?

c - 在 Cortex R5 上快速输出用户数据

android - 如何编译Busybox?

assembly - 如何在arm asm上编写PC相对寻址?

architecture - ARMv7中outer和inner的定义是什么?

assembly - 如果没有比较指令,不相等如何分支?