使用 "push"而不使用 "pop"的 mips 代码

标签 c assembly mips

C 中的代码:

int recursive_power (int base, int power) 
{
    if (power <=0)
        return (-1);
    else    if (power ==1)
        return (base);
    else
        return (base*recursive_power (base, power-1)); } 

mips:

recursive_power:    addi $sp, $sp, -8   #Assign stack space
        sw $ra, 0($sp)  #Store current value of $ra
        sw $a1, 4($sp)  #Store current value of power
        slti $t0, $a1, 1    #if power<1, $t0==1, else $t0==0;
        beq $t0, $0, next   #power>0, continue ($t0==0)

        addi $v0, $0, -1    #power<=0, return -1
        j return2

    next:   addi $t1, $0, 1 #put ‘1’ in $t1
        beq $a1, $t1, return1   #if power==1, return(base)

        addi $a1, $a1, -1   #power=power-1
        jal recursive_power #call recursive_power (base,power-1)

        lw $ra, 0($sp)  #Restore original return address
        lw $a1, 4($sp)  #Restore original value of power
        mul $v0, $a0, $v0   #return value is $v0*base
        j return2

    return1:    addi $v0,$a0, 0 #$v0=base
    return2:    addi $sp, $sp, 8    #Restore stack
        jr $ra      #Return to caller address

将出现在这段代码中的“return1”设为“return2”是否正确,因为不会有“lw”表扬?使用堆栈-“推”是否也需要“弹出”?您可以帮助改进 mips 代码吗?

最佳答案

您将持久性有机污染物放置在错误的位置。每次进入函数时都会将两个寄存器压入堆栈,因此每次从函数返回时都应该弹出它们:

    jal recursive_power #call recursive_power (base,power-1)
    mul $v0, $a0, $v0   #return value is $v0*base
    j return2

return1:    addi $v0,$a0, 0 #$v0=base
return2:
    lw $ra, 0($sp)  #Restore original return address
    lw $a1, 4($sp)  #Restore original value of power
    addi $sp, $sp, 8    #Restore stack
    jr $ra      #Return to caller address

关于使用 "push"而不使用 "pop"的 mips 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33428470/

相关文章:

python - 在 Python 中应用 cdll 的处理程序问题

c++ - 图形驱动程序如何以编程方式从 CPU 到 GPU 进行通信?

来自 Ocaml 的汇编代码

c - 如何在没有main的情况下运行MIPS程序并从C程序调用MIPS程序

ARM、MIPS、x86 的 Android os.arch 输出?

交叉编译找不到lib

c++ - FORTRAN 中的 POINTER 关键字相当于 C/C++ 中的 POINTER 关键字

c - 为什么 `fseek(..., 0, SEEK_CUR)` 在 Windows 上失败?

C 无法编译 - 找不到体系结构 x86_64 的符号

linux - x86_64 机器的 GCC 内联汇编的汇编程序错误(at&t 语法)