2017-09-26 63 views
-1

我想從用戶輸入的數字倒數,並希望顯示數字和0之間的所有整數。我的輸出我相信去然後它在1處進入無限循環。它似乎永遠不會變爲零。MIPS-彙編數量下降,但進入無限循環

我剛開始學習大會,所以如果這是一個糟糕的問題,我會提前道歉。

感謝

這裏是我的代碼:

.globl main 

.data 
    msg: .asciiz "Input a number: " 
    x: .word 1 

    .text 
main: 

    li $v0,4  # display the first message 
    la $a0, msg 
    syscall 

    li $v0, 5  # call for an input read, stores in $v0 
    syscall 

    move $t0, $v0 # move the input to a temporary register 
    lw $t1, x   # loads x into $t1 registers 

# Show Output 
doLoop: 
    sub $v0, $t0, $t1 # subtracts 1 from given input stores in $v0 

    move $s0, $v0 

    li $v0, 1  # Prepares to print integer 
    move $a0, $v0 
    syscall 

    bgt $a0, 0, doLoop 

    li $v0,10  # load the "exit" number into register $v0 
    syscall 
+1

谷歌「mips調試」,並扔在你使用的模擬器(MARS或SPIM?)。然後注意自己,寄存器中的值是如何演變的,以及爲什麼你的循環測試不起作用。 – Ped7g

+0

我正在使用MARS,謝謝! – C2H50H

回答

-1

這似乎做的伎倆對我來說,我一直搞砸了,我是把常量寄存器我。因此,我每次試圖打印包含一個1.

doLoop: 

sub  $t2, $t0, $t1 # subtracts 1 from given input stores in $v0 

li $v0, 1  
move $a0, $t2 # Places answer in $a0 
la $v0, 1 
syscall 

move $t0, $t2  
bgt $a0, 0, doLoop 

li $v0,10  # load the "exit" number into register $v0 
syscall 
+0

'la $ t3,1'的用途是什麼?你不需要三個臨時寄存器,你可以將主計數器值保存在單個寄存器中,並使用立即數進行減法(使用'addi')。而在你的回答中,'bgt'仍在測試'a0',這只是因爲'syscall'沒有修改它。 – Ped7g

+0

在什麼情況下系統調用會修改它?我也可以使用$ v0,1來代替另一個臨時嗎? – C2H50H

+0

它應該被記錄在某個地方,哪些寄存器被'syscall'破壞並保證被保存。這是系統調用調用約定的重​​要組成部分,就像函數調用調用約定一樣。 (請注意,約定取決於軟件,所以你需要一個特定於MARS'syscall' API/ABI的答案,這可能與Linux MIPS'syscall'不同。) –