簡體   English   中英

MIPS程序集:立即值太大,導致字段錯誤

[英]MIPS Assembly: Immediate value is too large for field error

嘗試存儲用戶輸入的字符串時,對於項目的一部分,我在簡單地加載文件時會在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位嗎? 關於為什么的任何解釋將不勝感激。 再次感謝!

我在您的代碼中看到了幾個問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM