簡體   English   中英

MIPS32 SPIM:讀取 int 然后打印它

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

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