Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly MIPS32 SPIM:读取int,然后打印它_Assembly_Mips32_Spim - Fatal编程技术网

Assembly MIPS32 SPIM:读取int,然后打印它

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,

我无法理解第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

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

您还错误地使用了
read_string
系统调用。首先,在执行
syscall
之前,应该加载参数,该参数应该是
$a0
中的缓冲区地址和
$a1
中的缓冲区长度。如果需要打印输入的字符串的长度,则需要自己计算长度,方法是计算字节数,直到结束为零