寄存器间接和基数加偏移之间有什么区别,它如何影响您在 MIPS 架构上编写程序集的方式?我认为这意味着您只能在指令中引用寄存器,而该寄存器必须指向更多指令?
12492 次
2 回答
5
“寄存器间接”寻址意味着指令将使用的地址(称为“有效地址”)取自寄存器的内容,而不是直接在指令本身内编码(这是“绝对”寻址)。MIPS 对这两种寻址模式都有跳转指令:
j 0x1234
表示“跳转到地址0x1234
”(绝对寻址),而
jr $ra
意思是“跳转到寄存器中包含的地址$ra
”(寄存器间接寻址)。
“基址加偏移量”寻址意味着从寄存器的内容中获取基址,然后添加偏移量(在指令本身中编码)。MIPS 使用这种寻址模式进行加载和存储。例如:
lw $t0, 0($a0)
lw $t1, 4($a0)
...如果$a0
contains 0x1234
,$t0
则将加载地址处的字0x1234
(有效地址是寄存器的内容,加上偏移量 0),并将$t1
加载地址处的字0x1238
(有效地址是寄存器,加上偏移量 4)。
可以看到,当偏移量为0时,这相当于寄存器间接寻址。
于 2011-11-17T00:20:38.757 回答
3
寄存器间接寻址方式只是偏移量为零时基址加偏移量寻址方式的一种特殊情况。
当您有一个包含多个数据项的结构并希望引用这些项时,使用基数加偏移寻址模式。基址寄存器指向结构的开头,偏移量用于提取特定项目。示例是加载虚拟方法的地址,其中基址寄存器指向虚拟方法表的基址,偏移量表示感兴趣的方法。另一个例子是指函数在堆栈上的局部变量,其中基址寄存器指向函数的堆栈帧,偏移量表示感兴趣的特定变量。
于 2011-11-17T00:14:44.923 回答