MIPS汇编:立即值对于字段错误而言太大

时间:2013-10-14 17:15:07

标签: string assembly storage mips spim

当尝试存储用户的输入字符串时,对于项目的一部分,当我只是加载文件时,我在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位?任何解释为什么会受到赞赏。再次感谢!

1 个答案:

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