【问题标题】:Difference between register indirect and base plus offset in MIPS addressing mode?MIPS寻址模式中寄存器间接和基数加偏移之间的区别?
【发布时间】:2011-11-16 23:35:51
【问题描述】:

间接注册base plus offset有什么区别,它如何影响你在MIPS架构上编写程序集的方式?我认为这意味着您只能在一条指令中引用该寄存器,而该寄存器必须指向更多指令?

【问题讨论】:

    标签: assembly architecture mips addressing-mode


    【解决方案1】:

    “注册间接”寻址意味着将被使用的地址 指令(称为“有效地址”)取自 寄存器,而不是直接在指令本身内编码 (这是“绝对”寻址)。 MIPS 对这两个都有跳转指令 寻址模式:

    j 0x1234
    

    表示“跳转到地址0x1234”(绝对寻址),而

    jr $ra
    

    表示“跳转到$ra寄存器中包含的地址”(寄存器间接 寻址)。

    “基址加偏移”寻址意味着基址取自 寄存器的内容,然后是偏移量(在指令中编码 本身)被添加。 MIPS 使用这种寻址模式进行加载和存储。为了 示例:

    lw $t0, 0($a0)
    lw $t1, 4($a0)
    

    ...如果$a0 包含0x1234,则$t0 将加载单词 at 地址0x1234(有效地址是寄存器的内容,加上 偏移量 0),并且$t1 将加载地址0x1238 处的字 (有效地址是寄存器的内容,加上偏移量4)。

    可以看到,当偏移量为0时,这相当于寄存器间接 寻址。

    【讨论】:

    • 那么,如果偏移量不是 0,那么“注册间接”中的等价物是什么?
    • 间接寄存器不太灵活,因为它的作用只有 base+offset 的一半。但是您可以自己添加偏移量,例如addiu $ra, $ra, 4 ; jr $ra.
    • 所以偏移量可以引用接近$ra但移动超过4位的内存?我只是想把这些概念记下来:) 谢谢!
    • 如果你在寄存器中有一些代码的地址,它可能是你想要调用的例程的地址,或者是你想要返回的一些代码的地址。无论哪种方式,虽然您可以向该地址添加偏移量,但这样做很少有用,这也许可以解释为什么jr 只提供寄存器间接寻址。访问数据是另一回事:希望在距给定基地址的固定小偏移处查找数据是很常见的。
    【解决方案2】:

    寄存器间接寻址方式只是偏移量为零时基址加偏移量寻址方式的一种特例。

    当您有一个包含多个数据项的结构并希望引用这些项时,使用基数加偏移寻址模式。基址寄存器指向结构的开头,偏移量用于提取特定项目。示例是加载虚拟方法的地址,其中基址寄存器指向虚拟方法表的基址,偏移量表示感兴趣的方法。另一个例子是引用函数在堆栈上的局部变量,其中基址寄存器指向函数的堆栈帧,偏移量表示感兴趣的特定变量。

    【讨论】:

    • 您能否提供一个相同指令的示例,但对于两种模式,在汇编中?
    • 基数加偏移量:sw $s0, 4($sp),间接寄存器:sw $s1, 0($sp)
    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多