我试图将一个字符存储到空格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不工作?
答案 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
伪指令(或addi
或ori
)。
TL; DR:您正在使用内存加载指令来加载立即数。不要忽视模拟器给你的信息。