MIPS32 SPIM:读取 int 然后打印



我无法理解为什么我在第 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为单位(。如果您需要打印输入的字符串的长度,则需要自己计算,方法是计算字节数直到终止零。

最新更新