定义输入整数是否除以 2 的程序
Program defining if an input integer is divided by 2
我正在尝试在 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
您检查偶数的方法不正确。每当您输入一个 >=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
.
中
事情可以用更简单的方式完成,使用按位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
我正在尝试在 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
您检查偶数的方法不正确。每当您输入一个 >=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
.
事情可以用更简单的方式完成,使用按位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