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

Bob*_*ohn 4 assembly arm

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

加载说明:

ldrsb
ldrb
ldrsh
ldrh
ldr
Run Code Online (Sandbox Code Playgroud)

店铺说明:

strb
strh
str
Run Code Online (Sandbox Code Playgroud)

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

old*_*mer 9

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

如果您有这样的代码:

char a,b,c;
...
c = a+b;
if(c<0)
{
}
Run Code Online (Sandbox Code Playgroud)

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

来自ARM ARM.

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

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

  • @SavannahMadison:符号扩展仅在将较窄的值转换为较宽的值时才有意义,就像“ldrsb”那样将字节转换为单词 - 您必须决定目标单词的高 24 位将包含什么内容。将宽值转换为窄值时,只有一种明智的选择:移动源字的低位并忽略高位,这就是“strb”的作用。 (2认同)

Dil*_*rth 5

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
Run Code Online (Sandbox Code Playgroud)

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

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

LDR | STR {type}{cond}    Rt, [Rn {, #offset}]
Run Code Online (Sandbox Code Playgroud)

(尽管根据您要使用的寻址模式的类型而有所不同,但是在这里我不会赘述,如果您想了解更多寻址模式,则应查看“ ARM后索引和索引前寻址”

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

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

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

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

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