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

2021-07-31 20:45:08 字數 1040 閱讀 2063

最近在弄一門課程(組合語言)的複習,覺得這個部分的內容,對於回過頭來理解以往學習的高階語言還是很有幫助的。

【例題】

階乘函式,對於任乙個大於等於0的正整數n,其函式值定義為:fact(n)=1(當n = 0時) fact(n)=n*fact(n-1)  (當n> 0時)其演算法為:

(1)測試n=0嗎?是,則令fact(n)=1,返回;

(2)儲存n,並令n=n-1,呼叫自身求得fact(n-1);

(3)順序取出儲存的n值(後儲存的先取出);

(4)計算fact(n)=n*fact(n-1),並返回。

請編寫乙個計算n的階乘的遞迴子程式,並在主程式中呼叫該子程式計算6的階乘。n值存放在bx暫存器中。(n=6)

解析:

sseg    segment

sktop  db     20h dup (0)

sseg   ends

cseg    segment

assume  cs:cseg

fact   proc    near

and    bx,bx

jz      fact1

push    bx

dec     bx

call   fact

pop    bx

mul    bx

retfact1: mov     ax, 1

retfact  endp

main: mov   ax, sseg

mov    ds, ax

mov    sp, size sktop

mov    bx, 6

call    fact

cseg    ends

end main

【附:一文一圖】

組合語言 子程式

舉例 子程式呼叫指令call 格式為 call 子程式名 call相當於jmp 子程式名 相當於 標號 子程式執行完返回到call下一句的語句執行 在子程式中用ret 返回 子程式名proc屬性 far,near 子程式名 endp 如果主程式是被執行的第乙個程式,屬性應為far 主程式 let0 ...

組合語言 子程式呼叫

不是很常用的 子程式返回指令 說明 根據段內和段間 有無引數,具體分成4種情況 1 ret 無引數返回 2 ret n 有引數返回 n引數的作用 需要彈出call指令壓入堆疊的返回位址 3 段內返回 偏移位址ip出棧 ip ss sp sp sp 2 4 段間返回 偏移位址ip和段位址cs出棧 ip...

組合語言showStr測試子程式

2017.4.23 name showstr fuction 在指定的位置,用指定的顏色,顯示乙個用0結束的字串 test code 在螢幕的8行3列,用綠色顯示data段中的字串 eg init mov dh,8 8行 mov dl,3 3列 mov cl,2 字元屬性 2 黑底綠色無高亮無閃爍 ...