4

我刚刚开始学习 ARM,但我无法理解加载和存储指令的确切作用。

加载说明:

ldrsb
ldrb
ldrsh
ldrh
ldr

店铺说明:

strb
strh
str

“加载半字”有符号或无符号是什么意思?还是“加载字节”有符号或无符号?有符号和无符号之间有什么区别,在哪些特定应用程序中某些加载/存储指令可以实际使用?总而言之,我正在寻找对这些指令作用的直观理解,因为我仍然对它们的工作方式和目的感到困惑。

4

2 回答 2

12

在谈论 ARM 时,“字”是 32 位,“半字”是 16 位,“字节”是 8 位。如果您阅读 ARM Architectural Reference Manual 中的指令集文档(如果您不知道要获取哪一个,只需获取 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 位字,并将结果写入通用寄存器。

于 2013-01-20T23:51:14.077 回答
7

ARM 是一种 RISC(精简指令集计算)架构,这意味着必须使用您所指的指令、加载和存储指令将内存移入和移出寄存器。

加载指令从内存中获取单个值并将其写入通用寄存器。存储指令从通用寄存器中读取一个值并将其存储到内存中。

Most Often Used Load/Store Instructions

Loads            Stores      Size and Type
LDR              STR         Word (32 bits)
LDRB             STRB        Byte (8 bits)
LDRH             STRH        Halfword (16 bits)
LDRSB                        Signed byte
LDRSH                        Signed halfword
LDM              STM         Multiple words

(取自 ARM 汇编语言 - William Hohl)

加载和存储指令(通常)采用以下形式:

LDR | STR {type}{cond}    Rt, [Rn {, #offset}]

(虽然根据您希望使用的寻址模式的类型存在一些差异,但我不会在这里讨论,如果您想了解更多的寻址模式,您应该查看'ARM post-index and前索引寻址'

“类型”是可选的,如上表所述,您可以在其中选择使用半字、字节以及有符号或无符号字节或半字。您还可以选择加载或存储多个寄存器。

您还可以选择向指令 (cond) 添加条件代码,该指令用于设置当前程序状态寄存器 (CPSR)中保存的条件标志- 如果您想了解更多相关信息,可以搜索对于“ARM 条件执行”“条件代码”

在 ARM 中,您必须提供源/目标寄存器,并且还必须提供一个寄存器,该寄存器包含引用内存中某个位置的地址。这是因为 ARM 指令是固定长度(32 位),其中一些位需要用于它自己的指令,因此不可能将 32 位内存地址封装在 32 位 ARM 指令中。

在上面的示例中,“Rt”是您从内存中加载的值所在的寄存器(或包含您正在存储到内存中的值的寄存器,如果您正在执行存储)。“Rn”是包含地址的寄存器。方括号用于告诉处理器我们正在使用包含地址的寄存器,我们正在使用指针。如果您想从基址寄存器偏移特定数量,则存在可选偏移量(这在各种有用的应用程序中都很方便,但我不会在这里介绍它们)。

我希望这能让您对 ARM 的加载和存储指令的工作方式有所了解!:)

于 2014-02-13T20:16:01.803 回答