【问题标题】:What is the difference between short adressing mode and long addressing mode短寻址模式和长寻址模式有什么区别
【发布时间】:2010-07-12 15:14:19
【问题描述】:

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

谁能给我这些术语的大致概念(不需要特定于处理器!)

/renjith_g

【问题讨论】:

  • 哪种处理器架构?这样的事情是特定于处理器的。

标签: cpu-architecture addressing-mode


【解决方案1】:
  • 短寻址模式使用 相对地址,计算为(一些 寄存器 + 一些小的常数), 这通常允许小/少/快 指令,但只能寻址小范围的内存;
  • 长寻址模式 使用绝对地址,即 一般需要大/多/慢 指令,但可以访问任何内存。

我将给出一个示例 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 位地址。

【讨论】:

  • 我有一些想法。但是你能对上述两种寻址模式稍微具体一点吗? /renjith_g
  • @RenjithG 这些例子非常具体。鉴于您实际上并未说明 CPU,因此答案是完美的,无法改进。如果你在做 ASM,你应该能够把这个例子带到你关注的任何 CPU 上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-08
  • 2019-02-27
  • 2015-05-09
  • 2018-05-31
  • 1970-01-01
  • 2019-11-05
  • 2012-05-11
相关资源
最近更新 更多