程序定义输入整数是否除以2

时间:2015-06-06 18:22:06

标签: mips

我正在尝试在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

2 个答案:

答案 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