微機(jī)原理課程設(shè)計(jì)-楊輝三角課程設(shè)計(jì)_第1頁
已閱讀1頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論