2014-11-25 146 views
1
# Programming Project 2 
# Noah Heath 
# @02685972 

.data # Data declaration 
     # A+B -(C-D x E) 

string1: .asciiz "Please enter an integer from range 0 to 32768: " 
string2: .asciiz "Next integer: " 
string3: .asciiz "Invalid input. Start over. " 
userinput: .space 100 
var6: .asciiz "The result of A+B -(C-D x E) is: " 
.text 

main: 
    la $a0, string1 #load string one and print 
    li $v0, 4 
    syscall 

    la $a1, userinput 
    li $t1, 5 #set temporary variable to 5 
    li $t0, 0 #start of counter 

input: 
    beq $t0, $t1, exit 
    li $v0, 5 # read integer 
    syscall 
    blt $v0, $zero, input # if input is less than zero 
    bgt $v0, 32768, input # if input is greater than 32768 
    sw $v0, 0($a1) 
    addiu $a1, $a1, 4 

exit: 
    la $t3, userinput # stores base address of user input array into $t3 
    lw $t4, ($t3) # load first number 
    lw $t5, 4($t3) # load second number 
    lw $t6, 8($t3) # load third number 
    lw $t7, 12($t3) # load fourth number 
    lw $t8, 16($t3) # load fifth number 
    add $s1, $t4, $t5 # adds 1 and 2 into $t0 
    mult $t7, $t8 # multiplies 2 and 3 
    mflo $s2 # retrieves from register 
    sub $s3, $t6, $s2 # subtracts 7 from 6 
    sub $s4, $s1, $s3 # subtracts 1 from 3 
    move $a0, $s4 # moves result into a0 

    li $v0, 1 # instruction to print result 
    syscall # call operating system to perform operation 

    li $v0, 10 # exit instruction 
    syscall 

我一直想弄清楚我的代碼沒有讀取用戶整數和存儲的原因。我確定一切都是句法正確的。有人可以幫助我瞭解我是否使用了錯誤的寄存器?MIPS-讀取整數錯誤

QTSpim說異常發生在PC = 0x00400060。

然後繼續說store中的未對齊地址= 0x1001005b。

它接着在4增量(我假定的,因爲該陣列被編入索引的方式。

最終錯誤消息是 異常5 [在商店地址錯誤]發生,並且忽略

Exception 4 [Address error in inst/data fetch] occurred and ignored(repeats 4 times) 
+0

我沒有看到你的代碼,任何跳回'input'讀取另一個號碼的第一個存放後。如果有的話,你可能會有一個無限循環,因爲你似乎沒有增加'$ t0'。 – Michael 2014-11-25 14:17:09

+0

這些是我在程序中的東西,但回去並編輯它,我沒有把它們放回去。我的問題是,當我嘗試輸入第一個數字時,出現錯誤。 – 2014-11-25 14:21:01

+0

無論何時您詢問有關從工具/操作系統獲得的錯誤的問題,都需要在問題中包含確切的錯誤消息。 – Michael 2014-11-25 14:27:36

回答

2

有什麼不妥,要求用戶輸入的代碼。

我猜你的問題是,您要什麼存儲用戶在非對齊地址(即發出sw $v0, 0($a1)行)輸入。

您應該將userinput標籤前添加指令.align 2,如:

string3: .asciiz "Invalid input. Start over. " 
.align 2 
userinput: .space 100 
+0

謝謝!我還是MIPS的新手,由於時間限制,我們的指令現在有點急。你能向我解釋爲什麼解決了我的問題? – 2014-11-25 14:46:46

+0

@NoahHeath:它修復了您的問題,因爲在MIPS中**字**內存訪問必須是字對齊的。彙編程序僞指令'.align 2'確保示例中的下一個數據('userinput')在字邊界對齊。 – gusbro 2014-11-25 14:49:25

+0

啊,現在實際上有很多意義。謝謝一堆。 – 2014-11-25 14:58:10