0

在尝试存储用户输入的字符串时,对于项目的一部分,当我简单地加载文件时,我在 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 位的?任何关于为什么的解释将不胜感激。再次感谢!

4

1 回答 1

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))。

于 2013-10-14T19:15:27.233 回答