版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p><b> 第一章 緒論2</b></p><p> 第二章 分析與設(shè)計(jì)3</p><p><b> 2.1 題目3</b></p><p><b> 2.2 要求3</b><
2、/p><p> 2.3 方案設(shè)計(jì)與論證4</p><p> 2.3.1 整體設(shè)計(jì)思路4</p><p> 2.3.2 方案選擇4</p><p> 2.4 結(jié)構(gòu)框圖5</p><p> 3.1 宏定義換行6</p><p> 3.2 階數(shù)輸入過程6</p>&l
3、t;p> 3.3 數(shù)據(jù)判斷功能7</p><p> 3.4 詢問繼續(xù)模塊8</p><p> 3.5 數(shù)值計(jì)算模塊8</p><p> 3.6 顯示模塊10</p><p> 3.6.1 數(shù)據(jù)顯示10</p><p> 3.6.2 空格顯示11</p><p>
4、第四章 實(shí)驗(yàn)結(jié)果及問題處理13</p><p> 4.1 實(shí)驗(yàn)結(jié)果13</p><p> 4.2出現(xiàn)的問題以及解決的方案14</p><p> 4.2.1 數(shù)據(jù)輸入問題14</p><p> 4.2.2 除法溢出問題14</p><p> 4.2.3 數(shù)據(jù)計(jì)算問題15</p><
5、;p> 第五章 總結(jié)與體會16</p><p><b> 參考文獻(xiàn)18</b></p><p><b> 附錄19</b></p><p><b> 第一章 緒論</b></p><p> 隨著電子計(jì)算機(jī)技術(shù)的不斷發(fā)展,微型計(jì)算機(jī)系統(tǒng)的功能越來越強(qiáng),而關(guān)
6、于計(jì)算機(jī)的程序設(shè)計(jì)語言也經(jīng)歷了一個(gè)發(fā)展的過程。從最基本的機(jī)器語言到匯編語言,并發(fā)展到高級的智能化語言,如visual C++、Visual Basic等。</p><p> 匯編語言(Assembly Language)是一種采用助記符表示的程序設(shè)計(jì)語言,即用助記符來表示指令的操作碼和操作數(shù),用符號或標(biāo)號代表地址、常量或變量。助記符一般都是英文單詞的縮寫,便于識別和記憶。使用匯編語言編寫的程序稱為匯編語言源程序
7、。匯編語言源程序不能由機(jī)器直接執(zhí)行,而必須翻譯成有機(jī)器代碼組成的目標(biāo)程序,這個(gè)翻譯的過程稱為匯編。把匯編語言源程序翻譯成目標(biāo)程序的軟件稱為匯編程序。</p><p> 匯編語言與機(jī)器語言密切相關(guān),它們之間有明顯的對應(yīng)關(guān)系。一條匯編語言指令對應(yīng)一條機(jī)器語言代碼,所以匯編語言和機(jī)器語言一樣都是面向機(jī)器的語言。使用匯編語言進(jìn)行程序設(shè)計(jì)能充分利用機(jī)器的硬件功能和結(jié)構(gòu)特點(diǎn),從而有效地加快程序的執(zhí)行速度,減少程序占用的存儲
8、空間。所以匯編語言大量用于編寫計(jì)算機(jī)系統(tǒng)程序、實(shí)時(shí)通信程序和實(shí)時(shí)控制程序等。</p><p> 匯編語言作為最基本的編程語言之一,匯編語言雖然應(yīng)用的范圍不算很廣,但重要性卻勿庸置疑,因?yàn)樗軌蛲瓿稍S多其它語言所無法完成的功能。就拿Linux內(nèi)核來講,雖然絕大部分代碼是用C語言編寫的,但仍然不可避免地在某些關(guān)鍵地方使用了匯編代碼,其中主要是在Linux的啟動部分。由于這部分代碼與硬件的關(guān)系非常密切,即使是C語言也
9、會有些力不從心,而匯編語言則能夠很好揚(yáng)長避短,最大限度地發(fā)揮硬件的性能。</p><p><b> 第二章 分析與設(shè)計(jì)</b></p><p><b> 2.1 題目</b></p><p><b> 匯編顯示楊輝三角</b></p><p><b> 2.2
10、 要求</b></p><p> 基本內(nèi)容:在提示信息下,從計(jì)算機(jī)鍵盤輸入一個(gè)滿足要求的數(shù)據(jù),在輸出提示信息后顯示相應(yīng)的楊輝三角。</p><p><b> 具體要求如下:</b></p><p> 要有提示信息的輸出顯示,例如程序執(zhí)行時(shí)直接顯示輸出提示信息“Please input a number:”然后等待用戶從計(jì)算機(jī)鍵
11、盤輸入具體數(shù)值,例如輸入“4”,然后換行顯示下一步提示信息,例如“The YangHui triangle:”最后顯示通過程序獲得的楊輝三角如下:</p><p> 分析楊輝三角具體算法,計(jì)算結(jié)果要求正確。輸出的楊輝三角要求上下左右對稱顯示,上下分別為兩個(gè)等腰三角形的形式,即要求分析總結(jié)每行行首空格數(shù)量,及三角中各個(gè)數(shù)之間空格的安排方法;</p><p> 要求最少要能夠輸出10階的楊
12、輝三角;</p><p> 提高要求:增大階數(shù)(最少到20階),可任意選擇正反三角顯示。</p><p> 2.3 方案設(shè)計(jì)與論證</p><p> 2.3.1 整體設(shè)計(jì)思路</p><p> 本課題要求用匯編顯示楊輝三角形,首先得了解什么是楊輝三角形。楊輝三角形,又稱賈憲三角形,帕斯卡三角形,是二項(xiàng)式系數(shù)在三角形中的一種幾何排列。其
13、每一行的數(shù)據(jù)都有其特定的規(guī)律,楊輝三角形又有其獨(dú)特的性質(zhì):1、每行數(shù)字左右對稱,由1開始逐漸變大,然后變小,最后回到1。2、第n行的數(shù)字個(gè)數(shù)為n個(gè)。3、第n行數(shù)字和為2^(n-1)。4、每個(gè)數(shù)字等于上一行的左右兩個(gè)數(shù)字之和,故可用此性質(zhì)寫出整個(gè)帕斯卡三角形。</p><p> 5、第n行的第1個(gè)數(shù)為1,第二個(gè)數(shù)為1×(n-1),第三個(gè)數(shù)為1×(n-1)×(n-2)/2,第四個(gè)數(shù)為1
14、×(n-1)×(n-2)/2×(n-3)/3···依此類推。</p><p> 在熟悉了楊輝三角形的產(chǎn)生原理,楊輝三角形內(nèi)各數(shù)據(jù)的計(jì)算方法之后,再在掌握了相關(guān)匯編知識以及一定編程能力的基礎(chǔ)上,我們對課題進(jìn)行了相關(guān)分析,總體來說,這個(gè)課題的關(guān)鍵點(diǎn)分為以下部分,厘清這些關(guān)鍵點(diǎn)也是作為明確整體設(shè)計(jì)思路的重要過程:</p><p>
15、(1)、提示信息的顯示。題目明確要求顯示中要有提示信息,實(shí)際上,根據(jù)需要,在本課題中我們又加了一些功能,當(dāng)然也必須要增加額外的提示信息。</p><p> (2)、階數(shù)的輸入功能。通過DOS系統(tǒng)功能調(diào)用,確定需要顯示楊輝三角形的行數(shù)與大小,能夠?qū)崿F(xiàn)簡單的人機(jī)交互。</p><p> (3)、編程得到需要在楊輝三角中顯示的數(shù)。基于以下思想:第n行的第1個(gè)數(shù)為1,第二個(gè)數(shù)為1×(
16、n-1),第三個(gè)數(shù)為1×(n-1)×(n-2)/2,第四個(gè)數(shù)為1×(n-1)×(n-2)/2×(n-3)/3···依此類推。</p><p> (4)、某數(shù)的顯示及換行。為了顯示的規(guī)范和美觀,必須考慮到數(shù)與數(shù)之間的空格數(shù),當(dāng)然,某數(shù)的顯示是能夠完整輸出楊輝三角形的基礎(chǔ)和前提。</p><p> (5)、新增
17、功能,判斷輸入數(shù)據(jù)是否滿足條件,判斷是否繼續(xù)執(zhí)行。考慮到本程序的使用范圍及使用者能連續(xù)使用顯示楊輝三角形的方便性,特增加了數(shù)據(jù)判斷和詢問繼續(xù)功能,使用者想要繼續(xù)執(zhí)行即輸入“Y”,程序自動從頭開始執(zhí)行,若輸入“N”,則退出。</p><p> 2.3.2 方案選擇</p><p> 1. 對于階數(shù)輸入功能,我們想到兩種方案。</p><p> 方案(1):參考相
18、關(guān)文獻(xiàn)上得知,可以通過DOS系統(tǒng)功能調(diào)用:鍵盤輸入單字符——1號系統(tǒng)功能調(diào)用,同時(shí)實(shí)現(xiàn)字符的輸入與顯示。</p><p> 調(diào)用格式:MOVAH,1</p><p><b> INT21H</b></p><p> 說明:1號功能調(diào)用無入口參數(shù),執(zhí)行時(shí)系統(tǒng)首先等待鍵盤輸入,待程序員按下任何一鍵,系統(tǒng)先檢查是否是Ctrl-Break鍵
19、。如果是則退出,否則將鍵入的字符的ASCII碼置入AL寄存器,并在屏幕上顯示該字符。</p><p> 方案(2):同樣是DOS系統(tǒng)功能調(diào)用,鍵盤輸入字符串——0AH號系統(tǒng)功能調(diào)用。</p><p> 說明:其功能是將鍵盤輸入的字符串寫入到內(nèi)存緩沖區(qū),因此調(diào)用之前必須事先定義一個(gè)緩沖區(qū)。緩沖區(qū)的第一個(gè)字節(jié)給出用來存放鍵入的字符數(shù),第二個(gè)留給系統(tǒng)填寫實(shí)際鍵入的字符個(gè)數(shù),從第三字節(jié)開始用來
20、存放鍵入的字符串,最后鍵入回車( ↙)鍵表示字符結(jié)束。</p><p> 對于方案(1),格式簡單,使用方便,易于理解,但是對于輸入多位數(shù),相對有點(diǎn)復(fù)雜。對于方案(2),從實(shí)際編程水平出發(fā),不太能夠嫻熟的使用該系統(tǒng)功能,調(diào)用格式復(fù)雜,而且鑒于該程序輸入的位數(shù)不超過兩位,所以我們最后選擇了方案(1)。</p><p><b> 2.4 結(jié)構(gòu)框圖</b></p&
21、gt;<p> 在編寫程序之前,明確其整個(gè)思路的流程圖是相當(dāng)重要的,所以我們花了一些時(shí)間來畫出流程圖,根據(jù)流程圖來寫實(shí)際程序。如圖2.4.1為本程序的總體匯編思路圖。</p><p> 圖2.4.1 程序總體流程圖</p><p> 第三章 實(shí)驗(yàn)程序及分析</p><p><b> 3.1 宏定義換行</b></p&
22、gt;<p> 為了簡化匯編語言源程序,可以把一些頻繁出現(xiàn)的程序段定義為“宏指令”,當(dāng)遇到這段程序時(shí),只要按宏指令名調(diào)用即可,不必重復(fù)寫許多指令,匯編程序在遇到宏指令時(shí)將其期待成相應(yīng)的代碼,這樣就有效地縮短匯編語言源程序的長度,使源程序易讀,也減少了由于重復(fù)書寫而引起的錯(cuò)誤。在本課題中,為了顯示楊輝三角,必然需要多次使用換行代碼,故將換行代碼定義為“宏指令”,有以上所述的諸多好處。宏定義如下:</p>&l
23、t;p> HUANH MACRO; 宏名為HUANH</p><p> MOV AH, 2 ; 使用2號功能,顯示器輸出字符</p><p> MOV DL, 13; 13即ASCII為0DH是回車符</p><p> INT 21H; DOS系統(tǒng)功能調(diào)用</p><p> MO
24、V DL, 10; 10即ASCII為0AH是換行符</p><p> INT 21H; DOS系統(tǒng)功能調(diào)用</p><p> ENDM; 宏定義結(jié)束</p><p> 3.2 階數(shù)輸入過程</p><p> 過程是程序的一部分,它可以被程序調(diào)用。每次可調(diào)用一個(gè)過程,當(dāng)過程中的指令執(zhí)行之后,控制返回調(diào)用它
25、的地方。過程的定義是用過程定義偽指令完成的。過程的定義有三個(gè)注意點(diǎn):①、過程名是自定義符,定義開始和結(jié)束時(shí)的過程名必須相同。②、過程名有三個(gè)屬性:段地址,偏移量和距離屬性(NEAR和FAR),匯編程序在匯編時(shí)根據(jù)過程類型生成段內(nèi)或段間的調(diào)用或返回指令代碼。③、在一個(gè)過程中,可以有多個(gè)RET指令。一個(gè)過程總是通過RET指令返回,RET常作為過程的最后一條指令。在了解以上說明及注意點(diǎn)的基礎(chǔ)上,我們根據(jù)實(shí)際需要定義了一個(gè)實(shí)現(xiàn)階數(shù)輸入功能的過程
26、。具體定義如下:</p><p> SHURU PROC; 輸入過程定義,數(shù)字存在BP</p><p> XOR BP,BP</p><p> MOV BX,10</p><p> MOV CX,3; 控制輸入位數(shù),外加一位回車</p><p> input:MOV AH,1
27、; DOS功能調(diào)用,鍵盤輸入和顯示數(shù)據(jù)</p><p><b> INT 21H</b></p><p> CMP AL,0DH ; 判斷是否以回車結(jié)束輸入</p><p><b> JZ OK</b></p><p> SUB AL,30H ; 將ASCII碼轉(zhuǎn)為1
28、6進(jìn)制數(shù)</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>&l
29、t;p> OK:RET; 返回調(diào)用過程的地方</p><p> SHURU ENDP; 過程定義結(jié)束</p><p> 3.3 數(shù)據(jù)判斷功能</p><p> 在第一套程序編寫完畢,試運(yùn)行時(shí),我們發(fā)現(xiàn),本程序能夠支持輸入的數(shù)據(jù)最大值為14,當(dāng)數(shù)據(jù)大于等于15時(shí),則程序出現(xiàn)除法溢出問題,并且自動關(guān)閉,所以為了能讓使用者不至于
30、輸入不合法的數(shù)據(jù),我們特增加了數(shù)據(jù)判斷功能,輸入數(shù)據(jù)滿足條件,允許執(zhí)行。否則,提示輸入數(shù)據(jù)超過范圍,要求重新輸入。程序段如下:</p><p> MAIN: MOVDX,OFFSET MSG ; 輸出字符串,請輸入一個(gè)數(shù)</p><p> MOV AH,9; 9號功能調(diào)用,輸出字符串</p><p><b> INT 21H<
31、;/b></p><p> CALL SHURU; 調(diào)用輸入函數(shù),顯示輸入的數(shù)</p><p> CMPBP,15; 輸入的數(shù)存在BP,與15比較</p><p> JB MZTJ; 滿足條件,允許執(zhí)行</p><p> HUANH; 否則換行</p><p>
32、 MOVDX,OFFSET ERROR; 準(zhǔn)備顯示錯(cuò)誤信息</p><p> MOV AH,9 </p><p> INT 21H </p><p> HUANH ; 繼續(xù)換行 </p>
33、<p> JMP MAIN; 無條件跳轉(zhuǎn)到MAIN,重新開始</p><p> MZTJ:HUANH</p><p><b> ···</b></p><p><b> ···</b></p><p><
34、b> ···</b></p><p> 3.4 詢問繼續(xù)模塊</p><p> 在首套程序編寫完畢運(yùn)行時(shí),每次我們只能運(yùn)行一次顯示楊輝三角的程序,以后還得重新鍵入相關(guān)命令,才能運(yùn)行,如此調(diào)試程序,效率低下,且可能混亂我們對現(xiàn)象的記錄。所以考慮到我們調(diào)試程序的高效性及對于使用者的便利性,我們又增加了一個(gè)詢問繼續(xù)模塊,當(dāng)?shù)谝淮螚钶x三角顯示完
35、畢,提示是否繼續(xù),如果鍵入“Y”,則程序自動重新開始執(zhí)行;如果鍵入“N”,則程序運(yùn)行結(jié)束,退出。程序段如下:</p><p> input1:HUANH</p><p> MOV DX,OFFSET CON; 顯示提問字符串,繼續(xù)?</p><p><b> MOV AH,9</b></p><p>
36、INT 21H; 判斷是否繼續(xù)</p><p> MOV AH,1 ; 鍵盤輸入數(shù)據(jù)</p><p><b> INT 21H</b></p><p> CMP AL,59H ; 判斷輸入的是否是Y</p><p> JNZexit1</p><p>
37、<b> HUANH</b></p><p> JMPNEAR PTR MAIN; 段內(nèi)直接近轉(zhuǎn)移,可以轉(zhuǎn)移到段內(nèi)的任何一個(gè)位置</p><p> exit1: MOV AH,4CH; 結(jié)束程序,返回DOS</p><p><b> INT 21H</b></p><p&
38、gt; 3.5 數(shù)值計(jì)算模塊</p><p> 本段數(shù)值計(jì)算,是正確顯示楊輝三角的關(guān)鍵,所以能否找到一種既簡便又能保證計(jì)算正確性的方法,是我們本階段工作的中心,我們參閱了很多資料,從幾種計(jì)算方法中,選取了最符合我們實(shí)際編程水平的,又在保證計(jì)算正確性的基礎(chǔ)上,寫出了如下的程序段,它的思想是基于:第n行的第1個(gè)數(shù)為1,第二個(gè)數(shù)為1×(n-1),第三個(gè)數(shù)為1×(n-1)×(n-2)/2
39、,第四個(gè)數(shù)為1×(n-1)×(n-2)/2×(n-3)/3···依此類推。</p><p> 如圖3.5.1為本段程序的流程圖,文字描述即為上段。</p><p> 圖3.6.1 數(shù)值計(jì)算流程圖</p><p> Calculate:DEC b; b每次減1相乘</p>&l
40、t;p><b> MUL b</b></p><p> DIV c; 除以c,再加1</p><p><b> INC c</b></p><p> CMP b,0; b是否為0</p><p><b> JZ ok1</b></p&g
41、t;<p> PUSH AX; 保存所得數(shù)據(jù)</p><p> MOV d,0; 此處d為位數(shù),為了顯示后面的空格</p><p> CALL ShowNum</p><p> MOV AX,6; 預(yù)設(shè),總共顯示的空格數(shù)為6個(gè)單位</p><p> SUB AX,d; 還需顯示多少空格</p
42、><p> CALL Showspace1</p><p><b> POP AX</b></p><p> CALL Calculate; 繼續(xù)執(zhí)行</p><p><b> ok1:RET </b></p><p><b> 3.6 顯示模塊
43、</b></p><p> 3.6.1 數(shù)據(jù)顯示</p><p> 得到楊輝三角中的某一個(gè)數(shù)后,接下來的任務(wù)就是如何將它顯示出來。不能完成這項(xiàng)工作,就不能完成整個(gè)課題。我們小組在參考平時(shí)微機(jī)實(shí)驗(yàn)的基礎(chǔ)上,自己分析,找到了一種正確的顯示方法:可以將某數(shù)不斷除以10,取出余數(shù)顯示,直到商為0,停止除法。例如:要顯示的數(shù)是345,除以10后,商為34,余數(shù)為5,5壓入堆棧。然后將
44、34除以10,商為3,余數(shù)為4,4壓入堆棧。最后將3除以10,商為0,余數(shù)為3,3壓入堆棧。彈出堆棧,依次顯示,在匯編中,使用無符號數(shù)除法指令DIV OP。指令DIV BL,被除數(shù)存在AX中,整數(shù)商存在AL,余數(shù)存在AH。所以在除以10后,只需將AH中的值取出,下一次除法,可以用邏輯指令A(yù)ND將其高八位屏蔽,調(diào)用2號功能,依次顯示。</p><p> 為了能充分體現(xiàn)我們編程的思想,如圖3.6.1是數(shù)據(jù)顯示部
45、分的流程圖,以下編寫的程序也是基于這種思想。</p><p> 圖3.6.1 數(shù)據(jù)顯示流程圖</p><p><b> 具體程序段如下:</b></p><p> ShowNum: MOV BX, 10; BX中存除數(shù)10</p><p> CMP AX, 0; 除法運(yùn)算是否完畢 </
46、p><p><b> JZ ok2</b></p><p> INC d; 此處d為位數(shù),以確定輸出的空格數(shù)</p><p> DIV BL; 除以10,整數(shù)商存在AL,余數(shù)存在AH</p><p> PUSH AX</p><p> AND AX, 00FFH
47、; 屏蔽高八位,取商</p><p> CALL SHOWNum</p><p><b> POP DX</b></p><p> MOV DL, DH; 取出高八位,即為要顯示的余數(shù)</p><p> OR DL, 30H; 轉(zhuǎn)為ASCII碼</p><p>
48、MOV AH, 2</p><p><b> INT 21H</b></p><p><b> ok2:RET</b></p><p> 3.6.2 空格顯示</p><p> 空格的顯示,是為了調(diào)整整體楊輝三角的布局,使其輸出為美觀的等腰三角形。前期,我們采用在方格紙上試書寫的方式
49、,確定需要顯示的空格數(shù)。實(shí)際編程中,使用到了3中空格形式,第一種是首數(shù)字1之前的空格,定義為AHEAD,第二種是首數(shù)字1后面的空格,定義為BETWEEN,第三種是和需顯示的數(shù)字位數(shù)相關(guān)的空格,定義為BACK,具體在程序中定義如下:AHEAD DB ' $'</p><p> BETWEENDB' $'</p><p> B
50、ACKDB' $'</p><p> 定義了這三種空格后,需要將其顯示,這里我們使用DOS功能調(diào)用,9號系統(tǒng)功能調(diào)用——輸出字符串。功能是將指定的內(nèi)存緩沖區(qū)中的字符串在屏幕上顯示出來,緩沖區(qū)的字符串以“$”為結(jié)束標(biāo)志。</p><p> Showspace:MOV BX, AX; 首行顯示空格,空格數(shù)即為輸入的階數(shù)</p><p&
51、gt; MOV AH, 9</p><p> MOV DX,OFFSET AHEAD</p><p> nexts:CMP BX, 0; BX減1,控制輸出的空格數(shù)</p><p><b> JZ dones</b></p><p><b> INT 21H</b><
52、;/p><p><b> DEC BX</b></p><p> JMP nexts</p><p> dones:RET; 完成顯示,返回</p><p> Showspace1:MOV BX, AX; AX為6-數(shù)據(jù)位數(shù)</p><p> MOV AH, 9&
53、lt;/p><p> MOV DX,OFFSET BACK</p><p> next:CMP BX, 0</p><p><b> JZ done</b></p><p><b> INT 21H</b></p><p><b> DEC B
54、X</b></p><p><b> JMP next</b></p><p> done:RET </p><p> 第四章 實(shí)驗(yàn)結(jié)果及問題處理</p><p><b> 4.1 實(shí)驗(yàn)結(jié)果</b></p><p> 通過對程序的多次完善,現(xiàn)在能夠
55、達(dá)到的要求為:最小輸出1階,最大輸出14階的正反楊輝三角形,能夠判斷輸入數(shù)據(jù)是否合法,能夠詢問是否繼續(xù)輸出,當(dāng)輸入階數(shù)較小時(shí),也能夠很好的顯示輸出,輸出的正反楊輝三角形美觀、清晰,實(shí)現(xiàn)了題目所提出的基本要求,對于遇到的一些問題,將在下節(jié)討論,下面附上一些運(yùn)行調(diào)試圖片。</p><p> 如圖4.1.1和圖4.1.2為正反楊輝三角顯示圖, 圖4.1.3為當(dāng)輸入階數(shù)超出范圍時(shí)的提示錯(cuò)誤信息,并要求重新輸入數(shù)據(jù)。&l
56、t;/p><p> 圖4.1.1 11階楊輝三角</p><p> 圖4.1.2 繼續(xù)輸出的4階和6階楊輝三角</p><p> 圖4.1.3 輸入階數(shù)不合法的提示界面</p><p> 4.2出現(xiàn)的問題以及解決的方案 </p><p> 4.2.1 數(shù)據(jù)輸入問題</p><p&
57、gt; 對于數(shù)據(jù)輸入,我們當(dāng)初考慮到了兩種方法,在方案選擇中已論證了兩種方法各自的優(yōu)缺點(diǎn),本來想使用0AH號系統(tǒng)功能調(diào)用,因?yàn)樗苤苯拥玫捷斎氲淖址幌?號系統(tǒng)功能調(diào)用那樣,只能夠輸入單字符,但是使用0AH號系統(tǒng)功能調(diào)用實(shí)際編寫程序時(shí),卻不清楚輸入的字符串存放在內(nèi)存的哪個(gè)區(qū)域,雖然參考文獻(xiàn)上有相關(guān)說明,但是我們還是未能取出輸入的字符串,這對于我們是極大的打擊,因?yàn)殡A數(shù)輸入是完成整個(gè)課題的第一步,這一步基礎(chǔ)不做好,更不要提后面的計(jì)
58、算、顯示了。</p><p> 在要求首先能實(shí)現(xiàn)功能的情況下,我們還是選擇了1號系統(tǒng)功能調(diào)用,但是要加一個(gè)循環(huán)控制,控制輸入最大位數(shù)和ENTER的ASCII碼判斷輸入結(jié)束語句,因?yàn)槭禽斎氲膯巫址?,其ASCII碼存在AL寄存器中,所以對于2位數(shù),必須要先將其ASCII碼轉(zhuǎn)為16進(jìn)制數(shù),將首先輸入的數(shù)乘以10,再加上第二次輸入的數(shù),得到實(shí)際鍵入的數(shù)值?;谝陨纤枷?,我們寫出了上述3.2節(jié)的階數(shù)輸入功能程序。<
59、/p><p> 4.2.2 除法溢出問題</p><p> 由查閱資料可知,對于高階的楊輝三角形,其內(nèi)部的數(shù)據(jù)會變得相當(dāng)大,當(dāng)階數(shù)為15階時(shí),其最大的數(shù)已經(jīng)超過65536,在數(shù)學(xué)上65536并不是一個(gè)特殊的數(shù),但是在計(jì)算機(jī)系統(tǒng)中,65536=2^16,在8086CPU內(nèi)部,有8個(gè)16為的內(nèi)部寄存器,當(dāng)然累加器AX也為16位,AX中能存放的最大的數(shù)為65536,分為高八位(AH)和低八位(A
60、L),使用匯編的無符號數(shù)除法指令DIV OP,指令中給出的操作數(shù)是除數(shù),它可以是8位/16位通用寄存器及存儲器;被除數(shù)隱含在AX(字節(jié)除)或DX、AX(字除法)中。</p><p> 查閱資料得到,可以使用特定指令,實(shí)現(xiàn)整數(shù)商存至AX,余數(shù)存至DX中,這樣能夠提高數(shù)值的上限,但是隨之而來的問題是,對于編程的復(fù)雜度的提高,楊輝三角的顯示格式問題,數(shù)據(jù)除以10取余數(shù)的顯示問題,從而影響到整個(gè)課題。所以考慮到限定的
61、時(shí)間,輸出的美觀等因素,取折中選擇,我們只做到了14階,對于大于等于15階的階數(shù)輸入,我們增加了判斷語句,避免除法溢出問題。</p><p> 4.2.3 數(shù)據(jù)計(jì)算問題</p><p> 眾所周知,楊輝三角形中的數(shù)據(jù)是有規(guī)律排列的,在上文整體設(shè)計(jì)思路中已經(jīng)闡述了一些規(guī)律。對于數(shù)據(jù)的計(jì)算,我們一開始考慮到的是某數(shù)等于其上一行左右兩數(shù)之和,依照此規(guī)律也可以寫出整個(gè)楊輝三角形,而且不需要進(jìn)行
62、乘除法運(yùn)算,不會出現(xiàn)除法溢出問題。但是如何得到這個(gè)數(shù)的上一行的左右兩數(shù),這兩個(gè)數(shù)該存在哪里,卻是一個(gè)不容忽視的問題,而且會占用很大的內(nèi)存空間。</p><p> 后來我們查閱資料,又得到一些規(guī)律,即第n行的第1個(gè)數(shù)為1,第二個(gè)數(shù)為1×(n-1),第三個(gè)數(shù)為1×(n-1)×(n-2)/2,第四個(gè)數(shù)為1×(n-1)×(n-2)/2×(n-3)/3·
63、;··依此類推。這樣可以用DEC n和INC c,用乘除法指令就可運(yùn)算出正確結(jié)果,但是前提是輸入的階數(shù)有限制,上一節(jié)已經(jīng)論證。為了能知道這一行到底要運(yùn)算多少次,我們又加了一個(gè)CX控制其運(yùn)算次數(shù),在計(jì)算前,對某一行的n,都要進(jìn)行壓棧保護(hù)。綜上所述,我們寫出了上節(jié)結(jié)束輸入模塊的程序。事實(shí)表明,這樣的方法能夠計(jì)算出正確的數(shù)值。</p><p><b> 第五章 總結(jié)與體會</b
64、></p><p> 微機(jī)原理與接口技術(shù),是我們電子科學(xué)與技術(shù)專業(yè)學(xué)生的專業(yè)課,由此可知,這門課對于我們的意義是多么重大。所以,在做這次微機(jī)的課程設(shè)計(jì)時(shí),更是不敢怠慢。唯恐不能正確得到設(shè)計(jì)效果。</p><p> 這次我們的課程設(shè)計(jì)的題目是:匯編顯示楊輝三角。剛拿到這個(gè)題目的時(shí)候,確實(shí)不知道從何下手,但是有句話說得好:不逼自己一把,怎么知道自己不可以?我們首先從什么是楊輝三角下手
65、,查閱了相關(guān)資料,總結(jié)體會了楊輝三角的一些規(guī)律,這些規(guī)律能夠在我們編程過程中得以體現(xiàn),所以這個(gè)過程是必須的。</p><p> 接下來,在熟悉了楊輝三角的基礎(chǔ)上,我們結(jié)合編程,總結(jié)了有幾個(gè)工作要做,一是:字符串的顯示;二是:楊輝三角值得計(jì)算;三是:這些數(shù)值的顯示;四是:輸出的排版問題,保證輸出美觀正確。把整個(gè)課題,分為以上四個(gè)部分后,各個(gè)擊破,從而高效的完成整個(gè)課題是一種很實(shí)用、有效的方法。雖然在這個(gè)過程中遇到
66、了不少問題,但是我們小組成員都很積極的討論解決問題的方法。最后通過整合,得到了整個(gè)程序??傮w來說,這個(gè)程序雖然還不完美,但是代表著我們這一段時(shí)間以來的成果,我們都很欣慰,能夠?qū)崿F(xiàn)題目的要求。</p><p> 這次微機(jī)原理課程設(shè)計(jì)歷時(shí)兩個(gè)星期,在整整兩星期的日子里,可以說苦多于甜,但是可以學(xué)到很多很多的的東西,同時(shí)不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)到過的知識。以前在上課的時(shí)候,老師經(jīng)
67、常強(qiáng)調(diào)在寫一個(gè)程序的時(shí)候,一定要事先把程序原理方框圖化出來,但是我開始總覺得這樣做沒必要,很浪費(fèi)時(shí)間。但是,這次課程設(shè)計(jì)完全改變了我以前的那種錯(cuò)誤的認(rèn)識,以前我接觸的那些程序都是很短、很基礎(chǔ)的,但是在課程設(shè)計(jì)中碰到的那些需要很多代碼才能完成的任務(wù),畫程序方框圖是很有必要的。因?yàn)橥ㄟ^程序方框圖,在做設(shè)計(jì)的過程中,我們每一步要做什么,每一步要完成什么任務(wù)都有一個(gè)很清楚的思路,而且在程序測試的過程中也有利于查錯(cuò)。</p><
68、;p> 其次,以前對于編程工具的使用還處于一知半解的狀態(tài)上,但是經(jīng)過一段上機(jī)的實(shí)踐,對于怎么去排錯(cuò)、查錯(cuò),怎么去看每一步的運(yùn)行結(jié)果,怎么去了解每個(gè)寄存器的內(nèi)容以確保程序的正確性上都有了很大程度的提高。</p><p> 通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實(shí)際動手能力和獨(dú)
69、立思考的能力。在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固。</p><p> 這次課程設(shè)計(jì)終于順利完成了,在設(shè)計(jì)中遇到了很多編程問題,最后在老師的辛勤指導(dǎo)下,終于游逆而解。同時(shí)學(xué)得到很多實(shí)用的知識,在此我表示感謝!同時(shí),對給過我?guī)椭乃型瑢W(xué)表示忠心的感謝!</p>
70、<p><b> 參考文獻(xiàn)</b></p><p> [1] 朱金鈞,麻新旗,等. 微型計(jì)算機(jī)原理及應(yīng)用技術(shù). 機(jī)械工業(yè)出版社,第2版.</p><p><b> 附錄</b></p><p> 匯編輸出楊輝三角程序代碼:</p><p> HUANHMACRO; 宏
71、定義5句代碼實(shí)現(xiàn)換行</p><p> MOV AH, 2 </p><p> MOV DL, 13</p><p><b> INT 21H</b></p><p> MOV DL, 10</p><p><b> INT 21H</b>
72、</p><p><b> ENDM</b></p><p> DATA SEGMENT</p><p> MSG DB 'Please input a number: $'</p><p> RESULTDB'The YiangHui triangle:$'</
73、p><p> CON DB 'Do you want to continue?(Y/N): $'</p><p> ERROR DB'Data out of range!$'</p><p> AHEAD DB ' $'</p><p> BETWEENDB
74、' $'</p><p> BACKDB' $'</p><p> aDW?;a為階數(shù)</p><p> bDW?;b是行數(shù)</p><p><b> cDW?</b></p><p> dDW
75、?;記錄位數(shù),控制空格數(shù)</p><p><b> DATA ENDS</b></p><p> CODE SEGMENT </p><p> ASSUME CS:CODE,DS:DATA </p><p> SHURU PROC;輸入子程序,數(shù)字存在BP</p><p&
76、gt; XOR BP,BP</p><p> MOV BX,10</p><p> MOV CX,3;控制輸入位數(shù),外加一位回車</p><p> input:MOV AH,1 ;鍵盤輸入數(shù)據(jù)</p><p><b> INT 21H</b></p><p&g
77、t; CMP AL,0DH ;以回車結(jié)束輸入</p><p><b> JZ OK</b></p><p> SUB AL,30H ;化ASCII為HEX</p><p> CBW ;字節(jié)擴(kuò)展為字</p><p> XCHG AX,BP</p><p&g
78、t; MUL BX ;擴(kuò)大10倍</p><p> ADD BP,AX ;加一位</p><p> LOOP input</p><p><b> OK:</b></p><p><b> RET</b></p><p> SHURU E
79、NDP</p><p> START: MOV AX,DATA</p><p> MOV DS,AX</p><p> MAIN: MOVDX,OFFSET MSG; 輸出字符串,請輸入一個(gè)數(shù)</p><p> MOV AH,9</p><p><b> INT
80、21H</b></p><p> CALL SHURU; 調(diào)用輸入函數(shù),顯示輸入的數(shù)</p><p> CMPBP,15; 輸入的數(shù)在BP里</p><p> JB MZTJ; 滿足條件</p><p><b> HUANH</b></p>
81、<p> MOVDX,OFFSET ERROR; 準(zhǔn)備顯示錯(cuò)誤信息</p><p> MOV AH,9 </p><p> INT 21H </p><p> HUANH </p&
82、gt;<p> JMP MAIN</p><p> MZTJ:HUANH</p><p> MOV DX,OFFSET RESULT; 顯示提示字符串</p><p> MOV AH,9</p><p> INT 21H </p><p><b> HUANH&
83、lt;/b></p><p> MOV AX,BP;準(zhǔn)備顯示楊輝三角,AX=BP=階數(shù)</p><p> CALL Showspace</p><p> MOV DL,'1' ;第一行顯示空格完畢,輸出'1'</p><p> MOV AH,2</
84、p><p><b> INT 21H</b></p><p> CMP BP,1;階數(shù)BP與1比較</p><p> JZ exit</p><p> MOV b,2;b=2</p><p> MOV CX,BP;CX為階數(shù)</p><p
85、> MOV a,BP;a為階數(shù)</p><p><b> DEC a</b></p><p> CALL yhsj</p><p> exit:HUANH</p><p> MOV AX,BP;準(zhǔn)備顯示楊輝三角,AX=BP=階數(shù)</p><p>
86、 CALL Showspace</p><p> MOV DL,'1' ;第一行顯示空格完畢,輸出'1'</p><p> MOV AH,2</p><p><b> INT 21H</b></p><p> JMPNEAR PTR input
87、1</p><p> yhsj:MOV c,1;楊輝三角</p><p><b> HUANH</b></p><p><b> DEC BP</b></p><p> MOV AX,BP</p><p> CALL Showspace
88、 ;控制首數(shù)字前面的空格數(shù)</p><p> MOV DL,'1' ;首數(shù)字必為1</p><p> MOV AH,2</p><p><b> INT 21H</b></p><p> MOVDX,OFFSET BETWEEN</p><p
89、> MOV AH,9</p><p><b> INT 21H</b></p><p> MOV AX,1</p><p><b> PUSH b</b></p><p> CALL Calculate</p><p><b>
90、 POP b</b></p><p> INC b ;b為行數(shù)</p><p><b> DEC CX</b></p><p> CMP CX,1</p><p> JA yhsj</p><p><b> DEC b</b&
91、gt;</p><p><b> CMP b,2</b></p><p><b> JZ ok3</b></p><p> CALL fyhsj</p><p> ok3: HUANH</p><p><b> INC a</b
92、></p><p> MOV AX,a</p><p> CALL Showspace</p><p> MOV DL,'1'</p><p> MOV AH,2</p><p><b> INT 21H</b></p><p
93、> input1:HUANH;判斷是否繼續(xù)</p><p> MOV DX,OFFSET CON;顯示提問字符串,繼續(xù)?</p><p> MOV AH,9</p><p><b> INT 21H</b></p><p> MOV AH,1 ;鍵盤輸入數(shù)據(jù)</
94、p><p><b> INT 21H</b></p><p> CMP AL,59H ;以回車結(jié)束輸入</p><p> JNZexit1</p><p><b> HUANH</b></p><p> JMPNEAR PTR MAIN</p
95、><p> exit1: MOV AH,4CH</p><p><b> INT 21H</b></p><p> fyhsj:MOV c,1;反楊輝三角</p><p><b> HUANH</b></p><p><b> INC
96、 BP</b></p><p> MOV AX,BP</p><p> CALL Showspace</p><p> MOV DL,'1'</p><p> MOV AH,2</p><p> INT 21H </p><p>
97、MOV DX,OFFSET BETWEEN</p><p> MOV AH,9</p><p><b> INT 21H</b></p><p> MOV AX,1</p><p><b> DEC b</b></p><p><b>
98、 PUSH b</b></p><p> CALL Calculate</p><p><b> POP b</b></p><p><b> INC CX</b></p><p> CMP CX,a</p><p> JB f
99、yhsj</p><p><b> RET</b></p><p> Showspace:</p><p> MOV BX, AX;首行顯示空格,空格數(shù)即為輸入的階數(shù)</p><p> MOV AH, 9</p><p> MOV DX,OFFSET AHEAD</
100、p><p><b> nexts:</b></p><p> CMP BX, 0;BX減1,控制輸出的空格數(shù)</p><p> JZ dones</p><p><b> INT 21H</b></p><p><b> DEC BX&l
101、t;/b></p><p> JMP nexts</p><p><b> dones:</b></p><p><b> RET</b></p><p> Calculate:DEC b</p><p><b> MUL b</
102、b></p><p><b> DIV c</b></p><p><b> INC c</b></p><p><b> CMP b,0</b></p><p><b> JZ ok1</b></p><
103、;p> PUSH AX ;保存所得數(shù)據(jù)</p><p><b> MOV d,0</b></p><p> CALL ShowNum</p><p> MOV AX,6</p><p> SUB AX,d</p><p> CALL Showspace
104、1</p><p><b> POP AX</b></p><p> CALL Calculate</p><p><b> ok1:</b></p><p><b> RET</b></p><p> ShowNum:MOV B
105、X, 10;顯示某數(shù),并記錄位數(shù)</p><p> CMP AX, 0</p><p><b> JZ ok2</b></p><p><b> INC d</b></p><p><b> DIV BL</b></p><p&
106、gt;<b> PUSH AX</b></p><p> AND AX, 00FFH</p><p> CALL SHOWNum</p><p><b> POP DX</b></p><p> MOV DL, DH</p><p> OR
107、 DL, 30H</p><p> MOV AH, 2</p><p><b> INT 21H</b></p><p><b> ok2:</b></p><p><b> RET</b></p><p> Showspace1:
108、MOV BX, AX</p><p> MOV AH, 9</p><p> MOV DX,OFFSET BACK</p><p> next:CMP BX, 0</p><p> JZ done</p><p><b> INT 21H</b></p
109、><p><b> DEC BX</b></p><p> JMP next</p><p><b> done:</b></p><p><b> RET </b></p><p> CODE ENDS </p><
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 微機(jī)原理課程設(shè)計(jì)-楊輝三角課程設(shè)計(jì)
- 匯編課程設(shè)計(jì)報(bào)告--- 等腰三角形的輸出
- 輸出以下的楊輝三角形要求輸出8行111
- 微機(jī)原理與匯編語言課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)
- matlab________m文件實(shí)現(xiàn)_楊輝三角
- 微機(jī)原理課程設(shè)計(jì)報(bào)告
- 微機(jī)原理課程設(shè)計(jì).rar
- 楊輝三角的規(guī)律以及推導(dǎo)公式
- matlab________m文件實(shí)現(xiàn)_楊輝三角
- 微機(jī)原理課程設(shè)計(jì)報(bào)告
- 2017微機(jī)原理課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì).rar
- 微機(jī)原理課程設(shè)計(jì)報(bào)告
- 《微機(jī)原理》課程設(shè)計(jì)報(bào)告
- 微機(jī)原理課程設(shè)計(jì)報(bào)告
- 微機(jī)原理課程設(shè)計(jì)課程設(shè)計(jì)----微機(jī)內(nèi)存擴(kuò)充卡
- 鍵盤鋼琴匯編語言程序設(shè)計(jì)—微機(jī)原理課程設(shè)計(jì)
評論
0/150
提交評論