【问题标题】:MIPS Pseudo istructions, replacementsMIPS 伪指令,替换
【发布时间】:2013-07-10 10:20:45
【问题描述】:

在研究它是什么之后,我发现它只是替换获得相同结果的方式。如果我错了,请纠正我。

示例:

move $s0, $t1

可以替换为:

add $s0, $zero, $t1 

问题:

lwlaswbne如何替换?

【问题讨论】:

    标签: mips pseudocode


    【解决方案1】:

    是的,move 指令可以替换为add 指令。

    关于伪指令的一些背景知识:MIPS 是一种 RISC(精简指令集计算机)架构,这意味着您可以使用的指令数量相对较少。这种简单性会带来更快的性能,但代价是更复杂的操作需要多条指令。伪指令是代表一种或多种其他更复杂操作的“假”指令。

    关于你的问题:

    lwswbne 不是伪指令。它们都由一条 MIPS 汇编指令执行。

    la,或加载地址,是一条伪指令。 la 可以分解为 lui 指令和 ori 指令。在 32 位 MIPS 架构上,每条指令以及每个寄存器的大小都是 32 位。所以要存储一个 32 位的地址,必须先取最高位(高位)的 16 位,然后再取最低位(低位)的 16 位。

    lui 或 Load Upper Immediate 获取立即数字段并将其左移 16 次并将其存储在临时汇编器寄存器中。 ori 指令对临时寄存器和立即值执行按位或运算,并将完整地址存储在 la 指令中指定的初始寄存器中。

    编辑:例如,要获取字符串的地址,您可以在函数中使用以下代码段:

        la  $a0, msg    # pseudo-instruction to load the address of the label str
    

    您还可以在别处定义msg

    .data               
    msg: .asciiz "This is a string"
    

    在 SPIM 中运行此示例后,la 指令被翻译成:

        lui $1, 4097 [msg]
        ori $4, $1, 0 [msg]
    

    $1 是临时汇编器寄存器,$4 是寄存器 a0,它是传递给初始 la 指令的参数。

    参考文献:MIPS Instruction Set 以及仅仅做了很多 MIPS。尝试在QTSPIM 之类的模拟器中运行每条指令,看看会得到什么。

    另请参阅:lui 4097load address

    【讨论】:

    • 你能举一个la替换的实际例子吗? mgs: .word 1 lui $t1, mgs ori $t1, $t1, mgs am i right?
    • @Tony 为了清楚起见,我添加了一个示例。
    • 无论它的字符串、数字还是数组,它总是有 4097 bcuz 这个值等于 16 位移位?
    • lui 指令没有被翻译成lui $1, 4097 [msg]。它被转换为lui $1,xxx,其中xxx 是消息地址的高16 位的值,在链接时确定。您似乎误解了您在评论中提到的答案之一。另外 4097 not 等于 16 位移位,乘以 64k 将等效于 16 位移位。
    • @markgz 你是对的,它不会一直被翻译成lui $1, 4097[msg],但这就是我在 SPIM 中运行示例时得到的。我编辑了我的帖子以澄清这一点。
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多