匯編語言實現階乘


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等在匯編中就是各種跳轉


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM