代码之家  ›  专栏  ›  技术社区  ›  Toma

MIPS 32位,汇编程序:推送和弹出

  •  1
  • Toma  · 技术社区  · 6 年前

    我的代码有问题,Mars不会组装它,因为我使用了错误类型的寄存器 sw 说明。

    为什么我不能用这条线

    sw $so, 0($sp)
    

    使用S型寄存器有什么问题吗 短波 ? 我想保存 $so 在Stack上,我该怎么做?

    完整代码:

    .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:无法直接写入文本段!0x004000010号

    代码:

    .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 回复  |  直到 6 年前
        1
  •  1
  •   Mike    6 年前
    sw $s0, 0($sp)
    

    应该在你的堆栈上写$S0