Assembly Don';我不明白为什么MIPS汇编问题不正确

Assembly Don';我不明白为什么MIPS汇编问题不正确,assembly,mips,immediate-operand,Assembly,Mips,Immediate Operand,在一次MIPS组装考试中,我有几个问题被标为不正确,我想知道是否有人能帮我找出原因,因为我根本不明白为什么 第一个问题: .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 a

在一次MIPS组装考试中,我有几个问题被标为不正确,我想知道是否有人能帮我找出原因,因为我根本不明白为什么

第一个问题:

        .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
将寄存器$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)        // $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
第一个简短回答问题:

        .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
我对第二个简短回答问题的回答是:“返回数组中所有元素的总和”


如果有人能帮我找出我做错了什么,或者它是否被标记错了?

第一部分:
ori
采用零扩展的16位立即数(就像其他按位布尔指令一样)。其他MIPS指令,包括
addiu
,符号将其16位立即数扩展为32位,因此
0xFFFFFFFF
可对这些指令进行编码1

ori$t1,$t1,-1
不可编码为单个机器指令
,只有MARS的汇编程序支持作为“扩展”伪指令,将常量具体化到另一个寄存器中,然后将其与
一起使用。(例如,
addiu$at,$zero,-1
/
或$t1,$t1$at

您可以在一条真正的机器指令中完成(并且没有任何输入依赖):
添加$t1,$0,-1


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

andi
对于高位中的所有指针都非常有用,例如,将指针与
p&=-16
对齐。MIPS不能使用
按位输入值,因此它不需要使用
-1
xori
进行编码<将所有高位设置为
1
的code>ori
可能不如使用寄存器的低位16(而不是15)位进行操作有用

它还允许
lui/ori
构造32位值,而不必偏移高半部来解释设置的位15(低半部的顶部),就像您必须为
lui/addiu
做的那样



你问题的第二部分实际上是一个单独的问题;它的答案完全独立于直接指令对
ori

的工作方式。第一部分:
ori
采用零扩展的16位直接指令(与其他按位布尔指令一样)。其他MIPS指令,包括
addiu
,符号将其16位立即数扩展为32位,因此
0xFFFFFFFF
可对这些指令进行编码1

ori$t1,$t1,-1
不可编码为单个机器指令
,只有MARS的汇编程序支持作为“扩展”伪指令,将常量具体化到另一个寄存器中,然后将其与
一起使用。(例如,
addiu$at,$zero,-1
/
或$t1,$t1$at

您可以在一条真正的机器指令中完成(并且没有任何输入依赖):
添加$t1,$0,-1


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

andi
对于高位中的所有指针都非常有用,例如,将指针与
p&=-16
对齐。MIPS不能使用
按位输入值,因此它不需要使用
-1
xori
进行编码<将所有高位设置为
1
的code>ori
可能不如使用寄存器的低位16(而不是15)位进行操作有用

它还允许
lui/ori
构造32位值,而不必偏移高半部来解释设置的位15(低半部的顶部),就像您必须为
lui/addiu
做的那样



你问题的第二部分实际上是一个单独的问题;它的答案完全独立于“立即”对
ori的作用方式

您的答案在我看来是正确的,但请注意,数组长度为
4
,因此最终的
1
没有实际处理。在第二个简短的回答问题中,分支是
blez
,而不是
bgtz
,因此实际上,对于长度为2或2以上的数组,它根本不会循环。(对于长度为0或1的数组,它会从数组的末尾运行。)@RaymondChen Oops我也没有看到:(感谢您的回答并帮助清理我的问题!您的回答在我看来是正确的,但请注意,数组长度为
4
,因此最终的
1
没有实际处理。因此,您的讲师可能会对这些问题给予零分,因为您编写了所有元素。在第二个简短回答问题中,branch是
blez
,而不是
bgtz
,因此它实际上对于长度为2或2以上的数组根本不会循环。(对于长度为0或1的数组,它从数组的末尾开始运行。)@RaymondChen Oops我也没有看到:(感谢您的回答并帮助清理我的问题!非常感谢您的回答!如果我理解正确的话