2016-02-02 78 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包含字符串地址而不是字符串内容,你将不得不改变你声明数据的方式来反映它。