.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处的运行时异常:当我尝试加载到$ a0时,地址超出范围0x00000061。我也试过在($ t0)旁边使用32但似乎没有让我从我的阵列加载。
思想?
答案 0 :(得分: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
包含字符串地址而不是字符串内容,则必须更改声明数据以反映该数据的方式。