有人可以解释以下加载和存储指令作为ARM ISA的一部分吗?

时间:2013-01-20 23:23:10

标签: assembly arm

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

加载说明:

ldrsb
ldrb
ldrsh
ldrh
ldr

存储说明:

strb
strh
str

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

2 个答案:

答案 0 :(得分:8)

当谈论ARM时,“字”是32位,“半字”是16位,“字节”是8位。如果您阅读了ARM体系结构参考手册中的指令集文档(如果您不知道要获取哪一个,请获取ARMv5的文档,infocenter.arm.com),您将看到ldrb将字节加载到低8位的目标寄存器将高24位填充为零。 ldrsb将使用零标记扩展而不是pad。半字也是如此。

如果你有这样的代码:

char a,b,c;
...
c = a+b;
if(c<0)
{
}

当你需要执行此添加时,a或b或两者都在内存中然后你理想地想要做一个符号扩展(假设你告诉你的编译器char已签名)加载以保存指令符号扩展寄存器,以便您可以执行数学运算并将标志设置为正确比较。

来自ARM ARM。

LDRSB(加载寄存器有符号字节)从存储器加载一个字节,对其进行符号扩展以形成32位字,并将结果写入通用寄存器。

LDRB(加载寄存器字节)从存储器加载一个字节,对其进行零扩展以形成一个32位字,并将结果写入通用寄存器。

答案 1 :(得分:4)

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

  

加载指令从内存中获取单个值并将其写入a   通用登记册。存储指令从a读取值   通用寄存器并将其存储在存储器中。

     

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 pre-index addressing'

'type'是可选的,如上表所述,您可以选择使用半字,字节以及有符号或无符号字节或半字。您还可以选择加载或存储多个寄存器。

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

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

在上面的例子中,'Rt'是你从内存加载的值将被登陆的寄存器(或者包含你存储在内存中的值的寄存器,如果你正在执行一个商店)。 'Rn'是包含地址的寄存器。方括号用于告诉处理器我们正在使用包含地址的寄存器,我们正在使用指针。如果您想要从基址寄存器中偏移特定量,则可以使用可选的偏移量(这在各种有用的应用程序中都很方便,但我不会在这里介绍它们。)

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