• 汇编语言实现阶乘


    java递归实现阶乘

      static int fact(int n) {
        if (n == 0) {
          return 1;
        }
        return fact(n - 1) * n;
      }
    
      public static void main(String[] args) {
        System.out.println(fact(5));
      }
    

    汇编实现阶乘

    # 开始递归函数调用
    addiu $sp, $0, 0x10010080       # 初始化栈地址
    
    # 压栈入参
    addiu $s0, $0, 5                # n=5
    sw $s0, 0($sp)                  # n=5 压栈
    addiu $sp, $sp, -4              # 栈指针-4
    
    jal FACT                        # 跳转fact函数(FACT只是标志位,并没有函数) 跳转地址:a1
    nop
    j END                           # 跳转END,结束
    nop
    
    FACT:                           # fact函数体
    
    # 压栈返回地址
    sw $ra, 0($sp)                  # 跳转地址压栈:a1 a2 a3 a4 a5 a6
    addiu $sp, $sp, -4              # 栈指针-4
    
    #读取入参
    lw $s0, 8($sp)                  # 读取入参 n=5 4 3 2 1 0
    
    #压栈返回值
    sw $0, 0($sp)                   # 返回值压栈(占位)0 0 0 0 0 0
    addiu $sp, $sp, -4              # 栈指针-4
    
    #递归base条件
    # if (n == 0) { return 1}       
    bne $s0, $0, RECURSION          # 如果5!=0则跳转RECURSION  4!=0 3!=0 2!=0 1!=0
    nop
    # 读取下返回地址
    lw $t1, 8($sp)                  # a6
    # 出栈:返回值,返回地址
    addiu $sp, $sp, 8               # 站指针+8
    # 压栈返回值
    addiu $s0, $zero, 1             # return 1
    sw $s0, 0($sp)                  # 栈 a6->1
    addiu $sp, $sp, -4              # 栈指针-4
    
    jr $t1                          # 跳转:a6
    nop
    
    RECURSION : # recursion
    # return fact(n-1) * n
    
    #压栈参数                         
    addiu $s1, $s0, -1              # 参数4 (n-1)  3 2 1 0
    sw $s1, 0($sp)                  # 参数压栈:4 3 2 1 0
    addiu $sp, $sp, -4              # 栈指针-4
    
    jal FACT                        # 跳转fact函数 跳转地址:a2 a3 a4 a5 a6
    nop
    
    # 现在的栈是什么样子的? 参数 | 返回地址 | 返回值 | 子函数的参数 | 子函数的返回值 | 当前SP
    # 当前参数
    lw $s0, 20($sp)                 # 加载参数:1 2 3 4 5
    # 子函数返回值
    lw $s1, 4($sp)                  # 返回值 1 1 2 6 24
    # 返回地址
    lw $t1, 16($sp)                 # 返回地址:a5 a4 a3 a2
    
    mult $s1, $s0                   # 1X1 1x2 2x3 6x4 24x5
    mflo $s2                        # 1x1=1 1x2=2 2x3=6 6x4=24 24x5=120
    
    # 出栈:
    addiu $sp, $sp, 16              # 栈指针+16
    
    # 返回值压栈                      
    sw $s2, 0($sp)                  # 栈a5->1 a4->2 a3->6 a2->24 a1->120
    addiu $sp, $sp, -4              # 栈指针-4
    
    jr $t1                          # 跳转:a5 a4 a3 a2 a1
    nop
    
    END:
    
    

    使用MARS模拟器编写

    汇编是完全面向过程的语言,是CPU指令的可读形式

    汇编从上往下顺序执行,高级语言中的流程控制语句如if,while等在汇编中就是各种跳转

  • 相关阅读:
    死锁
    Hibernate—01
    POI
    线程 Thread
    SSH页面整合_01
    cnblogs安家了
    漫画:天堂里没有程序员!
    我又愿中国青年都只是向上走,不必理会这冷笑和暗箭!!!!!!!!
    一位信息系统项目管理培训老师写的《论婚姻项目管理》值得看一下!
    程序员保持健康的方法和经验
  • 原文地址:https://www.cnblogs.com/Peter2014/p/12732795.html
Copyright © 2020-2023  润新知