我的MIPS汇编代码出现问题。 它在li $ t4,$ zero line(实际代码的第4行)中显示语法错误。 你能帮我解决一下吗?
.data
.globl funcall1
.globl funcall2
.text
funcall1:
lw $t1, 0($a0) # load the 1st argument - shows how many there are
addiu $t2, $t1, -1 #t2 stores how many args
addiu $t3, $t2, -4 #t3 stores how many args there will be apart from 4 main
li $t4, $zero
addiu $sp, $sp, -24 # make stack frame
bgezal $t3, SETSTACK
addiu $sp, $sp, $t4 # make stack frame
sw $ra, 16($sp) # save where to return
# 3:0xAAAA:0:12:0:7 format of FET
lw $v0, 4($a0) # load the op-comand or value into the return value
lw $s0, $a0 # save FET for future reference
jal EXPRESSION
bgezal $t3, ADDMOREARGS
lw $a0, $s1 # return the first value to a0
jal $t0
lw $ra, 16($sp) # restore $ra
addiu $sp, $sp, 24 # restore $sp
jr $ra # return
funcall2: # main function in file
# Arguments $a0 is address of input FET
jr $ra # return
SETSTACK:
addiu $sp, $sp, -24 # make stack
sw $ra, 16($sp) # save where to return
mul $t4, $t3, 4 # this is how many extra bytes wil be needed
div $t4, 8
bne $hi, 0, ADDFOUR # if size not divisible by 8, add 4.
mul $t4, $t4, -1
lw $ra, 16($sp) # restore $ra
addiu $sp,$sp,24 # restore $sp
jr $ra # return
ADDFOUR:
addiu $sp, $sp, -24 # make stack
sw $ra, 16($sp) # save where to return
addiu $t4, $t4, 4 # t4 += 4
lw $ra, 16($sp) # restore $ra
addiu $sp,$sp,24 # restore $sp
jr $ra # return
EXPRESSION:
addiu $sp, $sp, -24 # make stack
sw $ra, 16($sp) # save where to return
lw $t0, 4($s0) # save the operand
lw $s1, 12($s0) # free a0 for addmoreargs, save the first value in s1 as well
lw $a0, 12($s0) # save first value in a0
lw $a1, 20($s0) # second value
lw $a2, 28($s0) # third value
lw $a3, 32($s0) # fourth value
la $s9, 40($s0) # save the rest of address
lw $s8, 40($s0) # save the rest of data
la $s7, $a3 # save the next place for an argument
addiu $s7, $s7, -8
lw $ra, 16($sp) # restore $ra
addiu $sp,$sp,24 # restore $sp
jr $ra # return
ADDMOREARGS:
sw $s7, 4($s8)
lw $s8, 8($s8) # jump thorugh the data
addiu $t3, $t3, -1
bgezal $t3, ADDMOREARGS
P.S。我知道代码可能会有更多问题,我只是开始调试......
答案 0 :(得分:1)
$zero
是一个注册表,您可以将li
用于load immediate
。使用li $t4, 0
或move $t4, $zero
伪指令。
答案 1 :(得分:1)
li
的目的是 L oad I mmediates。 $zero
是一个注册,而不是直接注册。您正在寻找的内容可能是move $t4,$zero
。
您的代码中还存在其他类似问题。例如addiu $sp, $sp, $t4
(这似乎是不必要的,因为你可能会在$t4
中放零。)