匯編語言實現(xiàn)打印楊輝三角
更新時間:2020年02月05日 09:45:52 作者:dididu1515
這篇文章主要介紹了匯編語言實現(xiàn)打印楊輝三角,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
計算楊輝三角形的前n(n<=10)行,并顯示在屏幕上。要求計算及顯示
用子程序形式實現(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é)擴展為字
xchg ax,bp
mul bx ;擴大10倍
add bp,ax ;加一位
loop input
ok:nop ;數(shù)值結(jié)果在BP中
;恢復用到的寄存器
pop bx
pop cx
ret
shur endp
; 輸出楊輝三角的函數(shù),接受一個棧上的參數(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)獲取最后一行中間的那個值,即最大值
call getdigit ; 計算該最大值的長度,如252則返回3
mov cx, ax ; 保存最大長度到cx,用于事后格式用
xor di, di ; 外層循環(huán)計數(shù)di,外層循環(huán)輸出每一行
jmp cp1
up1:
inc di; 更新di
cp1:
cmp di, [bp+2] ; 測試循環(huán)條件,循環(huán)N次
jg done1
mov ax, [bp+2] ; 以下3句計算行前空格數(shù) = (N-i)*cl,cl是最大長度
sub ax, di
mul cl
call showspace ; 輸出行前空格
xor si, si ; 內(nèi)存循環(huán)計數(shù)si,內(nèi)層循環(huán)輸出一行中的每個數(shù)
jmp cp2
up2:
inc si; 更新di
cp2:
cmp si, di ; 測試循環(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ù)字間間隔空格,個數(shù) = N - 1
sub ax, 1 ;┃
call showspace ;┚
pop ax;┒
call getdigit ;┃獲取該組合數(shù)長度
mov bx, ax ;┃
mov ax, cx ;┃
sub ax, bx ;┃計算需要填充的空格數(shù) = 最大長度 - 該數(shù)長度 + 1
add ax, 1 ;┃本來應該先填充再輸出數(shù)字間空格,順序反過來是為了左對齊
call showspace ;┚以上打括號的2段反過來是正常的順序
jmp up2 ; 更新內(nèi)層循環(huán)
done2: ; 內(nèi)層循環(huán)結(jié)束
mov ah, 2 ; 以下5句實現(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個參數(shù)n, m(n > m)
; 返回C(n, m),即n選m的個數(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 ; 預留一個存儲位置
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; 返回上一行左邊的那個數(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進制輸出ax
; 方法很簡單,就是求出余數(shù),然后ax = ax / 10
; ax = 0時退出,開始逆序輸出求出的各位余數(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
; 獲取一個數(shù)的長度,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個空格,參數(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
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
UEFI開發(fā)實戰(zhàn)SlimBootloader中調(diào)用FSP
這篇文章主要為大家介紹了UEFI開發(fā)實戰(zhàn)SlimBootloader中調(diào)用FSP基礎教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06
ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù)
這篇文章主要介紹了ARM匯編判斷之如何用匯編判斷數(shù)組中正負數(shù)個數(shù),在匯編語言中程序的基本框架是不變的,這里我們可以直接把正向遍歷的程序給貼過來,然后我們思考怎么運用判斷后綴把數(shù)組中正數(shù)和負數(shù)分開,進行判斷個數(shù)和分別求和,需要的朋友可以參考下2022-04-04

