我无法理解为什么我在第 20 行收到语法错误,sw $v0, $t0
. $v0
应该是上一次调用读取 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
为单位(。如果您需要打印输入的字符串的长度,则需要自己计算,方法是计算字节数直到终止零。