MIPS 32位,汇编器:push and pop

时间:2018-07-17 22:44:56

标签: assembly push mips32

我的代码遇到麻烦,因为sw指令使用的寄存器类型错误,因此MARS不会对其进行汇编。

为什么我不能使用此行

sw $so, 0($sp)

sw中使用s类型寄存器有问题吗? 我想将$so的值保存在堆栈中,该如何处理?

完整代码:

.data   
.text
f1:
    li $s0, 30
    addi $sp, $sp, -4
    sw $so, 0($sp)
    jal f2
    lw $v2, 0($v1)
    add $sp, $zero, $zero
    addi $sp, $sp, -4
    add $sp, $zero, $zero
    j Exit
f2:
    addi $sp, $sp, -4
    sw $sp, 0($ra)
    jal f3
    lw $to, 0($vo)
    srl $t0, $to, 1
    add $to, $to, $to
    lw $ra, 0($sp)
    addi $sp, $sp, 4
    jr $ra
f3:
    addi $vo, $so, 1
    jr $ra
Exit: 
    result .asciiz "Value is "
    la $v2, result 
    syscall

编辑:

感谢您的回答,我得到了更正确的信息,现在我在新代码的第16行遇到了问题。 在将地址保存到堆栈上之前,应该怎么办,以免出现以下错误? 错误:

  

第16行:运行时异常位于0x00400028:无法直接写入文本段!0x00400010

代码:

.data
    result: .asciiz "Value is "
.text
f1:
    li $a0, 30          #n=30
    addi $sp, $sp, -4       #set sp back for save
    sw $a0, 0($sp)          #save a0 to stack
    jal f2              
    lw $a1, 0($v1)          
    add $sp, $zero, $zero
    addi $sp, $sp, -4
    add $sp, $zero, $zero
    j Exit
f2:
    addi $sp, $sp, -4
    sw $sp, 0($ra)
    jal f3
    lw $t0, 0($v0)          #
    srl $t0, $t0, 1
    add $t0, $t0, $t0
    lw $ra, 0($sp)
    addi $sp, $sp, 4
    jr $ra
f3:
    addi $v0, $a0, 1        #
    jr $ra
Exit: 
    li $v0, 4
    la $a2, result 
    syscall

1 个答案:

答案 0 :(得分:1)

sw $s0, 0($sp)

应在堆栈顶部写入$ S0