2014-04-22 55 views
0

我遇到了MIPS汇编代码问题。 它显示了li $ t4,$ zero行(实际代码的第4行)中的语法错误。 你能帮我解决吗?尝试分配变量时MIPS程序集解析错误

.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.我知道可能会有更多的代码问题,我只开始调试...

回答

1

li的用途是l oad 中药。 $zero是一个注册,而不是立即。你要找的可能是move $t4,$zero

你的代码还有其他类似的问题。例如addiu $sp, $sp, $t4(这似乎是不必要的,因为你应该把$t4置零)。

+0

谢谢迈克尔和杰斯特! Michael,$ t4可能会在SETSTACK中更改,所以根据情况我可以在SETSTACK中添加0或其他值。 – mashaned

1

$zero是一个注册,你不能使用li这是load immediate。使用li $t4, 0move $t4, $zero假指令。

相关问题