-1

我无法理解为什么在第 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
4

1 回答 1

0

如果您查阅过指令集参考,您会发现它sw需要一个内存操作数。因此,从纯粹的句法角度来看sw $v0, ($t0)是正确的,但它不会做你想要的,这只是在寄存器之间传输。这可以通过move伪指令来完成,如下所示move $t0, $v0:这可能会由汇编器翻译,addu $t0, $v0, $0如果您愿意,您当然可以自己写出来。同样,要将其转移到$a0您应该使用 anothermove而不是la.

你也是使用read_string系统调用错误。一方面,您应该在执行之前加载参数syscall,这应该是缓冲区的地址$a0和长度$a1。如果您需要打印输入的字符串的长度,您需要自己计算它,通过计算字节数直到终止零。

于 2014-04-09T21:30:29.250 回答