[英]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.