MIPS - 如何将char值存储到空间中

时间:2018-04-08 03:51:52

标签: mips

我试图将一个字符存储到空格x

        .data
x:      .space  1
        .text
        .globl main
main:
    lb  $t0, '*'
    sb  $t0, x

    lb  $a0, x
    li  $v0, 11
    syscall

        jr  $ra

它显示"数据/堆栈中的错误地址" 但是当我使用int

时,它工作得很好
     .data
x:      .space  4
        .text
        .globl main
main:
    li  $t0, 6
    sw  $t0, x

    lw  $a0, x
    li  $v0, 1
    syscall

        jr  $ra

他们之间的区别是什么?为什么int one工作但char char不工作?

1 个答案:

答案 0 :(得分:0)

根据您正在使用的系统调用,您可以在SPIM或MARS等模拟器中运行它。模拟器向您展示了问题所在:

  

0x00400000处的运行时异常:地址超出范围0x0000002a

在代码窗口的地址0x00400000处,您可以看到lb $8,0x0000002a($0)

所以你试图从地址0x2a加载一个字节(0x2a恰好是'*'的ASCII码)。

的确,如果你在MIPS的指令集参考中查找LB,你会看到:

LB rt, offset(base)
Description: rt ← memory[base+offset]

显然,这不是加载常量值'*'所需的指令。为此,您应该使用li伪指令(或addiori)。

TL; DR:您正在使用内存加载指令来加载立即数。不要忽视模拟器给你的信息。