Assembly Don';我不明白为什么MIPS汇编问题不正确
在一次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
.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我也没有看到:(感谢您的回答并帮助清理我的问题!非常感谢您的回答!如果我理解正确的话