因此,我是MIPS的新手,我想实现简单的模算术函数。我看不到为什么程序没有根据代码中的跳转语句跳转。任何帮助将不胜感激。
.data
text_enquiry : .asciiz "Enter operation code (1-add, 2-subtract, 3-multiply, 4-exponentiation, 5-inversion, 6-exit): "
text_a : .asciiz "Enter a: "
text_b : .asciiz "Enter b: "
text_m : .asciiz "Enter m: "
text_result : .asciiz "Result = "
new_line : .asciiz "\n"
.text
main:
## t0 = code, t1 = a, t2 = b, t3 = m
#print operation message
la $a0, text_enquiry
li $v0, 4
syscall
#read code
li $v0, 5
syscall
move $t0, $v0
#if code == 6
beq $t0, 6, exit
j rest
exit:
li $v0, 10
syscall
#else, continue procedure
#print 'a, b, m' messages and read them
rest:
la $a1, text_a
li $v0, 4
syscall
li $v0, 5
syscall
move $t1, $v0
la $a1, text_b
li $v0, 4
syscall
li $v0, 5
syscall
move $t2, $v0
la $a1, text_m
li $v0, 4
syscall
li $v0, 5
syscall
move $t3, $v0
j mod
## t0 = code, t1 = a, t2 = b, t3 = m, t4 = un-modded result, t5 = modded result, t6 =
mod:
beq $t0, 1, func_add
beq $t0, 2, func_sub
beq $t0, 3, func_mul
# beq $t0, 4, func_exp
func_add:
add $t4, $t1, $t2
div $t4, $t3
mfhi $t5
#print accordingly
la $a3, text_result
li $v0, 4
syscall
move $a3, $t5
li $v0, 1
syscall
la $a3, new_line
li $v0, 4
syscall
j main
func_sub:
sub $t4, $t1, $t2
div $t4, $t3
mfhi $t5
#print accordingly
la $a3, text_result
li $v0, 4
syscall
move $a3, $t5
li $v0, 1
syscall
j main
func_mul:
mult $t1, $t2
mflo $t4
div $t4, $t3
mfhi $t5
#print accordingly
la $a3, text_result
li $v0, 4
syscall
move $a3, $t5
li $v0, 1
syscall
j main
如您所见,该代码在代码为“ 6”时可以正常工作,但不适用于任何其他代码值。
答案 0 :(得分:2)
我看不到为什么程序没有根据代码中的跳转语句跳转。任何帮助将不胜感激。
您的程序 正在根据输入内容跳转。
您看不到的是它的真正作用,以及为什么进一步的文本输出失败的原因,您也看不到,因为您甚至都没有看(在调试器中,单步执行每条指令)。 / p>
请看一下,您会清楚地看到,例如对于输入“ 3”,代码将在标签rest:
之后到达指令,因此分支是正确的。
稍后该代码未达到您的期望,因为它没有打印其他帮助程序提示,因为它使用错误的参数调用了syscall
(代码将a1
设置为字符串地址, a0
中的一个,并且在a0
中仍然是原始的操作提示地址),但是它按计划执行。
通常仅通过检查输入/输出来决定汇编代码的正确性是非常不好的做法,因为您常常会“偶然”获得正确的输出,而代码已经在做一些与计划不同的事情,这可能以后会给您带来麻烦,如果您继续扩展代码,或者使用其他输入。
要确定汇编代码是否正确,您应该花大量时间在调试器上,验证不同的输入,并在编写代码时考虑代码的工作方式以及是否确实按计划/假定的方式工作-指导依据!
最终代码应仅由您确切知道它们在做什么,它们为什么是代码的一部分以及为什么将它们放置在它们所在位置的指令组成。如果在没有真正理解的情况下“意外”进行任何操作,则必须对其进行修复(通过了解其工作原理,或者通过以了解其工作方式的方式对其进行重写),即使输出是正确的,它仍然是错误的。