[英]MIPS32 SPIM: Read int then print it
我無法理解為什么在第 20 行sw $v0, $t0
出現語法錯誤。 $v0
應該是前一次調用 read int 返回的整數,而$t0
是一個臨時寄存器。 謝謝!
.data
msg: .asciiz "Hello world.\n"
promptint: .asciiz "Type an int: "
promptstring: .asciiz "Type a string: "
.text
main:
li $v0, 4 #print "Hello world."
la $a0, msg
syscall
la $a0, promptint #prompt for int
syscall
li $v0, 5 #read int
syscall
sw $v0, $t0
li $v0, 1 #print int
la $a0, $t0
syscall
li $v0, 4
la $a0, promptstring #prompt for string
syscall
li $v0, 8 #read string and length of string buffer
syscall
sw $a0, $t1 #string
sw $a1, $t2 #length
li $v0, 4 #print string
la $a0, $t1
syscall
li $v0, 1
la $a0, $t2 #print length
syscall
j done
done:
li $v0, 10
syscall
如果您查閱過指令集參考資料,您就會看到sw
需要一個內存操作數。 因此,從純粹的語法角度來看sw $v0, ($t0)
是正確的,但它不會做你想要的,這只是在寄存器之間轉移。 這可以通過move
偽指令完成,如下所示: move $t0, $v0
。 這可能會被匯編器翻譯成addu $t0, $v0, $0
如果你願意,你當然可以自己寫出來。 同樣,要將其轉移到$a0
您應該使用另一個move
而不是la
。
您還使用了read_string
系統調用錯誤。 一方面,您應該在執行syscall
之前加載參數,它應該是$a0
緩沖區的地址和$a1
長度。 如果您需要打印輸入的字符串的長度,您需要自己計算它,通過計算字節數直到終止零。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.