MIPS-如何将字符值存储到空间中
我试图将一个字符存储到空间x中MIPS-如何将字符值存储到空间中,mips,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
.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-one不能工作?根据您使用的系统调用判断,您正在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:您尝试使用内存加载指令加载立即数常量。不要忽略模拟器提供给您的信息。根据您正在使用的系统调用判断,您正在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:您尝试使用内存加载指令加载立即数常量。不要忽略模拟器给你的信息