Assembly MIPS32 SPIM:读取int,然后打印它
我无法理解第20行中出现语法错误的原因,Assembly MIPS32 SPIM:读取int,然后打印它,assembly,mips32,spim,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,
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
如果您查阅了指令集参考,就会发现
sw
需要一个内存操作数。因此,从纯语法的角度来看,sw$v0,($t0)
是正确的,但它不会做您想要的事情,这只是在寄存器之间传输。这可以通过如下所示的move
伪指令完成:move$t0,$v0
。这可能会被汇编程序翻译成addu$t0,$v0,$0
,如果你愿意,你当然可以自己写出来。类似地,要将其转换为$a0
,您应该使用另一个move
,而不是la
您还错误地使用了read_string
系统调用。首先,在执行syscall
之前,应该加载参数,该参数应该是$a0
中的缓冲区地址和$a1
中的缓冲区长度。如果需要打印输入的字符串的长度,则需要自己计算长度,方法是计算字节数,直到结束为零