定义输入整数是否除以 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