在浏览处理器架构的一些数据表时,我看到了术语,短寻址模式和长寻址模式
谁能给我这些术语的一般概念(不需要特定于处理器!)
/renjith_g
在浏览处理器架构的一些数据表时,我看到了术语,短寻址模式和长寻址模式
谁能给我这些术语的一般概念(不需要特定于处理器!)
/renjith_g
我将给出一个示例 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 位地址。