2016-02-02 113 views
0
.globl main 
    .data 
    array: 
     .asciiz "a" 
     .align 5 
     .asciiz "b" 
     .align 5 
     .asciiz "c" 
    .text 
    main: 
    # Loads address of array into $a0 
    la $t0, array 
    # Loads a[0] 
    lw $a0, 0($t0) 
    # Sets to print string 
    li $v0, 4 
    #prints the string 
    syscall 

上面的MIPS彙編代碼給我的錯誤:運行時異常在0x00400010:地址超出範圍0x00000061當我嘗試加載到$ a0。我也試過在($ t0)旁邊使用32,但似乎沒有任何東西讓我從我的數組中加載。一個陣列的MIPS彙編打印元素

想法?

回答

1

lw發生異常似乎不太可能。這很可能發生在執行syscall時。

讓我們看看你的數據部分看起來像:

10010000: 61 00 00 00 00 00 .... 
10010010: 00 00 00 ... 
10010020: 62 00 00 ... 
... 

(上面的數字都是十六進制)。

你對la $t0, array所做的操作是將$t0設置爲數組中第一個字節的地址,即$t0 = 0x10010000
lw $a0, 0($t0)然後從該地址加載第一個字,即0x00000061。然後您傳遞0x00000061作爲要使用系統調用4打印的字符串的地址,這會導致異常。

我不清楚你想要做什麼。如果你想打印「a」,你應該使用la $a0, array。如果你想讓array包含字符串地址而不是字符串內容,你將不得不改變你聲明數據的方式來反映它。