組合語言實現階乘

2022-08-03 00:45:08 字數 2215 閱讀 3872

static int fact(int n) 

return fact(n - 1) * n;

} public static void main(string args)

# 開始遞迴函式呼叫

addiu $sp, $0, 0x10010080 # 初始化棧位址

# 壓棧入參

addiu $s0, $0, 5 # n=5

sw $s0, 0($sp) # n=5 壓棧

addiu $sp, $sp, -4 # 棧指標-4

nopj end # 跳轉end,結束

nopfact: # fact函式體

# 壓棧返回位址

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)

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

noprecursion : # 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

nop# 現在的棧是什麼樣子的? 引數 | 返回位址 | 返回值 | 子函式的引數 | 子函式的返回值 | 當前sp

# 當前引數

lw $s0, 20($sp) # 載入引數:1 2 3 4 5

# 子函式返回值

lw $s1, 4($sp) # 返回值 1 1 2 6 24

# 返回位址

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

nopend:

使用mars模擬器編寫

彙編是完全面向過程的語言,是cpu指令的可讀形式

彙編從上往下順序執行,高階語言中的流程控制語句如if,while等在彙編中就是各種跳轉

組合語言實現氣泡排序

氣泡排序 author jrh 2011.7.10 assume ds data data segment a dw 1,4,2,5,7,9,6,3 data ends code segment start mov ax,data mov ds,ax mov cx,8 dec cx lop1 pus...

組合語言 遞迴子程式實現階乘

最近在弄一門課程 組合語言 的複習,覺得這個部分的內容,對於回過頭來理解以往學習的高階語言還是很有幫助的。例題 階乘函式,對於任乙個大於等於0的正整數n,其函式值定義為 fact n 1 當n 0時 fact n n fact n 1 當n 0時 其演算法為 1 測試n 0嗎?是,則令fact n ...

MIPS組合語言實現選擇排序

mips組合語言實現排序演算法,其實並不難。只要你掌握了基本的指令語句,並且熟悉c或c 相關演算法,即可輕鬆寫出來。對於mips組合語言還不太熟悉的夥伴,可以參考下面這篇部落格 它的具體實現 如下 c include using namespace std int main num index nu...