【问题标题】:MIPS assembly printing element of an array阵列的 MIPS 汇编打印元素
【发布时间】:2016-02-02 16:16:16
【问题描述】:
 .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,但似乎没有什么可以让我从我的数组中加载。

想法?

【问题讨论】:

    标签: assembly 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 包含字符串地址而不是字符串内容,则必须更改声明数据的方式以反映这一点。

    【讨论】:

      猜你喜欢
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多