0

在 MIPS 汇编考试中,我有几个问题被标记为不正确,我想知道是否有人可以帮助我找出原因,因为我根本不明白为什么。

第一个问题:

将寄存器 $t1 的所有位设置为 1

我的回答是ori $t1, $t1, -1


另外两个问题给出了一些汇编代码,并要求“编写每个汇编程序执行的操作”。原始代码未注释。下面的评论是我的。

第一个简答题:

        .data
len:    .word   4
list:   .word   -4, 6, 7, -2, 1
        .text
main:   la $s0, list
        la $s1, len
        lw $t1, 0($s1)       // NOTE: 4, so loops over array
        add $t0, $zero, $zero
alpha:  lw $t2, 0($s0)
        blez $t2, beta
        add $t0, $t0, $t2
beta:   addi $t1, $t1, -1
        addi $s0, $s0, 4
        bgtz $t1, alpha
        add $v0, $zero, $t2   // NOTE: $t2 should be $t0?
        jr $ra

我对第一个简短回答问题的回答是:“将数组的所有正元素相加,并返回数组的最后一个元素”

我认为倒数第二行应该有 $t0 而不是 $t2 以便它返回它计算的总和而不是最后一个元素,但是我在考试期间向讲师询问了这个问题,他说将所有给定的代码视为正确的/有意即使我认为这是一个错误。


第二个简答题。同样,原始代码未注释。下面的评论是我的。

        .data
len:    .word   4
list:   .word   -4, 6, 7, -2, 1
        .text
main:   la $s0, list
        la $s1, len
        lw $t1, 0($s1)        // $t1 = len
        add $t4, $zero, $zero // $t4 = 0
alpha:  lw $t0, 0($s0)
        add $t4, $t4, $t0     // $t4 adds up all elements of array
        addi $t1, $t1, -1
        addi $s0, $s0, 4
beta:   blez $t1, alpha
        or $v0, $t4, $zero
        jr $ra

我对第二个简短回答问题的回答是:“返回数组中所有元素的总和”

如果有人可以帮助我弄清楚我做错了什么,或者它是否被标记为错误?

4

1 回答 1

2

第一部分:ori采用零扩展的 16 位立即数(与其他按位布尔指令一样)。其他 MIPS 指令,包括addiu将它们的 16 位立即数符号扩展为 32 位,因此对于这些指令10xFFFFFFFF 是可编码的。

ori $t1, $t1, -1不可编码为单个机器指令,仅由 MARS 的汇编器支持为“扩展”伪指令,将常量具体化到另一个寄存器中,然后将其与or. (例如addiu $at, $zero, -1/ or $t1, $t1, $at)。

您可以在一条真实的机器指令中执行此操作(并且没有任何输入依赖性):
addiu $t1, $zero, -1


脚注 1:我不确定为什么做出这个设计决定;这是任意的,RISC-V 选择不同(总是符号扩展)。但有关 MIPS 的更多信息,请参阅此内容。

andi对于高位中的全一当然很有用,例如将指针与p &= -16. MIPS 可以按位 NOT 使用nor,因此它不需要xoriwith-1是可编码的。 ori将所有高位设置1为可能比使用寄存器的低 16(而不是 15)位做某事有用。

它还允许lui / ori构造 32 位值,而不必像您必须为lui / addiu.


您问题的第二部分实际上是一个单独的问题;它的答案完全独立于立即数的工作方式ori

于 2020-05-25T00:01:31.510 回答