zoukankan      html  css  js  c++  java
  • 汇编语言实现阶乘

    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等在汇编中就是各种跳转

  • 相关阅读:
    Svn如何使用,有什么作用?
    Unity脚本基础Day02
    unity设计模式-----责任链模式
    LitJson ---json的创建和解析
    Mesh编程——三角形,多边形,正方体,园形,圆环
    unity基础逻辑题
    unity——UI拖拽实现拼图
    unity:倒计时
    UGUI Toggle的监听事件绑定
    UnityGUI系统之InputField
  • 原文地址:https://www.cnblogs.com/Peter2014/p/12732795.html
Copyright © 2011-2022 走看看