MIPS32 SPIM:读取int然后打印它

时间:2014-04-09 20:37:55

标签: assembly mips32 spim

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

1 个答案:

答案 0 :(得分:0)

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

您还使用read_string系统调用错误。首先,您应该在执行syscall之前加载参数,$a0应该是$a1中缓冲区的地址,其长度为{{1}}。如果您需要打印输入字符串的长度,您需要自己计算,通过计算字节直到终止零。