欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

匯編語言實(shí)現(xiàn)打印楊輝三角

 更新時(shí)間:2020年02月05日 09:45:52   作者:dididu1515  
這篇文章主要介紹了匯編語言實(shí)現(xiàn)打印楊輝三角,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

計(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ì)說明

    這篇文章主要介紹了匯編指令-狀態(tài)寄存器、cmp、test、jz等指令詳細(xì)說明,需要的朋友可以參考下
    2020-01-01
  • 匯編語言中DIV指令的具體用法

    匯編語言中DIV指令的具體用法

    本文主要介紹了匯編語言中DIV指令的具體用法
    2024-03-03
  • 匯編中的數(shù)組分配和指針的實(shí)現(xiàn)代碼

    匯編中的數(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í)現(xiàn)簡(jiǎn)單數(shù)學(xué)運(yùn)算的思路詳解,本文給大家列出了兩種算術(shù)運(yùn)算的代碼,設(shè)計(jì)思路給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • asm基礎(chǔ)——匯編指令之in/out指令

    asm基礎(chǔ)——匯編指令之in/out指令

    這篇文章主要介紹了asm基礎(chǔ)——匯編指令之in/out指令,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • 使用匯編語言實(shí)現(xiàn)if else 循環(huán)函數(shù)調(diào)用的具體方法

    使用匯編語言實(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)

    這篇文章主要介紹了匯編 函數(shù)調(diào)用的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 匯編語言Debug命令詳解教程

    匯編語言Debug命令詳解教程

    這篇文章主要為大家介紹了匯編語言Debug命令的教程,文中對(duì)Debug的命令進(jìn)行了全面的講解有需要的朋友可以借鑒參考共同學(xué)習(xí)下,希望能夠有所幫助
    2021-11-11
  • 匯編語言學(xué)習(xí)assume的作用詳解

    匯編語言學(xué)習(xí)assume的作用詳解

    這篇文章主要為大家介紹了匯編語言學(xué)習(xí)assume的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-11-11
  • 匯編語言中debug命令使用小結(jié)

    匯編語言中debug命令使用小結(jié)

    Debug是DOS、Windows都提供的實(shí)模式(8086方式)程序的調(diào)試工具,本文主要介紹了匯編語言中debug命令使用小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評(píng)論