版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計(jì)報告</b></p><p> 課程 微機(jī)原理課程設(shè)計(jì) </p><p> 題目 楊輝三角實(shí)現(xiàn) </p><p> 系 別 物理與電子工程學(xué)院 </p><p&g
2、t;<b> 目 錄</b></p><p> 引言 2</p><p> 第一章楊輝三角簡介 2</p><p> 1.1楊
3、輝三角歷史 2</p><p> 1.2 楊輝三角性質(zhì) 2</p><p> 第二章匯編語言簡介 4</p&g
4、t;<p> 2.1 匯編語言概況 4</p><p> 2.2匯編語言優(yōu)點(diǎn)及缺點(diǎn) 4</p><p> 第三章程序設(shè)計(jì)流程圖
5、 6</p><p> 第四章子程序設(shè)計(jì) 7</p><p> 4.1 輸入子程序 7</p><p> 4.2楊輝三角算法子程序
6、 8</p><p> 4.3計(jì)算輸出數(shù)字長度子程序 9</p><p> 4.4計(jì)行前數(shù)字間空格子程序 9</p><p> 4.5輸出子程序
7、 11</p><p> 結(jié)束語 13</p><p> 參考文獻(xiàn) 13</p
8、><p> 附錄 14</p><p> 附錄A 14</p><p> 附錄B
9、 18</p><p><b> 楊輝三角實(shí)現(xiàn)</b></p><p><b> 引言</b></p><p> 中國古代數(shù)學(xué)家在數(shù)學(xué)的許多重要領(lǐng)域中處于遙遙領(lǐng)先的地位。中國古代數(shù)學(xué)史曾經(jīng)有自己光輝燦爛的篇章,而楊輝三角的發(fā)現(xiàn)就是十分精彩的一頁。楊輝三角形,又稱
10、賈憲三角形,帕斯卡三角形,是二項(xiàng)式系數(shù)在三角形中的一種幾何排列。</p><p><b> 楊輝三角簡介</b></p><p><b> 楊輝三角歷史 </b></p><p> 北宋人賈憲約1050年首先使用“賈憲三角”進(jìn)行高次開方運(yùn)算。</p><p> 11世紀(jì)中國宋代數(shù)學(xué)家楊輝在《
11、詳解九章算法》里討論這種形式的數(shù)表,并說明此表引自11世紀(jì)前半賈憲的《釋鎖算術(shù)》,并繪畫了“古法七乘方圖”。故此,楊輝三角又被稱為“賈憲三角”。</p><p> 元朝數(shù)學(xué)家朱世杰在《四元玉鑒》(1303年)擴(kuò)充了“賈憲三角”成“古法七乘方圖”。</p><p> 意大利人稱之為“塔塔利亞三角形”(Triangolo di Tartaglia)以紀(jì)念在16世紀(jì)發(fā)現(xiàn)一元三次方程解的塔塔利
12、亞。</p><p> 在歐洲直到1623年以后,法國數(shù)學(xué)家帕斯卡在13歲時發(fā)現(xiàn)了“帕斯卡三角”。</p><p> 布萊士·帕斯卡的著作Traité du triangle arithmétique(1655年)介紹了這個三角形。帕斯卡搜集了幾個關(guān)于它的結(jié)果,并以此解決一些概率論上的問題,影響面廣泛,Pierre Raymond de Montmort(
13、1708年)和亞伯拉罕·棣·美弗(1730年)都用帕斯卡來稱呼這個三角形。</p><p> 1.2 楊輝三角性質(zhì) </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ù)字之和。可用此性質(zhì)寫出整個帕斯卡三角形。</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次方運(yùn)算后的各項(xiàng)系數(shù)依次為楊輝三角的第(n+1)行。</p><p> 圖1-2-1 楊輝三角 圖
16、 1-2-2 楊輝三角數(shù)學(xué)公式</p><p><b> 匯編語言簡介</b></p><p> 2.1 匯編語言概況</p><p> 根據(jù)本次設(shè)計(jì)要求:通過匯編語言編寫匯編程序要求能夠在提示信息下,從計(jì)算機(jī)鍵盤任意輸入一個數(shù)據(jù),在輸出提示信息后顯示相應(yīng)的楊輝三角。下面對匯編語言作簡單的介紹。</p><p>
17、 匯編語言(AssemblyLanguage)是面向機(jī)器的程序設(shè)計(jì)語言。在匯編語合中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標(biāo)號(Label)代替地址碼。這樣用符號代替機(jī)器語言的二進(jìn)制碼,就把機(jī)器語言變成了匯編語言。于是匯編語言亦稱為符號語言。使用匯編語言編寫的程序,機(jī)器不能直接識別,要由一種程序?qū)R編語言翻譯成機(jī)器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統(tǒng)軟件中語言處理系統(tǒng)軟件。匯編程序把匯編語言翻
18、譯成機(jī)器語言的過程稱為匯編。</p><p> 匯編語言是一種功能很強(qiáng)的程序設(shè)計(jì)語言,也是利用計(jì)算機(jī)所有硬件特性并能直接控制硬件的語言。匯編語言,作為一門語言,對應(yīng)于高級語言的編譯器,需要一個“匯編器”來把匯編語言原文件匯編成機(jī)器可執(zhí)行的代碼。高級的匯編器如MASM,TASM等等為我們寫匯編程序提供了很多類似于高級語言的特征,比如結(jié)構(gòu)化、抽象等。在這樣的環(huán)境中編寫的匯編程序,有很大一部分是面向匯編器的偽指令,已
19、經(jīng)類同于高級語言?,F(xiàn)在的匯編環(huán)境已經(jīng)如此高級,即使全部用匯編語言來編寫windows的應(yīng)用程序也是可行的,但這不是匯編語言的長處。匯編語言的長處在于編寫高效且需要對機(jī)器硬件精確控制的程序。</p><p><b> 匯編語言優(yōu)點(diǎn)及缺點(diǎn)</b></p><p> 匯編語言直接同計(jì)算機(jī)的底層軟件甚至硬件進(jìn)行交互,它具有如下一些優(yōu)點(diǎn):</p><p&
20、gt; ?。?)能夠直接訪問與硬件相關(guān)的存儲器或I/O端口;</p><p> ?。?)能夠不受編譯器的限制,對生成的二進(jìn)制代碼進(jìn)行完全的控制;</p><p> ?。?)能夠?qū)﹃P(guān)鍵代碼進(jìn)行更準(zhǔn)確的控制,避免因線程共同訪問或者硬件設(shè)備共享引起的死鎖;</p><p> (4)能夠根據(jù)特定的應(yīng)用對代碼做最佳的優(yōu)化,提高運(yùn)行速度;</p><p&g
21、t; ?。?)能夠最大限度地發(fā)揮硬件的功能。</p><p> 同時還應(yīng)該認(rèn)識到,匯編語言是一種層次非常低的語言,它僅僅高于直接手工編寫二進(jìn)制的機(jī)器指令碼,因此不可避免地存在一些缺點(diǎn):</p><p> ?。?)編寫的代碼非常難懂,不好維護(hù);</p><p> ?。?)很容易產(chǎn)生bug,難于調(diào)試;</p><p> ?。?)只能針對特定的體
22、系結(jié)構(gòu)和處理器進(jìn)行優(yōu)化;</p><p> ?。?)開發(fā)效率很低,時間長且單調(diào)。</p><p><b> 程序設(shè)計(jì)流程圖</b></p><p> 首先程序開始時在電腦上顯示輸入提示信息,提醒輸入的操作數(shù)只能是1到10之間的正整數(shù),超過這個范圍或太小則顯示提示信息輸入的數(shù)過大。得到楊輝三角的階數(shù)之后即調(diào)用一個算法子程序來求相應(yīng)階數(shù)的每一個
23、數(shù)值,每求出一個數(shù)值即將其數(shù)壓入堆棧中保存起來,方便以后輸出數(shù)字時直接調(diào)用。算完之后,通過外層循環(huán)di計(jì)數(shù)輸出每一行,與此同時又通過內(nèi)層循環(huán)si計(jì)數(shù)輸出一行中的每一個數(shù),在輸出數(shù)字時通過調(diào)用show子程序?qū)?shù)字均以十進(jìn)制輸出,在輸出數(shù)值的時候通過showspace函數(shù)來控制數(shù)與數(shù)之間的空格及行前空格的輸出,上半部分的數(shù)字輸出之后將其所有數(shù)值及空格格式都存在一個預(yù)制的存儲單元內(nèi),然后直接實(shí)現(xiàn)逆序輸出,這樣最終能在屏幕中打印出一個菱形的楊輝
24、三角。</p><p> 主程序流程圖如圖3.1示:</p><p> 圖3.1 主程序流程圖</p><p><b> 子程序設(shè)計(jì)</b></p><p><b> 4.1 輸入子程序</b></p><p> 輸入用int 16 ah為0這一功能,從鍵盤讀字符,
25、字符存在al中,輸入時用cmp判斷令其只能輸入字符’0’~‘9’每次輸入的字符轉(zhuǎn)化為十進(jìn)制存并闊展為字存入ax中,再將ax與初始為0的bp交換,再將ax乘以十后與bp相加,結(jié)果存在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 ;以回車結(jié)束輸入</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為十進(jìn)制</p><p>
30、 cbw ;字節(jié)擴(kuò)展為字</p><p> xchg ax,bp</p><p> mul bx ;擴(kuò)大10倍</p><p> add bp,ax ;加一位</p><p> loo
31、p input</p><p> ok:nop ;數(shù)值結(jié)果在BP中</p><p> pop bx ;恢復(fù)用到的寄存器</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ù)并壓棧保存,再次調(diào)用C過程求出右肩上的數(shù)并壓棧保存,左肩與右肩的數(shù)相加從而可以求出下一行的組合數(shù)嗎,其間存在遞歸調(diào)用,直至求出最大的那個數(shù)才返回初始調(diào)用的call的下一個語句。</p><p><b
34、> C proc</b></p><p><b> push bp</b></p><p> mov bp, sp</p><p> sub sp, 2 ; 預(yù)留一個存儲位置</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> 計(jì)算輸出數(shù)字長度子程序</p><p> 將此數(shù)不斷除以十,每除一次計(jì)數(shù)加1,當(dāng)al即商為0時停止返回計(jì)數(shù)值即長度。例如:計(jì)算輸出數(shù)字最大長度以便分配行間行前空格時,n階的最大數(shù)應(yīng)該是最后一行中間那個數(shù)即C(n, n/2) ,將此數(shù)不斷除以十,每除一次計(jì)數(shù)加1,當(dāng)al即商為0時停止返回計(jì)數(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> 計(jì)行前數(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 ; 內(nèi)存循環(huán)計(jì)數(shù)si,內(nèi)層循環(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ù),調(diào)用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 ; 更新內(nèi)層循環(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ù)轉(zhuǎn)化為字符倒序輸出,下半部分是將算好的數(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句實(shí)現(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> 結(jié)束語</b></p><p> 本文主要介紹了利用匯編語言原理技術(shù)的一些知識,編寫一個能在電腦屏幕上打印楊輝三角的程序代碼,不僅能正序輸出十階內(nèi)的楊輝三角也能倒序輸出十階內(nèi)的楊輝三角。我們只是簡單的了解了其中一點(diǎn)而已,最多只做到了十二階楊輝三角的正序倒序輸出,因此更應(yīng)進(jìn)行深入的研究與探討。微機(jī)原理程序編寫技術(shù)也有待于更深
75、入的學(xué)習(xí)。</p><p><b> 參考文獻(xiàn)</b></p><p> [1] 朱金鈞 麻新旗. 微型計(jì)算機(jī)原理及應(yīng)用技術(shù)[M](第二版). 北京:機(jī)械工業(yè)出版社,2005.</p><p> [2] 王爽. 匯編語言[M] (第二版).北京:清華大學(xué)出版社,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句實(shí)現(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句實(shí)現(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 ;以回車結(jié)束輸入</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、為十進(jìn)制</p><p> cbw ;字節(jié)擴(kuò)展為字</p><p> xchg ax,bp</p><p> mul bx ;擴(kuò)大10倍</p><p> add bp,ax ;加一位</p><p> loop input</p><p> ok:nop ;數(shù)值結(jié)果在BP中<
100、/p><p><b> ;恢復(fù)用到的寄存器</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 ; 計(jì)算該最大值的長度,如252則返回3</p><p> mov cx, ax ; 保存最大長度到
104、cx,用于事后格式用</p><p> xor di, di ; 外層循環(huán)計(jì)數(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句計(jì)算行前空格數(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 ; 內(nèi)存循環(huán)計(jì)數(shù)si,內(nèi)層循環(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ù),調(diào)用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 ;計(jì)算需要填充的空格數(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、 ; 更新內(nèi)層循環(huán)</p><p> done2: ; 內(nèi)層循環(huán)結(jié)束</p><p><b> push dx</b></p><p> mov ah, 2 ; 以下5句實(shí)現(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)結(jié)束<
118、;/p><p> ret 2 ; 釋放函數(shù)參數(shù)使用的棧空間</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 ; 預(yù)留一個存儲位置</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進(jìn)制輸出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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微機(jī)原理課程設(shè)計(jì)——匯編輸出楊輝三角
- 微機(jī)原理課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)課程設(shè)計(jì)----微機(jī)內(nèi)存擴(kuò)充卡
- 微機(jī)原理課程設(shè)計(jì)報告
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì)報告
- 2017微機(jī)原理課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì)課程設(shè)計(jì)----微機(jī)內(nèi)存擴(kuò)充卡
- 微機(jī)原理課程設(shè)計(jì)報告
- 《微機(jī)原理》課程設(shè)計(jì)報告
- 微機(jī)原理課程設(shè)計(jì)報告
- 微機(jī)原理串口通信課程設(shè)計(jì)
- 微機(jī)原理電子秒表課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)---打字練習(xí)
- 微機(jī)原理課程設(shè)計(jì)--圖形畫法
- 模擬電梯微機(jī)原理課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)----路燈控制設(shè)計(jì)
評論
0/150
提交評論