我在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
我对第二个简短答案的回答是:“返回数组中所有元素的总和”
[如果有人可以帮助我弄清楚我做错了什么,或者如果它被标记为错了,我将非常感谢。谢谢!
[第一部分:ori
采用零扩展的16位立即数(类似于其他按位布尔指令)。其他MIPS指令,包括addiu
,会将其16位立即数符号扩展为32位,因此0xFFFFFFFF
is可为这些指令编码。
[ori $t1, $t1, -1
不能编码为单条机器指令,仅由MARS的汇编器支持为“扩展”伪指令,该伪指令在另一个寄存器中实现该常量,然后将其与or
一起使用。 (例如addiu $at, $zero, -1
/ or $t1, $t1, $at
)。
您可以在一条真实的机器指令中完成此操作(并且没有任何输入依赖性):addiu $t1, $zero, -1
问题的第二部分实际上是一个单独的问题;其答案完全独立于ori
的立即数。