短寻址模式和长寻址模式之间有什么区别

时间:2010-07-12 15:14:20

标签: cpu-architecture addressing-mode

在浏览处理器架构的一些数据表时,我看到了这些条款, 短寻址模式和长寻址模式

任何人都可以给我一般的术语概念(不需要特定处理器!)

/ renjith_g

1 个答案:

答案 0 :(得分:3)

  • 短寻址模式使用a 相对地址,计算为(一些 注册+一些小的常数), 通常允许小/少/快 说明,但只能处理小范围的内存;
  • 长寻址模式 使用绝对地址 通常需要大/多/慢 说明,但可以访问任何内存。

我将举例说明ARM代码,但这可能适用于(在一般意义上)许多其他处理器。

每条ARM指令(忽略Thumb)都是32位长,为了这个例子,我们假装ARM可以访问32位地址空间。

必须对每条指令进行解码,主要是将这32位分解为各种字段 - 其中一些必须用于存储指令的类型。

因此,希望您能够在一条指令中将任意地址加载到寄存器中:

MOV Rn, #AABBCCDD

不起作用 - 因为我们需要使用位来指定指令(MOV)和目标寄存器(Rn),所以我们没有32位来存储32位地址。

所以,如果我们想要寄存器中的某些地址,我们有几个选项:

<强> 1。使用PC相对

有一个伪操作,其工作原理如下:

ADR Rn, .label
...
.label

扩展到:

ADD Rn, PC, (.label - here)

如果.label在当前指令的大约4k范围内,我们可以从当前PC(程序计数器)加/减来获得该地址。这是一个相对的地址。

<强> 2。使用多条说明

您可以使用add或ors建立一个仲裁地址:

MOV Rn, #AA000000
ADD Rn, Rn, #00BB0000
ADD Rn, Rn, #0000CC00
ADD Rn, Rn, #000000DD

(实际上你可以更有效地做到这一点,但你明白了。)

第3。将绝对地址存储在已知的相对位置

如果您知道您想要的地址存储在附近,您可以从内存中加载它:

ADR Rn, .store
LDR Rn, [Rn]

.store
EQU #AABBCCDD

现在,其他处理器架构可能具有可变长度指令(例如x86),因此您可以选择是使用短相对寻址模式(例如,相对于PC还是其他寄存器),还是更长(可能)更慢的指令它包含整个32位地址。