

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 課程設計報告</b></p><p> 課程 微機原理課程設計 </p><p> 題目 楊輝三角實現(xiàn) </p><p> 系 別 物理與電子工程學院 </p><p&g
2、t;<b> 目 錄</b></p><p> 引言 2</p><p> 第一章楊輝三角簡介 2</p><p> 1.1楊
3、輝三角歷史 2</p><p> 1.2 楊輝三角性質 2</p><p> 第二章匯編語言簡介 4</p&g
4、t;<p> 2.1 匯編語言概況 4</p><p> 2.2匯編語言優(yōu)點及缺點 4</p><p> 第三章程序設計流程圖
5、 6</p><p> 第四章子程序設計 7</p><p> 4.1 輸入子程序 7</p><p> 4.2楊輝三角算法子程序
6、 8</p><p> 4.3計算輸出數(shù)字長度子程序 9</p><p> 4.4計行前數(shù)字間空格子程序 9</p><p> 4.5輸出子程序
7、 11</p><p> 結束語 13</p><p> 參考文獻 13</p
8、><p> 附錄 14</p><p> 附錄A 14</p><p> 附錄B
9、 18</p><p><b> 楊輝三角實現(xiàn)</b></p><p><b> 引言</b></p><p> 中國古代數(shù)學家在數(shù)學的許多重要領域中處于遙遙領先的地位。中國古代數(shù)學史曾經有自己光輝燦爛的篇章,而楊輝三角的發(fā)現(xiàn)就是十分精彩的一頁。楊輝三角形,又稱
10、賈憲三角形,帕斯卡三角形,是二項式系數(shù)在三角形中的一種幾何排列。</p><p><b> 楊輝三角簡介</b></p><p><b> 楊輝三角歷史 </b></p><p> 北宋人賈憲約1050年首先使用“賈憲三角”進行高次開方運算。</p><p> 11世紀中國宋代數(shù)學家楊輝在《
11、詳解九章算法》里討論這種形式的數(shù)表,并說明此表引自11世紀前半賈憲的《釋鎖算術》,并繪畫了“古法七乘方圖”。故此,楊輝三角又被稱為“賈憲三角”。</p><p> 元朝數(shù)學家朱世杰在《四元玉鑒》(1303年)擴充了“賈憲三角”成“古法七乘方圖”。</p><p> 意大利人稱之為“塔塔利亞三角形”(Triangolo di Tartaglia)以紀念在16世紀發(fā)現(xiàn)一元三次方程解的塔塔利
12、亞。</p><p> 在歐洲直到1623年以后,法國數(shù)學家帕斯卡在13歲時發(fā)現(xiàn)了“帕斯卡三角”。</p><p> 布萊士·帕斯卡的著作Traité du triangle arithmétique(1655年)介紹了這個三角形。帕斯卡搜集了幾個關于它的結果,并以此解決一些概率論上的問題,影響面廣泛,Pierre Raymond de Montmort(
13、1708年)和亞伯拉罕·棣·美弗(1730年)都用帕斯卡來稱呼這個三角形。</p><p> 1.2 楊輝三角性質 </p><p> 1、每行數(shù)字左右對稱,由1開始逐漸變大,然后變小,回到1。</p><p> 2、第n行的數(shù)字個數(shù)為n個。</p><p> 3、第n行數(shù)字和為2^(n-1)。(2的(n-1)次方
14、)</p><p> 4、每個數(shù)字等于上一行的左右兩個數(shù)字之和??捎么诵再|寫出整個帕斯卡三角形。</p><p> 5、將第2n+1行第1個數(shù),跟第2n+2行第3個數(shù)、第2n+3行第5個數(shù)……連成一線,這些數(shù)的和是第2n個斐波那契數(shù)。將第2n行第2個數(shù),跟第2n+1行第4個數(shù)、第2n+2行第6個數(shù)……這些數(shù)之和是第2n-1個斐波那契數(shù)。</p><p> 6、
15、第n行的第1個數(shù)為1,第二個數(shù)為1×(n-1),第三個數(shù)為1×(n-1)×(n-2)/2,第四個數(shù)為1×(n-1)×(n-2)/2×(n-3)/3…依此類推。</p><p> 7.兩個未知數(shù)和的n次方運算后的各項系數(shù)依次為楊輝三角的第(n+1)行。</p><p> 圖1-2-1 楊輝三角 圖
16、 1-2-2 楊輝三角數(shù)學公式</p><p><b> 匯編語言簡介</b></p><p> 2.1 匯編語言概況</p><p> 根據(jù)本次設計要求:通過匯編語言編寫匯編程序要求能夠在提示信息下,從計算機鍵盤任意輸入一個數(shù)據(jù),在輸出提示信息后顯示相應的楊輝三角。下面對匯編語言作簡單的介紹。</p><p>
17、 匯編語言(AssemblyLanguage)是面向機器的程序設計語言。在匯編語合中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言的二進制碼,就把機器語言變成了匯編語言。于是匯編語言亦稱為符號語言。使用匯編語言編寫的程序,機器不能直接識別,要由一種程序將匯編語言翻譯成機器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統(tǒng)軟件中語言處理系統(tǒng)軟件。匯編程序把匯編語言翻
18、譯成機器語言的過程稱為匯編。</p><p> 匯編語言是一種功能很強的程序設計語言,也是利用計算機所有硬件特性并能直接控制硬件的語言。匯編語言,作為一門語言,對應于高級語言的編譯器,需要一個“匯編器”來把匯編語言原文件匯編成機器可執(zhí)行的代碼。高級的匯編器如MASM,TASM等等為我們寫匯編程序提供了很多類似于高級語言的特征,比如結構化、抽象等。在這樣的環(huán)境中編寫的匯編程序,有很大一部分是面向匯編器的偽指令,已
19、經類同于高級語言?,F(xiàn)在的匯編環(huán)境已經如此高級,即使全部用匯編語言來編寫windows的應用程序也是可行的,但這不是匯編語言的長處。匯編語言的長處在于編寫高效且需要對機器硬件精確控制的程序。</p><p><b> 匯編語言優(yōu)點及缺點</b></p><p> 匯編語言直接同計算機的底層軟件甚至硬件進行交互,它具有如下一些優(yōu)點:</p><p&
20、gt; ?。?)能夠直接訪問與硬件相關的存儲器或I/O端口;</p><p> (2)能夠不受編譯器的限制,對生成的二進制代碼進行完全的控制;</p><p> ?。?)能夠對關鍵代碼進行更準確的控制,避免因線程共同訪問或者硬件設備共享引起的死鎖;</p><p> (4)能夠根據(jù)特定的應用對代碼做最佳的優(yōu)化,提高運行速度;</p><p&g
21、t; (5)能夠最大限度地發(fā)揮硬件的功能。</p><p> 同時還應該認識到,匯編語言是一種層次非常低的語言,它僅僅高于直接手工編寫二進制的機器指令碼,因此不可避免地存在一些缺點:</p><p> ?。?)編寫的代碼非常難懂,不好維護;</p><p> (2)很容易產生bug,難于調試;</p><p> ?。?)只能針對特定的體
22、系結構和處理器進行優(yōu)化;</p><p> (4)開發(fā)效率很低,時間長且單調。</p><p><b> 程序設計流程圖</b></p><p> 首先程序開始時在電腦上顯示輸入提示信息,提醒輸入的操作數(shù)只能是1到10之間的正整數(shù),超過這個范圍或太小則顯示提示信息輸入的數(shù)過大。得到楊輝三角的階數(shù)之后即調用一個算法子程序來求相應階數(shù)的每一個
23、數(shù)值,每求出一個數(shù)值即將其數(shù)壓入堆棧中保存起來,方便以后輸出數(shù)字時直接調用。算完之后,通過外層循環(huán)di計數(shù)輸出每一行,與此同時又通過內層循環(huán)si計數(shù)輸出一行中的每一個數(shù),在輸出數(shù)字時通過調用show子程序將數(shù)字均以十進制輸出,在輸出數(shù)值的時候通過showspace函數(shù)來控制數(shù)與數(shù)之間的空格及行前空格的輸出,上半部分的數(shù)字輸出之后將其所有數(shù)值及空格格式都存在一個預制的存儲單元內,然后直接實現(xiàn)逆序輸出,這樣最終能在屏幕中打印出一個菱形的楊輝
24、三角。</p><p> 主程序流程圖如圖3.1示:</p><p> 圖3.1 主程序流程圖</p><p><b> 子程序設計</b></p><p><b> 4.1 輸入子程序</b></p><p> 輸入用int 16 ah為0這一功能,從鍵盤讀字符,
25、字符存在al中,輸入時用cmp判斷令其只能輸入字符’0’~‘9’每次輸入的字符轉化為十進制存并闊展為字存入ax中,再將ax與初始為0的bp交換,再將ax乘以十后與bp相加,結果存在bp中,再返回輸入,這樣就能輸入兩位數(shù)。</p><p><b> shur proc</b></p><p><b> push cx</b></p>
26、<p><b> push bx</b></p><p><b> xor bp,bp</b></p><p><b> mov bx,10</b></p><p><b> mov cx,2</b></p><p><b>
27、; input:</b></p><p> mov ah,0 ;鍵盤輸入數(shù)據(jù)存在al中</p><p><b> int 16h</b></p><p> cmp al,0dh ;以回車結束輸入</p><p>
28、<b> jz ok</b></p><p> cmp al,'0' ;只允許輸入0~9</p><p><b> jb input</b></p><p> cmp al,'9'</p><p><b>
29、; ja input</b></p><p> mov ah,0eh ;顯示有效輸入</p><p><b> int 10h</b></p><p> sub al,30h ;化ASCII為十進制</p><p>
30、 cbw ;字節(jié)擴展為字</p><p> xchg ax,bp</p><p> mul bx ;擴大10倍</p><p> add bp,ax ;加一位</p><p> loo
31、p input</p><p> ok:nop ;數(shù)值結果在BP中</p><p> pop bx ;恢復用到的寄存器</p><p><b> pop cx</b></p><p><b> ret
32、</b></p><p><b> shur endp</b></p><p> 4.2楊輝三角算法子程序</p><p> 求某m行n列的數(shù)C(n, m)時采用遞歸的方法求出該數(shù)具體算法是:</p><p> { C(n, m) = 1 (n < m 或 m = 0)</p>&
33、lt;p> { C(n, m) = C(n-1, m-1) + C(n-1, m) (n > m)</p><p> 即某位置組合數(shù)等于上一行左右兩數(shù)之和,先算出左肩上的數(shù)并壓棧保存,再次調用C過程求出右肩上的數(shù)并壓棧保存,左肩與右肩的數(shù)相加從而可以求出下一行的組合數(shù)嗎,其間存在遞歸調用,直至求出最大的那個數(shù)才返回初始調用的call的下一個語句。</p><p><b
34、> C proc</b></p><p><b> push bp</b></p><p> mov bp, sp</p><p> sub sp, 2 ; 預留一個存儲位置</p><p> mov bx, [bp+6]
35、 ; 保存m到bx</p><p> cmp bx, [bp+4] ; 如果m > n 返回1</p><p><b> jz L1</b></p><p> cmp bx, 0 ; 如果m = 0 返回1</p><p>
36、<b> jz L1</b></p><p> mov ax, [bp+4] ; 保存n到ax</p><p> dec ax; ax = ax - 1</p><p> dec bx; bx = bx - 1</p><p><b> push bx</b&g
37、t;</p><p><b> push ax</b></p><p> call C ; 返回上一行左邊的那個數(shù)</p><p> mov [bp-2], ax ; 保存左肩膀上的數(shù)</p><p> mov ax, [bp+4]
38、 ; 以下5句同理,返回上一行右肩膀上的數(shù)</p><p><b> dec ax</b></p><p> push [bp+6]</p><p><b> push ax</b></p><p><b> call C</b><
39、;/p><p> add ax, [bp-2] ; 和左肩膀上的數(shù)相加得出該組合數(shù)</p><p><b> jmp L2</b></p><p><b> L1:</b></p><p><b> mov ax, 1</b></p&
40、gt;<p><b> L2: </b></p><p> mov sp, bp</p><p><b> pop bp</b></p><p> ret 4 ; ax返回組合數(shù)</p><p><b> C en
41、dp</b></p><p> 計算輸出數(shù)字長度子程序</p><p> 將此數(shù)不斷除以十,每除一次計數(shù)加1,當al即商為0時停止返回計數(shù)值即長度。例如:計算輸出數(shù)字最大長度以便分配行間行前空格時,n階的最大數(shù)應該是最后一行中間那個數(shù)即C(n, n/2) ,將此數(shù)不斷除以十,每除一次計數(shù)加1,當al即商為0時停止返回計數(shù)值即最大長度。</p><p>
42、; getdigit proc</p><p><b> push dx</b></p><p> mov bx, 10</p><p> xor dx, dx</p><p><b> next:</b></p><p><b> cmp ax, 0&
43、lt;/b></p><p><b> jle ok2</b></p><p><b> div bl</b></p><p> and ax, 0ffh</p><p><b> inc dx</b></p><p><b>
44、 jmp next</b></p><p><b> ok2:</b></p><p> mov ax, dx</p><p><b> pop dx</b></p><p><b> ret</b></p><p> getdig
45、it endp</p><p> 計行前數(shù)字間空格子程序</p><p> 先定義一個可以接受輸入ax個空格的子程序輸出行前空格時,n階楊輝三角的i行行前空格數(shù)=(n-i)*cl ,cl是最大長度,某數(shù)與下一個數(shù)字間空格數(shù)=數(shù)的最大長度cl+cl-該數(shù)的長度。具體程序如下:</p><p> call showspace
46、 ; 輸出行前空格</p><p> xor si, si ; 內存循環(huán)計數(shù)si,內層循環(huán)輸出一行中的每個數(shù)</p><p><b> jmp cp2</b></p><p><b> up2:</b></p><p> inc si
47、 ; 更新di</p><p><b> cp2:</b></p><p> cmp si, di ; 測試循環(huán)條件,循環(huán)di次</p><p><b> jg done2</b></p><p><b>
48、; push si</b></p><p><b> push di</b></p><p> call C ; 獲取該行的位于si位置的組合數(shù),調用C(di, si)</p><p> push ax ; 保存該組合數(shù)</p
49、><p><b> push bx</b></p><p> mov bx ,dx</p><p> mov [bx], ax</p><p><b> inc dx</b></p><p><b> inc dx</b></p>&
50、lt;p><b> pop bx</b></p><p> call show ; 輸出該數(shù)</p><p> mov ax, cx </p><p> sub ax, 1 </p><p><b> push bx</b></p&
51、gt;<p> mov bx ,dx</p><p> mov [bx], ax</p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b> pop bx</b></p><
52、;p> call showspace </p><p><b> pop ax</b></p><p> call getdigit ; 獲取該組合數(shù)長度</p><p> mov bx, ax </p><p> mov ax, cx </p>
53、<p> sub ax, bx ;</p><p> add ax, 1 </p><p><b> push bx</b></p><p> mov bx ,dx</p><p> mov [bx], ax</p><p><b> inc dx</b
54、></p><p><b> inc dx</b></p><p><b> pop bx</b></p><p> call showspace </p><p> jmp up2 ; 更新內層循環(huán)</p><p>
55、 showspace:</p><p><b> push dx</b></p><p> mov bx, ax</p><p><b> mov ah, 2</b></p><p> mov dl, ' '</p><p><b> n
56、exts:</b></p><p><b> cmp bx, 0</b></p><p><b> jle dones</b></p><p><b> int 21h</b></p><p><b> dec bx</b></p
57、><p><b> jmp nexts</b></p><p><b> dones:</b></p><p><b> pop dx</b></p><p><b> 4.5輸出子程序</b></p><p> 輸出分為上半
58、部分和下半部分,上半部分輸出利用2號功能將每個數(shù)除以10將余數(shù)轉化為字符倒序輸出,下半部分是將算好的數(shù)以及行前行間空格數(shù)算好然后倒序輸出。</p><p><b> 上半部分:</b></p><p><b> show proc</b></p><p><b> push dx</b><
59、/p><p> mov bx, 10</p><p><b> cmp ax, 0</b></p><p><b> jz ok1</b></p><p><b> div bl</b></p><p><b> push ax</
60、b></p><p> and ax, 00ffh</p><p><b> call show</b></p><p><b> pop dx</b></p><p> mov dl, dh</p><p> or dl, 30h</p>&l
61、t;p><b> mov ah, 2</b></p><p><b> int 21h</b></p><p><b> ok1:</b></p><p><b> pop dx</b></p><p><b> ret</
62、b></p><p><b> show endp</b></p><p><b> 下半部分:</b></p><p><b> mov ax,da</b></p><p><b> inc al</b></p><p&
63、gt;<b> mov bl,6</b></p><p><b> mul bl</b></p><p><b> sub dx,ax</b></p><p><b> dec dx</b></p><p><b> dec dx<
64、;/b></p><p> mov cx,da </p><p><b> l11:</b></p><p><b> mov ax,cx</b></p><p><b> mov bl,6</b></p><p><b>
65、mul bl</b></p><p><b> sub dx,ax</b></p><p><b> dec dx</b></p><p><b> dec dx</b></p><p><b> mov bx,dx</b></p
66、><p> mov ax,[bx]</p><p> call showspace ; 輸出行前空格</p><p><b> push cx</b></p><p><b> l12:</b></p><p><b> inc
67、 dx</b></p><p><b> inc dx</b></p><p><b> mov bx,dx</b></p><p> mov ax,[bx]</p><p> call show ; 輸出該數(shù)</p><p
68、><b> inc dx</b></p><p><b> inc dx</b></p><p><b> mov bx,dx</b></p><p> mov ax,[bx]</p><p> call showspace ;輸出數(shù)字
69、間間隔空格</p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b> mov bx,dx</b></p><p> mov ax,[bx]</p><p> call showsp
70、ace ;輸出填充的空格</p><p><b> loop l12</b></p><p><b> pop cx</b></p><p><b> mov ax,cx</b></p><p><b> mov bl,6</
71、b></p><p><b> mul bl</b></p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b> sub dx,ax</b></p><p>
72、;<b> dec dx</b></p><p><b> dec dx</b></p><p><b> push dx</b></p><p> mov ah, 2 ; 以下5句實現(xiàn)換行</p><p> mov dl, 13&l
73、t;/p><p><b> int 21h</b></p><p> mov dl, 10</p><p><b> int 21h</b></p><p><b> pop dx</b></p><p><b> loop l11<
74、;/b></p><p><b> 結束語</b></p><p> 本文主要介紹了利用匯編語言原理技術的一些知識,編寫一個能在電腦屏幕上打印楊輝三角的程序代碼,不僅能正序輸出十階內的楊輝三角也能倒序輸出十階內的楊輝三角。我們只是簡單的了解了其中一點而已,最多只做到了十二階楊輝三角的正序倒序輸出,因此更應進行深入的研究與探討。微機原理程序編寫技術也有待于更深
75、入的學習。</p><p><b> 參考文獻</b></p><p> [1] 朱金鈞 麻新旗. 微型計算機原理及應用技術[M](第二版). 北京:機械工業(yè)出版社,2005.</p><p> [2] 王爽. 匯編語言[M] (第二版).北京:清華大學出版社,2003.</p><p><b>
76、附錄</b></p><p><b> 附錄A</b></p><p><b> 程序代碼:</b></p><p> data segment</p><p><b> org 100h</b></p><p> message
77、db 'Input N(N<=10): $'</p><p> error db 0ah,0dh, 'Data out of range!$'</p><p><b> da dw 0</b></p><p> dat dw 300 dup(?)</p><p><b&g
78、t; data ends</b></p><p> code segment </p><p> assume cs:code,ds:data</p><p><b> start: </b></p><p> mov ax,data</p><p><b>
79、mov ds,ax</b></p><p> mov dx,offset message</p><p><b> mov ah,9</b></p><p><b> int 21h</b></p><p><b> call shur</b></p&
80、gt;<p><b> cmp bp,10</b></p><p><b> jbe goon</b></p><p> mov dx,offset error</p><p><b> mov ah,9</b></p><p><b> in
81、t 21h</b></p><p><b> jmp exit</b></p><p><b> goon: </b></p><p> mov ah, 2 ; 以下5句實現(xiàn)換行</p><p> mov dl, 13</p><p><b>
82、; int 21h</b></p><p> mov dl, 10</p><p><b> int 21h</b></p><p><b> push bp </b></p><p><b> call yhsj</b></p><
83、p><b> mov ax,da</b></p><p><b> inc al</b></p><p><b> mov bl,6</b></p><p><b> mul bl</b></p><p><b> sub dx,
84、ax</b></p><p><b> dec dx</b></p><p><b> dec dx</b></p><p> mov cx,da </p><p><b> l11:</b></p><p><b>
85、mov ax,cx</b></p><p><b> mov bl,6</b></p><p><b> mul bl</b></p><p><b> sub dx,ax</b></p><p><b> dec dx</b><
86、/p><p><b> dec dx</b></p><p><b> mov bx,dx</b></p><p> mov ax,[bx]</p><p> call showspace ; 輸出行前空格</p><p><b> push cx<
87、;/b></p><p><b> l12:</b></p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b> mov bx,dx</b></p><p>
88、; mov ax,[bx]</p><p> call show ; 輸出該數(shù)</p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b> mov bx,dx</b></p><p>
89、; mov ax,[bx]</p><p> call showspace ;輸出數(shù)字間間隔空格</p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b> mov bx,dx</b></p>
90、<p> mov ax,[bx]</p><p> call showspace ;輸出填充的空格</p><p><b> loop l12</b></p><p><b> pop cx</b></p><p><b> mov ax,cx</b>&l
91、t;/p><p><b> mov bl,6</b></p><p><b> mul bl</b></p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b&g
92、t; sub dx,ax</b></p><p><b> dec dx</b></p><p><b> dec dx</b></p><p><b> push dx</b></p><p> mov ah, 2 ; 以下5句實現(xiàn)換行</p&
93、gt;<p> mov dl, 13</p><p><b> int 21h</b></p><p> mov dl, 10</p><p><b> int 21h</b></p><p><b> pop dx</b></p><
94、;p><b> loop l11</b></p><p> mov ah,4ch</p><p><b> int 21h</b></p><p><b> exit:</b></p><p> mov ah,4ch</p><p>&l
95、t;b> int 21h</b></p><p><b> shur proc</b></p><p><b> push cx</b></p><p><b> push bx</b></p><p><b> xor bp,bp<
96、/b></p><p><b> mov bx,10</b></p><p><b> mov cx,2</b></p><p><b> input:</b></p><p> mov ah,0 ;鍵盤輸入數(shù)據(jù)存在al中</p><p>
97、<b> int 16h</b></p><p> cmp al,0dh ;以回車結束輸入</p><p><b> jz ok</b></p><p> cmp al,'0' ;只允許輸入0~9</p><p><b> jb input</b>&l
98、t;/p><p> cmp al,'9'</p><p><b> ja input</b></p><p> mov ah,0eh ;顯示有效輸入</p><p><b> int 10h</b></p><p> sub al,30h ;化ASCII
99、為十進制</p><p> cbw ;字節(jié)擴展為字</p><p> xchg ax,bp</p><p> mul bx ;擴大10倍</p><p> add bp,ax ;加一位</p><p> loop input</p><p> ok:nop ;數(shù)值結果在BP中<
100、/p><p><b> ;恢復用到的寄存器</b></p><p><b> pop bx</b></p><p><b> pop cx</b></p><p><b> ret</b></p><p><b>
101、shur endp</b></p><p> ; 輸出楊輝三角的函數(shù),接受一個棧上的參數(shù)N</p><p> ; 輸出N階楊輝三角</p><p><b> yhsj proc</b></p><p> mov bp, sp</p><p> mov ax, [bp+2]
102、 ; 保存N到ax</p><p> mov dx,offset dat</p><p> mov da, ax</p><p> shr ax, 1 ; N = N / 2</p><p><b> push ax</b></p><p> mov ax, [bp+2]
103、 ; 保存N到ax</p><p><b> push ax</b></p><p> call C; C(N, N/2)獲取最后一行中間的那個值,即最大值</p><p> call getdigit ; 計算該最大值的長度,如252則返回3</p><p> mov cx, ax ; 保存最大長度到
104、cx,用于事后格式用</p><p> xor di, di ; 外層循環(huán)計數(shù)di,外層循環(huán)輸出每一行</p><p><b> jmp cp1</b></p><p><b> up1:</b></p><p> inc di; 更新di</p><p><
105、b> cp1:</b></p><p> cmp di, [bp+2] ; 測試循環(huán)條件,循環(huán)N次</p><p><b> jg done1</b></p><p> mov ax, [bp+2] ; 以下3句計算行前空格數(shù) = (N-i)*cl,cl是最大長度</p><p>
106、 sub ax, di</p><p><b> mul cl</b></p><p><b> push bx</b></p><p> mov bx ,dx</p><p> mov [bx], ax</p><p><b> inc dx</b
107、></p><p><b> inc dx</b></p><p><b> pop bx</b></p><p> call showspace ; 輸出行前空格</p><p> xor si, si ; 內存循環(huán)計數(shù)si,內層循環(huán)輸出一行中的每個數(shù)</p>
108、<p><b> jmp cp2</b></p><p><b> up2:</b></p><p> inc si; 更新di</p><p><b> cp2:</b></p><p> cmp si, di ; 測試循環(huán)條件,循環(huán)di次</p&
109、gt;<p><b> jg done2</b></p><p><b> push si</b></p><p><b> push di</b></p><p> call C; 獲取該行的位于si位置的組合數(shù),調用C(di, si)</p><p>
110、 push ax ; 保存該組合數(shù)</p><p><b> push bx</b></p><p> mov bx ,dx</p><p> mov [bx], ax</p><p><b> inc dx</b></p><p><b> i
111、nc dx</b></p><p><b> pop bx</b></p><p> call show ; 輸出該數(shù)</p><p> mov ax, cx ;以下輸出數(shù)字間間隔空格,個數(shù) = N - 1</p><p> sub ax, 1 </p><p>&l
112、t;b> push bx</b></p><p> mov bx ,dx</p><p> mov [bx], ax</p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b>
113、 pop bx</b></p><p> call showspace </p><p><b> pop ax</b></p><p> call getdigit ; 獲取該組合數(shù)長度</p><p> mov bx, ax </p><p> mov ax
114、, cx </p><p> sub ax, bx ;計算需要填充的空格數(shù) = 最大長度 - 該數(shù)長度 + 1</p><p> add ax, 1 </p><p><b> push bx</b></p><p> mov bx ,dx</p><p> mov [bx],
115、ax</p><p><b> inc dx</b></p><p><b> inc dx</b></p><p><b> pop bx</b></p><p> call showspace </p><p> jmp up2
116、 ; 更新內層循環(huán)</p><p> done2: ; 內層循環(huán)結束</p><p><b> push dx</b></p><p> mov ah, 2 ; 以下5句實現(xiàn)換行</p><p> mov dl, 13</p><p><b> int 21h</
117、b></p><p> mov dl, 10</p><p><b> int 21h</b></p><p><b> pop dx</b></p><p> jmp up1 ; 更新外層循環(huán)</p><p> done1: ; 外層循環(huán)結束<
118、;/p><p> ret 2 ; 釋放函數(shù)參數(shù)使用的??臻g</p><p><b> yhsj endp</b></p><p> ; 求組合數(shù)的遞歸函數(shù),接受棧上的2個參數(shù)n, m(n > m)</p><p> ; 返回C(n, m),即n選m的個數(shù)</p><p><b>
119、; ; 算法是:</b></p><p> ; { C(n, m) = 1 (n = m 或 m = 0)</p><p> ; { C(n, m) = C(n-1, m-1) + C(n-1, m) (n > m)</p><p> ; 即某位置組合數(shù)等于上一行左右兩數(shù)之和</p><p><b> C
120、 proc</b></p><p><b> push bp</b></p><p> mov bp, sp</p><p> sub sp, 2 ; 預留一個存儲位置</p><p> mov bx, [bp+6] ; 保存m到bx</p><p> cmp bx
121、, [bp+4] ; 如果m = n 返回1</p><p><b> jz L1</b></p><p> cmp bx, 0 ; 如果m = 0 返回1</p><p><b> jz L1</b></p><p> mov ax, [bp+4] ; 保存n到ax<
122、/p><p> dec ax; ax = ax - 1</p><p> dec bx; bx = bx - 1</p><p><b> push bx</b></p><p><b> push ax</b></p><p> call C; 返回上一行左邊的那個數(shù)
123、</p><p> mov [bp-2], ax ; 保存左肩膀上的數(shù)</p><p> mov ax, [bp+4] ; 以下5句同理,返回上一行右肩膀上的數(shù)</p><p><b> dec ax</b></p><p> push [bp+6]</p><p><b
124、> push ax</b></p><p><b> call C</b></p><p> add ax, [bp-2] ; 和左肩膀上的數(shù)相加得出該組合數(shù)</p><p><b> jmp L2</b></p><p><b> L1:</b&g
125、t;</p><p><b> mov ax, 1</b></p><p><b> L2: </b></p><p> mov sp, bp</p><p><b> pop bp</b></p><p> ret 4 ; ax返回組合數(shù)&
126、lt;/p><p><b> C endp</b></p><p> ; 遞歸以10進制輸出ax</p><p> ; 方法很簡單,就是求出余數(shù),然后ax = ax / 10</p><p> ; ax = 0時退出,開始逆序輸出求出的各位余數(shù)</p><p><b> show
127、proc</b></p><p><b> push dx</b></p><p> mov bx, 10</p><p><b> cmp ax, 0</b></p><p><b> jz ok1</b></p><p><
128、b> div bl</b></p><p><b> push ax</b></p><p> and ax, 00ffh</p><p><b> call show</b></p><p><b> pop dx</b></p>&
129、lt;p> mov dl, dh</p><p> or dl, 30h</p><p><b> mov ah, 2</b></p><p><b> int 21h</b></p><p><b> ok1:</b></p><p>
130、<b> pop dx</b></p><p><b> ret</b></p><p><b> show endp</b></p><p> ; 獲取一個數(shù)的長度,ax為參數(shù),如果ax = 252則返回3</p><p><b> ; ax里是返回值&l
131、t;/b></p><p> getdigit proc</p><p><b> push dx</b></p><p> mov bx, 10</p><p> xor dx, dx</p><p><b> next:</b></p>&l
132、t;p><b> cmp ax, 0</b></p><p><b> jle ok2</b></p><p><b> div bl</b></p><p> and ax, 0ffh</p><p><b> inc dx</b><
133、;/p><p><b> jmp next</b></p><p><b> ok2:</b></p><p> mov ax, dx</p><p><b> pop dx</b></p><p><b> ret</b>&
134、lt;/p><p> getdigit endp</p><p> ; 輸出ax個空格,參數(shù)ax,無返回值</p><p> showspace proc</p><p><b> push dx</b></p><p> mov bx, ax</p><p><
135、;b> mov ah, 2</b></p><p> mov dl, ' '</p><p><b> nexts:</b></p><p><b> cmp bx, 0</b></p><p><b> jle dones</b>&
136、lt;/p><p><b> int 21h</b></p><p><b> dec bx</b></p><p><b> jmp nexts</b></p><p><b> dones:</b></p><p><
137、b> pop dx</b></p><p><b> ret</b></p><p> showspace endp</p><p> code ends </p><p><b> end start</b></p><p><b>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論