当尝试存储用户的输入字符串时,对于项目的一部分,当我只是加载文件时,我在spim中收到以下错误:
立即值对于字段来说太大:[0x0040009c]
以下是我的代码:
.globl main
.data
prompt: .asciiz "0: exit, 1: enter string, 2: convert, 3: mean, 4: median, 5: display string, 6: display array: " #94 char long
enter: .asciiz "Enter string: "
.text
main:
display: addi $v0, $v0, 4 #print prompt
lui $a0, 0x1000 #grabbing prompt
syscall
addi $v0, $0, 5 #get integer
syscall
beq $v0, 0, rtn #if user type's 0, exit program
nor $0, $0, $0 #nop
beq $v0, 1, enterString #if user type's 1, enterString
nor $0, $0, $0 #nop
enterString:
addi $v0, $0, 4 #printing string
lui $a0, 0x1000 #grabbing prompt
addi $a0, $a0, 95 #grabbing enter
syscall
addi $v0, $0, 8 #grabbing input
sw $a0, 0x10000100 #storing inpuit - this specific address is a requirement
syscall
rtn: jr $ra
现在,当我运行这个时,我得到了上面提到的错误。但是,我不太清楚为什么。这可能是由于字符串是32位?任何解释为什么会受到赞赏。再次感谢!
答案 0 :(得分:1)
我在您的代码中看到了一些问题:
这比94个字符更长:
prompt: .asciiz "0: exit, 1: enter string, 2: convert, 3: mean, 4: median, 5: display string, 6: display array: " #94 char long
即使你删除了那些额外的空格,我仍然会计算95个字符。
不要假设寄存器以某个值开始:
addi $v0, $v0, 4 #print prompt
这应该是addi $v0, $zero, 4
。
这应该是0x1001
,因为数据部分从0x10010000开始:
lui $a0, 0x1000
同样适用于您尝试访问数据部分的所有其他地方。
我不知道SPIM是否将其转换为有效指令:
sw $a0, 0x10000100
如果没有,您应该先将地址加载到寄存器中(例如$a1
),然后通过该寄存器访问存储器(例如sw $a0, ($a1)
)。