匯編語言實(shí)現(xiàn)打印楊輝三角
計(jì)算楊輝三角形的前n(n<=10)行,并顯示在屏幕上。要求計(jì)算及顯示
用子程序形式實(shí)現(xiàn)。其顯示格式為:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
CODE SEGMENT ASSUME CS:CODE,DS:CODE org 100h START: jmp begin message db 13,10,9,'Input N(N<=10): $' error db 13,10,9,'Data out of range!$' begin: push cs pop ds mov dx,offset message mov ah,9 int 21h call shur cmp bp,10 jbe goon mov dx,offset error mov ah,9 int 21h jmp exit goon: mov ax,0e0dh int 10h mov al,0ah int 10h push bp call yhsj exit: mov ah,0 int 16h mov ah,4ch int 21h shur proc push cx push bx xor bp,bp mov bx,10 mov cx,2 input: mov ah,0 ;鍵盤輸入數(shù)據(jù) int 16h cmp al,0dh ;以回車結(jié)束輸入 jz ok cmp al,'0' ;只允許輸入0~9 jb input cmp al,'9' ja input mov ah,0eh ;顯示有效輸入 int 10h sub al,30h ;化ASCII為HEX cbw ;字節(jié)擴(kuò)展為字 xchg ax,bp mul bx ;擴(kuò)大10倍 add bp,ax ;加一位 loop input ok:nop ;數(shù)值結(jié)果在BP中 ;恢復(fù)用到的寄存器 pop bx pop cx ret shur endp ; 輸出楊輝三角的函數(shù),接受一個(gè)棧上的參數(shù)N ; 輸出N階楊輝三角 yhsj: mov bp, sp mov ax, [bp+2] ; 保存N到ax shr ax, 1 ; N = N / 2 push ax mov ax, [bp+2] ; 保存N到ax push ax call C; C(N, N/2)獲取最后一行中間的那個(gè)值,即最大值 call getdigit ; 計(jì)算該最大值的長(zhǎng)度,如252則返回3 mov cx, ax ; 保存最大長(zhǎng)度到cx,用于事后格式用 xor di, di ; 外層循環(huán)計(jì)數(shù)di,外層循環(huán)輸出每一行 jmp cp1 up1: inc di; 更新di cp1: cmp di, [bp+2] ; 測(cè)試循環(huán)條件,循環(huán)N次 jg done1 mov ax, [bp+2] ; 以下3句計(jì)算行前空格數(shù) = (N-i)*cl,cl是最大長(zhǎng)度 sub ax, di mul cl call showspace ; 輸出行前空格 xor si, si ; 內(nèi)存循環(huán)計(jì)數(shù)si,內(nèi)層循環(huán)輸出一行中的每個(gè)數(shù) jmp cp2 up2: inc si; 更新di cp2: cmp si, di ; 測(cè)試循環(huán)條件,循環(huán)di次 jg done2 push si push di call C; 獲取該行的位于si位置的組合數(shù),調(diào)用C(di, si) push ax ; 保存該組合數(shù) call show ; 輸出該數(shù) mov ax, cx ;┒以下3句輸出數(shù)字間間隔空格,個(gè)數(shù) = N - 1 sub ax, 1 ;┃ call showspace ;┚ pop ax;┒ call getdigit ;┃獲取該組合數(shù)長(zhǎng)度 mov bx, ax ;┃ mov ax, cx ;┃ sub ax, bx ;┃計(jì)算需要填充的空格數(shù) = 最大長(zhǎng)度 - 該數(shù)長(zhǎng)度 + 1 add ax, 1 ;┃本來應(yīng)該先填充再輸出數(shù)字間空格,順序反過來是為了左對(duì)齊 call showspace ;┚以上打括號(hào)的2段反過來是正常的順序 jmp up2 ; 更新內(nèi)層循環(huán) done2: ; 內(nèi)層循環(huán)結(jié)束 mov ah, 2 ; 以下5句實(shí)現(xiàn)換行 mov dl, 13 int 21h mov dl, 10 int 21h jmp up1 ; 更新外層循環(huán) done1: ; 外層循環(huán)結(jié)束 ret 2 ; 釋放函數(shù)參數(shù)使用的??臻g ; 求組合數(shù)的遞歸函數(shù),接受棧上的2個(gè)參數(shù)n, m(n > m) ; 返回C(n, m),即n選m的個(gè)數(shù) ; 算法是: ; { C(n, m) = 1 (n < m 或 m = 0) ; { C(n, m) = C(n-1, m-1) + C(n-1, m) (n > m) ; 即某位置組合數(shù)等于上一行左右兩數(shù)之和 C: push bp mov bp, sp sub sp, 2 ; 預(yù)留一個(gè)存儲(chǔ)位置 mov bx, [bp+6] ; 保存m到bx cmp bx, [bp+4] ; 如果m > n 返回1 jz L1 cmp bx, 0 ; 如果m = 0 返回1 jz L1 mov ax, [bp+4] ; 保存n到ax dec ax; ax = ax - 1 dec bx; bx = bx - 1 push bx push ax call C; 返回上一行左邊的那個(gè)數(shù) mov [bp-2], ax ; 保存左肩膀上的數(shù) mov ax, [bp+4] ; 以下5句同理,返回上一行右肩膀上的數(shù) dec ax push [bp+6] push ax call C add ax, [bp-2] ; 和左肩膀上的數(shù)相加得出該組合數(shù) jmp L2 L1: mov ax, 1 L2: mov sp, bp pop bp ret 4 ; ax返回組合數(shù) ; 遞歸以10進(jìn)制輸出ax ; 方法很簡(jiǎn)單,就是求出余數(shù),然后ax = ax / 10 ; ax = 0時(shí)退出,開始逆序輸出求出的各位余數(shù) show: mov bx, 10 cmp ax, 0 jz ok1 div bl push ax and ax, 00ffh call show pop dx mov dl, dh or dl, 30h mov ah, 2 int 21h ok1: ret ; 獲取一個(gè)數(shù)的長(zhǎng)度,ax為參數(shù),如果ax = 252則返回3 ; ax里是返回值 getdigit: mov bx, 10 xor dx, dx next: cmp ax, 0 jle ok2 div bl and ax, 0ffh inc dx jmp next ok2: mov ax, dx ret ; 輸出ax個(gè)空格,參數(shù)ax,無返回值 showspace: mov bx, ax mov ah, 2 mov dl, ' ' nexts: cmp bx, 0 jle dones int 21h dec bx jmp nexts dones: ret CODE ENDS END START
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
匯編指令-狀態(tài)寄存器、cmp、test、jz等指令詳細(xì)說明
這篇文章主要介紹了匯編指令-狀態(tài)寄存器、cmp、test、jz等指令詳細(xì)說明,需要的朋友可以參考下2020-01-01匯編中的數(shù)組分配和指針的實(shí)現(xiàn)代碼
這篇文章主要介紹了匯編中的數(shù)組分配和指針的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01匯編語言系列之匯編實(shí)現(xiàn)簡(jiǎn)單數(shù)學(xué)運(yùn)算
這篇文章主要介紹了匯編語言系列之匯編實(shí)現(xiàn)簡(jiǎn)單數(shù)學(xué)運(yùn)算的思路詳解,本文給大家列出了兩種算術(shù)運(yùn)算的代碼,設(shè)計(jì)思路給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11使用匯編語言實(shí)現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法
這篇文章主要介紹了使用匯編語言實(shí)現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01匯編 函數(shù)調(diào)用的實(shí)現(xiàn)
這篇文章主要介紹了匯編 函數(shù)調(diào)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02