2015-06-06 46 views
0

我試圖在QtSpim上編寫一個程序,它不斷地將新的整數作爲輸入(通過控制檯),然後僅當它們是偶數時纔將它們打印在控制檯上。我將輸入5設置爲退出情況。該程序編譯,因爲它應該和當我按運行按鈕似乎沒有問題。問題是當我嘗試輸入輸入號碼時,因爲控制檯不響應(我輸入的號碼甚至沒有出現在屏幕上)。 這裏是我的代碼,我想象中的錯誤必須在輸入號碼讀取的第一線,但我不能找到它:定義輸入整數除以2的程序

 .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

你想用你的代碼實現什麼? – user35443

+0

@ user35443該程序應該不斷讀取新的整數輸入,並決定它是否被2分開。在這種情況下,整數被打印在控制檯上。它也應該不斷讀取新的輸入並重復該過程(打印 - 如果它除以2,否則 - 什麼也不做,只讀下一個輸入)。當給定的輸入是數字5​​(我隨機選擇它,因此不存在無限循環)時,程序停止。 – Konstantina

回答

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 
+0

非常感謝,但是當我在QtSpim上運行你的代碼時,我無法在控制檯輸入一個輸入號碼,這是我原來的問題。 – Konstantina

+0

@Konstantina問題必須在別的地方。我在MARS 4.5上測試了它,並且它完美地工作了 – user35443

+0

噢好吧...非常感謝您的麻煩! :) – Konstantina

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打印不再是。