我正在尝试在QtSpim上创建一个程序,它不断地将新整数作为输入(通过控制台),然后仅在它们是偶数时才在控制台上打印它们。我将输入5设置为退出案例。程序按原样编译,当我按下运行按钮时似乎没有问题。问题是当我尝试输入输入数字时,因为控制台没有响应(我刚输入的数字甚至没有出现在屏幕上)。 这是我的代码,我想错误必须在读取输入数字的第一行,但我找不到它:
.text
.globl __start
__start:
li $v0,5
syscall
move $t0,$v0
add $t1,$t0,$zero
addi $t2,$zero,5
LOOP: div $t0,$t0,2
bne $t0,$zero,LOOP
mfhi $t3
bne $t3,$zero,REPEAT
li $v0,1
move $a0,$t3
syscall
REPEAT:bne $t1,$t2,__start
li $v0,10
syscall
.data
答案 0 :(得分:0)
检查偶数的方法不正确。每当你输入一个数字> = 1时,你最终会在循环的最后一次迭代中将1除以2。当然1 MOD 2是1,所以你的代码总是认为数字是奇数。
单次除以2足以确定该值是奇数还是偶数。但是AND
操作会更有效:
andi $t0,$t0,1 # if the least significant bit is set, the number is odd
bne $t0,$zero,REPEAT
进行更改后,您可能还需要更改打印代码,因为要打印的值不再是$t3
。
答案 1 :(得分:0)
可以使用按位and
。
每个奇数都会设置最后一位,这会使number & 1
等于1
。
.text
.globl __start
__start:
li $t0, 5
loop:
move $v0, $t0 # set $v0 to 5: read integer
syscall # read in the number
andi $t1, $v0, 1 # check if it's divisible by 2
bnez $t1, check # if no, jump to a check for 5
move $a0, $v0 # if yes, print it
li $v0, 1 # set $v0 to 1: print integer
syscall # do the printing
j loop # continue
check:
bne $t0, $v0, loop # if the integer read is not equal to 5, run again
li $v0, 10
syscall # exit