MIPS汇编阵列的打印元素

时间:2016-02-02 16:16:17

标签: assembly mips

 .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但似乎没有让我从我的阵列加载。

思想?

1 个答案:

答案 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包含字符串地址而不是字符串内容,则必须更改声明数据以反映该数据的方式。