我无法理解为什么我在第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
答案 0 :(得分:0)
如果您查阅过指令集引用,您会看到sw
需要一个内存操作数。因此,从纯粹的语法角度来看sw $v0, ($t0)
是正确的,但它不会做你想要的,这只是在寄存器之间传递。可以使用move
伪指令完成此操作,如下所示:move $t0, $v0
。这可能会由汇编程序翻译成addu $t0, $v0, $0
,如果你这么倾向,你当然可以自己写出来。同样,要将其转移到$a0
,您应该使用其他move
而不是la
。
您还使用read_string
系统调用错误。首先,您应该在执行syscall
之前加载参数,$a0
应该是$a1
中缓冲区的地址,其长度为{{1}}。如果您需要打印输入字符串的长度,您需要自己计算,通过计算字节直到终止零。