第一篇:微機原理課程設計——輸出楊輝三角
目錄
第一章 緒論...................................................................................................................................1 第二章 分析與設計.......................................................................................................................2 2.1 題目.......................................................................................................................................................2 2.2 要求.......................................................................................................................................................2 2.3 方案設計與論證...................................................................................................................................3 2.3.1 整體設計思路...........................................................................................................................3 2.3.2 方案選擇...................................................................................................................................3 2.4 結構框圖...............................................................................................................................................4 3.1 宏定義換行...........................................................................................................................................5 3.2 階數輸入過程.......................................................................................................................................5 3.3 數據判斷功能.......................................................................................................................................6 3.4 詢問繼續模塊...................................................................7 3.5 數值計算模塊.......................................................................................................................................7 3.6 顯示模塊...............................................................................................................................................9 3.6.1 數據顯示.................................................................9 3.6.2 空格顯示................................................................10
第四章 實驗結果及問題處理.....................................................................................................12 4.1 實驗結果.............................................................................................................................................12 4.2出現的問題以及解決的方案..............................................................................................................13 4.2.1 數據輸入問題.........................................................................................................................13 4.2.2 除法溢出問題.........................................................................................................................13 4.2.3 數據計算問題.........................................................................................................................14 第五章 總結與體會.....................................................................................................................15 參考文獻.......................................................................................................................................17 附錄...............................................................................................................................................18
第一章 緒論
隨著電子計算機技術的不斷發展,微型計算機系統的功能越來越強,而關于計算機的程序設計語言也經歷了一個發展的過程。從最基本的機器語言到匯編語言,并發展到高級的智能化語言,如visual C++、Visual Basic等。
匯編語言(Assembly Language)是一種采用助記符表示的程序設計語言,即用助記符來表示指令的操作碼和操作數,用符號或標號代表地址、常量或變量。助記符一般都是英文單詞的縮寫,便于識別和記憶。使用匯編語言編寫的程序稱為匯編語言源程序。匯編語言源程序不能由機器直接執行,而必須翻譯成有機器代碼組成的目標程序,這個翻譯的過程稱為匯編。把匯編語言源程序翻譯成目標程序的軟件稱為匯編程序。
匯編語言與機器語言密切相關,它們之間有明顯的對應關系。一條匯編語言指令對應一條機器語言代碼,所以匯編語言和機器語言一樣都是面向機器的語言。使用匯編語言進行程序設計能充分利用機器的硬件功能和結構特點,從而有效地加快程序的執行速度,減少程序占用的存儲空間。所以匯編語言大量用于編寫計算機系統程序、實時通信程序和實時控制程序等。
匯編語言作為最基本的編程語言之一,匯編語言雖然應用的范圍不算很廣,但重要性卻勿庸置疑,因為它能夠完成許多其它語言所無法完成的功能。就拿Linux內核來講,雖然絕大部分代碼是用C語言編寫的,但仍然不可避免地在某些關鍵地方使用了匯編代碼,其中主要是在Linux的啟動部分。由于這部分代碼與硬件的關系非常密切,即使是C語言也會有些力不從心,而匯編語言則能夠很好揚長避短,最大限度地發揮硬件的性能。
第二章 分析與設計
2.1 題目
匯編顯示楊輝三角
2.2 要求
基本內容:在提示信息下,從計算機鍵盤輸入一個滿足要求的數據,在輸出提示信息后顯示相應的楊輝三角。
具體要求如下:
(1)要有提示信息的輸出顯示,例如程序執行時直接顯示輸出提示信息“Please input a number:”然后等待用戶從計算機鍵盤輸入具體數值,例如輸入“4”,然后換行顯示下一步提示信息,例如“The YangHui triangle:”最后顯示通過程序獲得的楊輝三角如下:
(2)分析楊輝三角具體算法,計算結果要求正確。輸出的楊輝三角要求上下左右對稱顯示,上下分別為兩個等腰三角形的形式,即要求分析總結每行行首空格數量,及三角中各個數之間空格的安排方法;(3)要求最少要能夠輸出10階的楊輝三角;
(4)提高要求:增大階數(最少到20階),可任意選擇正反三角顯示。
2.3 方案設計與論證
2.3.1 整體設計思路
本課題要求用匯編顯示楊輝三角形,首先得了解什么是楊輝三角形。楊輝三角形,又稱賈憲三角形,帕斯卡三角形,是二項式系數在三角形中的一種幾何排列。其每一行的數據都有其特定的規律,楊輝三角形又有其獨特的性質:
1、每行數字左右對稱,由1開始逐漸變大,然后變小,最后回到1。
2、第n行的數字個數為n個。
3、第n行數字和為2^(n-1)。
4、每個數字等于上一行的左右兩個數字之和,故可用此性質寫出整個帕斯卡三角形。
5、第n行的第1個數為1,第二個數為1×(n-1),第三個數為1×(n-1)×(n-2)/2,第四個數為1×(n-1)×(n-2)/2×(n-3)/3···依此類推。
在熟悉了楊輝三角形的產生原理,楊輝三角形內各數據的計算方法之后,再在掌握了相關匯編知識以及一定編程能力的基礎上,我們對課題進行了相關分析,總體來說,這個課題的關鍵點分為以下部分,厘清這些關鍵點也是作為明確整體設計思路的重要過程:
(1)、提示信息的顯示。題目明確要求顯示中要有提示信息,實際上,根據需要,在本課題中我們又加了一些功能,當然也必須要增加額外的提示信息。
(2)、階數的輸入功能。通過DOS系統功能調用,確定需要顯示楊輝三角形的行數與大小,能夠實現簡單的人機交互。
(3)、編程得到需要在楊輝三角中顯示的數?;谝韵滤枷耄旱趎行的第1個數為1,第二個數為1×(n-1),第三個數為1×(n-1)×(n-2)/2,第四個數為1×(n-1)×(n-2)/2×(n-3)/3···依此類推。
(4)、某數的顯示及換行。為了顯示的規范和美觀,必須考慮到數與數之間的空格數,當然,某數的顯示是能夠完整輸出楊輝三角形的基礎和前提。
(5)、新增功能,判斷輸入數據是否滿足條件,判斷是否繼續執行。考慮到本程序的使用范圍及使用者能連續使用顯示楊輝三角形的方便性,特增加了數據判斷和詢問繼續功能,使用者想要繼續執行即輸入“Y”,程序自動從頭開始執行,若輸入“N”,則退出。2.3.2 方案選擇
1.對于階數輸入功能,我們想到兩種方案。
方案(1):參考相關文獻上得知,可以通過DOS系統功能調用:鍵盤輸入單字符——
號系統功能調用,同時實現字符的輸入與顯示。
調用格式:MOV INT
AH,1 21H 說明:1號功能調用無入口參數,執行時系統首先等待鍵盤輸入,待程序員按下任何一鍵,系統先檢查是否是Ctrl-Break鍵。如果是則退出,否則將鍵入的字符的ASCII碼置入AL寄存器,并在屏幕上顯示該字符。
方案(2):同樣是DOS系統功能調用,鍵盤輸入字符串——0AH號系統功能調用。說明:其功能是將鍵盤輸入的字符串寫入到內存緩沖區,因此調用之前必須事先定義一個緩沖區。緩沖區的第一個字節給出用來存放鍵入的字符數,第二個留給系統填寫實際鍵入的字符個數,從第三字節開始用來存放鍵入的字符串,最后鍵入回車(↙)鍵表示字符結束。
對于方案(1),格式簡單,使用方便,易于理解,但是對于輸入多位數,相對有點復雜。對于方案(2),從實際編程水平出發,不太能夠嫻熟的使用該系統功能,調用格式復雜,而且鑒于該程序輸入的位數不超過兩位,所以我們最后選擇了方案(1)。
2.4 結構框圖
在編寫程序之前,明確其整個思路的流程圖是相當重要的,所以我們花了一些時間來畫出流程圖,根據流程圖來寫實際程序。如圖2.4.1為本程序的總體匯編思路圖。
圖2.4.1 程序總體流程圖
第三章 實驗程序及分析
3.1 宏定義換行
為了簡化匯編語言源程序,可以把一些頻繁出現的程序段定義為“宏指令”,當遇到這段程序時,只要按宏指令名調用即可,不必重復寫許多指令,匯編程序在遇到宏指令時將其期待成相應的代碼,這樣就有效地縮短匯編語言源程序的長度,使源程序易讀,也減少了由于重復書寫而引起的錯誤。在本課題中,為了顯示楊輝三角,必然需要多次使用換行代碼,故將換行代碼定義為“宏指令”,有以上所述的諸多好處。宏定義如下:
HUANH
MACRO
;宏名為HUANH
;使用2號功能,顯示器輸出字符;13即ASCII為0DH是回車符
;DOS系統功能調用
;10即ASCII為0AH是換行符;DOS系統功能調用;宏定義結束
MOV AH, 2
MOV DL, 13 INT 21H
MOV DL, 10 INT 21H ENDM
3.2 階數輸入過程
過程是程序的一部分,它可以被程序調用。每次可調用一個過程,當過程中的指令執行之后,控制返回調用它的地方。過程的定義是用過程定義偽指令完成的。過程的定義有三個注意點:①、過程名是自定義符,定義開始和結束時的過程名必須相同。②、過程名有三個屬性:段地址,偏移量和距離屬性(NEAR和FAR),匯編程序在匯編時根據過程類型生成段內或段間的調用或返回指令代碼。③、在一個過程中,可以有多個RET指令。一個過程總是通過RET指令返回,RET常作為過程的最后一條指令。在了解以上說明及注意點的基礎上,我們根據實際需要定義了一個實現階數輸入功能的過程。具體定義如下:
SHURU
PROC XOR
BP,BP MOV BX,10 MOV CX,3
;控制輸入位數,外加一位回車
;輸入過程定義,數字存在BP
input:
MOV AH,1 INT CMP JZ
SUB 21H
;DOS功能調用,鍵盤輸入和顯示數據
AL,0DH OK AL,30H
;判斷是否以回車結束輸入
;將ASCII碼轉為16進制數
;字節擴展為字,為了下一條交換指令 CBW
XCHG AX,BP MUL ADD BX
;擴大10倍;加一位 BP,AX
LOOP input RET
;返回調用過程的地方;過程定義結束 OK: SHURU
ENDP
3.3 數據判斷功能
在第一套程序編寫完畢,試運行時,我們發現,本程序能夠支持輸入的數據最大值為14,當數據大于等于15時,則程序出現除法溢出問題,并且自動關閉,所以為了能讓使用者不至于輸入不合法的數據,我們特增加了數據判斷功能,輸入數據滿足條件,允許執行。否則,提示輸入數據超過范圍,要求重新輸入。程序段如下:
MAIN: MOV
DX,OFFSET MSG
;輸出字符串,請輸入一個數;9號功能調用,輸出字符串 MOV AH,9 INT 21H CALL SHURU CMP JB BP,15 MZTJ
;調用輸入函數,顯示輸入的數;輸入的數存在BP,與15比較;滿足條件,允許執行;否則換行 HUANH MOV DX,OFFSET ERROR;準備顯示錯誤信息
MOV AH,9
INT 21H
HUANH
;繼續換行
JMP MAIN
;無條件跳轉到MAIN,重新開始 6
MZTJ: HUANH
··· ··· ···
3.4 詢問繼續模塊
在首套程序編寫完畢運行時,每次我們只能運行一次顯示楊輝三角的程序,以后還得重新鍵入相關命令,才能運行,如此調試程序,效率低下,且可能混亂我們對現象的記錄。所以考慮到我們調試程序的高效性及對于使用者的便利性,我們又增加了一個詢問繼續模塊,當第一次楊輝三角顯示完畢,提示是否繼續,如果鍵入“Y”,則程序自動重新開始執行;如果鍵入“N”,則程序運行結束,退出。程序段如下:
input1: HUANH MOV DX,OFFSET CON
;顯示提問字符串,繼續?
MOV AH,9
INT
21H
;判斷是否繼續;鍵盤輸入數據 MOV AH,1 INT CMP JNZ HUANH JMP 21H AL,59H exit1
;判斷輸入的是否是Y NEAR PTR MAIN
;段內直接近轉移,可以轉移到段內的任何一個位置;結束程序,返回DOS exit1:
MOV AH,4CH
INT 21H 3.5 數值計算模塊
本段數值計算,是正確顯示楊輝三角的關鍵,所以能否找到一種既簡便又能保證計算正確性的方法,是我們本階段工作的中心,我們參閱了很多資料,從幾種計算方法中,選取了最符合我們實際編程水平的,又在保證計算正確性的基礎上,寫出了如下的程序段,它的思想是基于:第n行的第1個數為1,第二個數為1×(n-1),第三個數為1×(n-1)×
(n-2)/2,第四個數為1×(n-1)×(n-2)/2×(n-3)/3···依此類推。
如圖3.5.1為本段程序的流程圖,文字描述即為上段。
Calculate:DEC
MUL
DIV
INC
CMP
JZ
PUSH
MOV
CALL
MOV
SUB
CALL
POP
CALL ok1:RET
圖3.6.1
數值計算流程圖
b;b每次減1相乘
b c;除以c,再加1 c b,0;b是否為0 ok1 AX;保存所得數據
d,0;此處d為位數,為了顯示后面的空格 ShowNum AX,6;預設,總共顯示的空格數為6個單位 AX,d;還需顯示多少空格
Showspace1 AX
Calculate;繼續執行 8
3.6 顯示模塊
3.6.1 數據顯示
得到楊輝三角中的某一個數后,接下來的任務就是如何將它顯示出來。不能完成這項工作,就不能完成整個課題。我們小組在參考平時微機實驗的基礎上,自己分析,找到了一種正確的顯示方法:可以將某數不斷除以10,取出余數顯示,直到商為0,停止除法。例如:要顯示的數是345,除以10后,商為34,余數為5,5壓入堆棧。然后將34除以10,商為3,余數為4,4壓入堆棧。最后將3除以10,商為0,余數為3,3壓入堆棧。彈出堆棧,依次顯示,在匯編中,使用無符號數除法指令DIV OP。指令DIV BL,被除數存在AX中,整數商存在AL,余數存在AH。所以在除以10后,只需將AH中的值取出,下一次除法,可以用邏輯指令AND將其高八位屏蔽,調用2號功能,依次顯示。
為了能充分體現我們編程的思想,如圖3.6.1是數據顯示部分的流程圖,以下編寫的程序也是基于這種思想。
圖3.6.1
數據顯示流程圖
具體程序段如下:
ShowNum: MOV BX, 10
;BX中存除數10
CMP AX, 0 JZ
INC d ok2
;除法運算是否完畢
;此處d為位數,以確定輸出的空格數;除以10,整數商存在AL,余數存在AH DIV BL PUSH AX
AND AX, 00FFH;屏蔽高八位,取商 CALL
SHOWNum POP DX
;取出高八位,即為要顯示的余數;轉為ASCII碼
MOV DL, DH OR DL, 30H
MOV AH, 2 INT RET 21H ok2: 3.6.2 空格顯示
空格的顯示,是為了調整整體楊輝三角的布局,使其輸出為美觀的等腰三角形。前期,我們采用在方格紙上試書寫的方式,確定需要顯示的空格數。實際編程中,使用到了3中空格形式,第一種是首數字1之前的空格,定義為AHEAD,第二種是首數字1后面的空格,定義為BETWEEN,第三種是和需顯示的數字位數相關的空格,定義為BACK,具體在程序中定義如下:AHEAD
DB
BETWEEN DB
BACK
DB
'
$' '
$' ' $' 定義了這三種空格后,需要將其顯示,這里我們使用DOS功能調用,9號系統功能調用——輸出字符串。功能是將指定的內存緩沖區中的字符串在屏幕上顯示出來,緩沖區的字符串以“$”為結束標志。
Showspace: MOV BX, AX
nexts: MOV AH, 9 MOV DX,OFFSET AHEAD CMP BX, 0
;BX減1,控制輸出的空格數
;首行顯示空格,空格數即為輸入的階數
JZ dones
dones: INT DEC JMP RET 21H BX nexts
;完成顯示,返回;AX為6-數據位數 Showspace1: MOV BX, AX
MOV AH, 9
MOV DX,OFFSET BACK next: CMP BX, 0
JZ done
INT 21H
DEC BX
JMP next done: RET
第四章 實驗結果及問題處理
4.1 實驗結果
通過對程序的多次完善,現在能夠達到的要求為:最小輸出1階,最大輸出14階的正反楊輝三角形,能夠判斷輸入數據是否合法,能夠詢問是否繼續輸出,當輸入階數較小時,也能夠很好的顯示輸出,輸出的正反楊輝三角形美觀、清晰,實現了題目所提出的基本要求,對于遇到的一些問題,將在下節討論,下面附上一些運行調試圖片。
如圖4.1.1和圖4.1.2為正反楊輝三角顯示圖,圖4.1.3為當輸入階數超出范圍時的提示錯誤信息,并要求重新輸入數據。
圖4.1.1
11階楊輝三角
圖4.1.2
繼續輸出的4階和6階楊輝三角
圖4.1.3
輸入階數不合法的提示界面
4.2出現的問題以及解決的方案
4.2.1 數據輸入問題
對于數據輸入,我們當初考慮到了兩種方法,在方案選擇中已論證了兩種方法各自的優缺點,本來想使用0AH號系統功能調用,因為它能直接得到輸入的字符串,而不像1號系統功能調用那樣,只能夠輸入單字符,但是使用0AH號系統功能調用實際編寫程序時,卻不清楚輸入的字符串存放在內存的哪個區域,雖然參考文獻上有相關說明,但是我們還是未能取出輸入的字符串,這對于我們是極大的打擊,因為階數輸入是完成整個課題的第一步,這一步基礎不做好,更不要提后面的計算、顯示了。
在要求首先能實現功能的情況下,我們還是選擇了1號系統功能調用,但是要加一個循環控制,控制輸入最大位數和ENTER的ASCII碼判斷輸入結束語句,因為是輸入的單字符,其ASCII碼存在AL寄存器中,所以對于2位數,必須要先將其ASCII碼轉為16進制數,將首先輸入的數乘以10,再加上第二次輸入的數,得到實際鍵入的數值?;谝陨纤枷?,我們寫出了上述3.2節的階數輸入功能程序。4.2.2 除法溢出問題
由查閱資料可知,對于高階的楊輝三角形,其內部的數據會變得相當大,當階數為15階時,其最大的數已經超過65536,在數學上65536并不是一個特殊的數,但是在計算機系統中,65536=2^16,在8086CPU內部,有8個16為的內部寄存器,當然累加器AX
也為16位,AX中能存放的最大的數為65536,分為高八位(AH)和低八位(AL),使用匯編的無符號數除法指令DIV OP,指令中給出的操作數是除數,它可以是8位/16位通用寄存器及存儲器;被除數隱含在AX(字節除)或DX、AX(字除法)中。
查閱資料得到,可以使用特定指令,實現整數商存至AX,余數存至DX中,這樣能夠提高數值的上限,但是隨之而來的問題是,對于編程的復雜度的提高,楊輝三角的顯示格式問題,數據除以10取余數的顯示問題,從而影響到整個課題。所以考慮到限定的時間,輸出的美觀等因素,取折中選擇,我們只做到了14階,對于大于等于15階的階數輸入,我們增加了判斷語句,避免除法溢出問題。4.2.3 數據計算問題
眾所周知,楊輝三角形中的數據是有規律排列的,在上文整體設計思路中已經闡述了一些規律。對于數據的計算,我們一開始考慮到的是某數等于其上一行左右兩數之和,依照此規律也可以寫出整個楊輝三角形,而且不需要進行乘除法運算,不會出現除法溢出問題。但是如何得到這個數的上一行的左右兩數,這兩個數該存在哪里,卻是一個不容忽視的問題,而且會占用很大的內存空間。
后來我們查閱資料,又得到一些規律,即第n行的第1個數為1,第二個數為1×(n-1),第三個數為1×(n-1)×(n-2)/2,第四個數為1×(n-1)×(n-2)/2×(n-3)/3···依此類推。這樣可以用DEC n和INC c,用乘除法指令就可運算出正確結果,但是前提是輸入的階數有限制,上一節已經論證。為了能知道這一行到底要運算多少次,我們又加了一個CX控制其運算次數,在計算前,對某一行的n,都要進行壓棧保護。綜上所述,我們寫出了上節結束輸入模塊的程序。事實表明,這樣的方法能夠計算出正確的數值。
第五章 總結與體會
微機原理與接口技術,是我們電子科學與技術專業學生的專業課,由此可知,這門課對于我們的意義是多么重大。所以,在做這次微機的課程設計時,更是不敢怠慢。唯恐不能正確得到設計效果。
這次我們的課程設計的題目是:匯編顯示楊輝三角。剛拿到這個題目的時候,確實不知道從何下手,但是有句話說得好:不逼自己一把,怎么知道自己不可以?我們首先從什么是楊輝三角下手,查閱了相關資料,總結體會了楊輝三角的一些規律,這些規律能夠在我們編程過程中得以體現,所以這個過程是必須的。
接下來,在熟悉了楊輝三角的基礎上,我們結合編程,總結了有幾個工作要做,一是:字符串的顯示;二是:楊輝三角值得計算;三是:這些數值的顯示;四是:輸出的排版問題,保證輸出美觀正確。把整個課題,分為以上四個部分后,各個擊破,從而高效的完成整個課題是一種很實用、有效的方法。雖然在這個過程中遇到了不少問題,但是我們小組成員都很積極的討論解決問題的方法。最后通過整合,得到了整個程序。總體來說,這個程序雖然還不完美,但是代表著我們這一段時間以來的成果,我們都很欣慰,能夠實現題目的要求。
這次微機原理課程設計歷時兩個星期,在整整兩星期的日子里,可以說苦多于甜,但是可以學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。以前在上課的時候,老師經常強調在寫一個程序的時候,一定要事先把程序原理方框圖化出來,但是我開始總覺得這樣做沒必要,很浪費時間。但是,這次課程設計完全改變了我以前的那種錯誤的認識,以前我接觸的那些程序都是很短、很基礎的,但是在課程設計中碰到的那些需要很多代碼才能完成的任務,畫程序方框圖是很有必要的。因為通過程序方框圖,在做設計的過程中,我們每一步要做什么,每一步要完成什么任務都有一個很清楚的思路,而且在程序測試的過程中也有利于查錯。
其次,以前對于編程工具的使用還處于一知半解的狀態上,但是經過一段上機的實踐,對于怎么去排錯、查錯,怎么去看每一步的運行結果,怎么去了解每個寄存器的內容以確保程序的正確性上都有了很大程度的提高。
通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服
務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發現了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固。
這次課程設計終于順利完成了,在設計中遇到了很多編程問題,最后在老師的辛勤指導下,終于游逆而解。同時學得到很多實用的知識,在此我表示感謝!同時,對給過我幫助的所有同學表示忠心的感謝!
參考文獻
[1] 朱金鈞,麻新旗,等.微型計算機原理及應用技術.機械工業出版社,第2版.附錄
匯編輸出楊輝三角程序代碼: HUANH MACRO
;宏定義5句代碼實現換行
MOV
AH, 2
DL, 13 21H DL, 10 21H
MOV
INT
MOV
INT ENDM
DATA SEGMENT
MSG
RESULT CON DB DB DB
'Please input a number: $' 'The YiangHui triangle:$'
'Do you want to continue?(Y/N): $' 'Data out of range!$' ERROR
DB
AHEAD
DB
'
$' BETWEEN DB BACK a
DB DW DW DW DW
'
$' ' $' ? ? ? ?
;記錄位數,控制空格數
;a為階數;b是行數 b c
d
DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA
;輸入子程序,數字存在BP SHURU PROC
XOR
MOV
MOV BP,BP BX,10 CX,3
;控制輸入位數,外加一位回車
input:
MOV
INT AH,1
21H
;鍵盤輸入數據
CMP
JZ AL,0DH
OK AL,30H
;以回車結束輸入
SUB
CBW
;化ASCII為HEX;字節擴展為字
OK:
SHURU START:
MAIN:
MZTJ:
XCHG MUL
ADD
LOOP
RET ENDP MOV
MOV
MOV
MOV
INT
CALL
CMP JB
HUANH MOV MOV
INT
HUANH JMP
HUANH MOV
MOV AX,BP BX
;擴大10倍 BP,AX
;加一位
input AX,DATA DS,AX
DX,OFFSET MSG;輸出字符串,請輸入一個數 AH,9 21H SHURU
;調用輸入函數,顯示輸入的數BP,15
;輸入的數在BP里 MZTJ
;滿足條件
DX,OFFSET ERROR
;準備顯示錯誤信息
AH,9
21H
MAIN DX,OFFSET RESULT;顯示提示字符串
AH,9
INT
HUANH
MOV
CALL
MOV
MOV
INT
CMP
JZ
MOV
MOV
MOV
DEC
CALL
exit: HUANH MOV
CALL
MOV
MOV
INT
JMP
yhsj: MOV
HUANH
DEC
MOV
CALL
MOV
MOV
INT
MOV 21H
AX,BP
;準備顯示楊輝三角,AX=BP=階數
Showspace DL,'1'
;第一行顯示空格完畢,輸出'1' AH,2 21H BP,1
;階數BP與1比較
exit b,2
;b=2 CX,BP;CX為階數 a,BP;a為階數 a
yhsj AX,BP
;準備顯示楊輝三角,AX=BP=階數
Showspace DL,'1'
;第一行顯示空格完畢,輸出'1' AH,2 21H NEAR PTR input1 c,1
;楊輝三角
BP AX,BP Showspace
;控制首數字前面的空格數 DL,'1'
;首數字必為1
AH,2 21H DX,OFFSET BETWEEN
MOV
INT
MOV
PUSH
CALL
POP
INC
DEC
CMP
JA
DEC
CMP
JZ
CALL
ok3:
HUANH
INC
MOV
CALL
MOV
MOV
INT
input1: HUANH MOV
MOV
INT
MOV
INT
CMP
JNZ
HUANH AH,9 21H AX,1 b Calculate b b
;b為行數
CX CX,1 yhsj b b,2 ok3 fyhsj a AX,a Showspace DL,'1' AH,2 21H
;判斷是否繼續
DX,OFFSET CON;顯示提問字符串,繼續? AH,9 21H AH,1
;鍵盤輸入數據
21H AL,59H
;以回車結束輸入 exit1
JMP exit1: MOV
INT
fyhsj: MOV
HUANH
INC
MOV
CALL
MOV
MOV
INT
MOV
MOV
INT
MOV
DEC
PUSH
CALL
POP
INC
CMP
JB
RET Showspace:
MOV
MOV
MOV
nexts:
CMP
JZ NEAR PTR MAIN AH,4CH 21H c,1
;反楊輝三角
BP AX,BP Showspace DL,'1' AH,2 21H
DX,OFFSET BETWEEN AH,9 21H AX,1 b b Calculate b CX CX,a fyhsj BX, AX;首行顯示空格,空格數即為輸入的階數AH, 9 DX,OFFSET AHEAD BX, 0;BX減1,控制輸出的空格數
dones
INT
DEC
JMP
dones:
RET Calculate: DEC
MUL
DIV
INC
CMP
JZ
PUSH
MOV
CALL
MOV
SUB
CALL
POP
CALL
ok1:
RET ShowNum: MOV
CMP
JZ
INC
DIV
PUSH
AND
CALL
POP 21H BX nexts b b c c b,0 ok1 AX;保存所得數據
d,0 ShowNum AX,6 AX,d Showspace1 AX Calculate BX, 10;顯示某數,并記錄位數AX, 0 ok2 d BL AX AX, 00FFH SHOWNum DX
ok2:
MOV
OR DL, DH DL, 30H AH, 2 21H MOV
INT
RET BX, AX AH, 9 DX,OFFSET BACK BX, 0 done 21H BX next Showspace1:MOV
next:
done:
RET
MOV
MOV
CMP
JZ INT
DEC
JMP
CODE ENDS
END START
第二篇:微機原理課程設計
電子信息科學與技術《微機原理》課程設計
一、本次課程設計的目的和意義
學習和掌握計算機中常用接口電路的應用和設計技術,充分認識理論知識對應用技術的指導性作用,進一步加強理論知識與應用相結合的實踐和鍛煉。通過這次設計實踐能夠進一步加深對專業知識和理論知識學習的認識和理解,使自己的設計水平和對所學的知識的應用能力以及分析問題解決問題的能力得到全面提高。
二、設計時間、基本要求
(一)、設計時間:二周(二)、基本要求:
a.每題2人;b.設計出完整的接口電路;c.編寫出全部程序;d.在實驗系統上調試通過。
三、設計選題與要求
選題一:多路模擬數據采集系統設計
要求:設計一個2路以上的模擬數據采集系統。
1、用按鍵選擇那一路;
2、用LED顯示轉換結果(十進制數);
3、將每一路采集的100個數據存放到各自的存儲區中。
選題二:溫度測控系統的設計
要求:利用ADC0809設計一個溫度測控系統,在LED數碼顯示器上顯示溫度值,并對溫度進行測試和控制,當檢測溫度到達溫度上限60℃時開風扇(即開啟電動機,或以一個燈的亮滅表示),低于下限30℃時關閉風扇,LED上的顯示內容為:XX ℃(采用十進制顯示)。
選題三:函數發生器的設計(一)要求:利用DAC0832設計一個函數發生器,并利用按鍵選擇輸出波形,能分別產生三角波、階梯波(每階梯1V)、正向鋸齒波、負向鋸齒波和方波。并利用按鍵(自行定義)進行輸出波形選擇,同時將當前輸出波形代號顯示在LED上(左邊位):0為方波、1為正向鋸齒波、2為負向鋸齒波、3 為三角波、4為階梯波。
選題四:函數發生器的設計(二)要求:設計一個三角波發生器,可利用鍵盤改變其輸出波形的幅值。例如,可利用1-5這5個數字鍵改變其輸出波形的幅值,當按下1-5數字鍵時使D/A輸出幅值從1V增加到5V。
選題五:電子音樂播放器
要求:設計要求:利用8253作為音階頻率發生器,應先對“2008年奧運會主題歌”進行編碼后存入音符表,并建立好音階表(只建立一個8度即可),音符長度不能少于60個,連續播放3遍后停止。
選題六:鍵盤電子樂器
要求:利用并行接口8155作為鍵盤接口,設計一個具有2個八度音階的鍵盤樂器,音階鍵不少于16個,采用掃描方式管理鍵盤,音域范圍自行定義。
選題七:電子時鐘設計
要求:利用8253定時器設計一個具有時、分、秒顯示的電子時鐘,并定義一個啟動鍵,當按下該
鍵時時鐘從當前設定值(可在顯示緩沖區中予置)開始走時。
選題八:壓力測控系統的設計(一)要求:對壓力傳感器的信號進行檢測并在LED數碼顯示器上顯示壓力值,當壓力低于30pa時,黃燈閃爍,閃爍周期為1秒。當壓力高于150pa時,紅燈閃爍。LED的顯示內容為P=XXX。X為測試值。
選題九:可變輸出頻率方波發生器設計
要求:設計一個輸出方波頻率可利用按鍵改變的方波信號發生器(可以使用D/A也可以直接使用8253產生方波),利用鍵盤選擇方波發生器的輸出頻率并驅動喇叭。輸出頻率=鍵號*100HZ
選題十:直流電機速度控制器設計
要求:利用D/A轉換器和按鍵設計一個直流電動機轉速控制器。按鍵定義如下:0 停止,1-1/10轉速,2-2/10轉速?? 9 最高速(D/A輸出滿量程),鍵號每加1,D/A輸出增加0.5V
選題十一:可任意啟動/停止的電子秒表設計
要求:6位LED數碼顯示,計時單位為1/100秒。利用功能鍵進行啟/停控制。其功能為:上電后計時器清0,當第一次(或奇數次)按下啟/停鍵時開始計數。第2次(或偶數次)按下該鍵時停止計時,再一次按啟/停鍵時清零后重新開始計時??
選題十二:溫度測試系統設計
要求:利用溫度傳感器和ADC0809設計一個溫度測試系統,將測試結果(十進制)在LED上顯示出來,并定義一個保持按鍵,當按下該鍵時,將當前測試值保持不變(按鍵不動作時為正常測量顯示)。溫度顯示格式為:XXX ℃。(可以每隔0.3秒測量一次)
選題十三:壓力測試系統設計(二)要求:利用壓力傳感器和ADC0809設計一個壓力測試系統,并將測試結果(十進制)在LED上顯示出來,并定義一個測試最大值按鍵,當按下該鍵時,可進行最大值測量(按鍵不動作時為正常測量顯示),即:只有當當前測量值大于上次測量值時才刷新顯示,顯示格式為:P=XXX??梢悦扛?.3秒測量一次。
選題十四:簡易計算器系統設計
要求:設計一個可以進行2位數四則運算的計算器。
1、用按鍵輸入數和運算符號;
2、用LED顯示運算過程和結果(十進制數);
3、可以表示出當前的運算類型;
4、具有清零和復位功能;
5、具有連續運算功能。
選題十五:交通燈控制系統
要求:按照時間控制原則,利用并行接口和定時器,設計一套十字路口的交通燈管理系統,通行時間(或禁止時間)30秒,準備時間3秒,在準備時間里黃燈閃爍3次,閃爍頻率為0.5秒,周而復始??衫?255、8253等接口電路。
選題十六:計件系統設計
要求:利用8253計數,對外界脈沖技術,并將計數值在數碼管上顯示,可通過鍵盤控制重新計數。
四、設計任務及要求
1、接口設計:根據所選題目和所用的接口電路芯片設計出完整的接口電路,并在實驗系統上完成電路的連接和調試通過。
2、程序設計:要求畫出程序框圖,設計出全部程序并給出程序設計說明和程序注釋。
3、課程設計報告:(1)設計題目;
(2)系統的主要功能、作用以及主要技術性能指標;
(3)總體設計方案、工作和組成原理(框圖)或設計說明、采用的技術路線等;
(4)系統設計:接口電路設計,程序設計(程序框圖和程序清單及注釋)其他有關的理論分析和計算;
(5)設計總結:對整個設計工作過程進行歸納和綜合,對設計中所存在的問題和不足進行分析和總結,提出解決的方法、措施、建議和對這次設計實踐的認識、收獲和提高。
第三篇:微機原理課程設計
匯編程序設計題
題目一 密碼設置模擬
該程序可以進行密碼的設置(第一次)和修改(已設置密碼)。要求輸入的密碼不顯示。題目二 計算器
編輯程序可以實現鍵盤輸入數據與運算符,進行“加減乘除”運算。(提示:先輸入數據與運算符,保存,再按照運算符選擇對應的子程序;輸入的數據是用字符表示的,需要轉換;要有良好的界面(提示信息))
題目三工作周期判斷程序
輸入年、月、日,能夠判斷當日的星期數,并進行輸出。(以校歷為依照,可設某日為起點,根據相差的天數與7的關系進行判斷)。
題目四 PC揚聲器發聲
利用8253驅動PC機內揚聲器發聲,PC結構參考相關文獻資料。題目五 樂曲播放
利用PC機內8253實現樂曲播放。題目六 按鍵選擇樂曲播放
利用按鍵選擇播放不同樂曲。(★)(自制交互界面實現按鍵選擇★★)題目七 實現閃爍文字效果 編程提示:
提示信息于屏幕中央顯示出來,用光標定位子程序將光標定位于80*25顯示方式的第8行第10列,然后輸出一條提示信息,接著調用屏幕上卷子程序上卷一行,接著再定位光標,然后顯示下一條提示信息,直到所有信息顯示完畢,對于閃爍的信息,同樣是定位光標,然后用BIOS功能調用13H來顯示閃爍信息,當BL的高位為1時,字符閃爍。mov ah,00h mov al,03h ;設置顯示方式為80*25,16色文本 int 10h 題目八
數字秒表
設計可以顯示1~60秒的無存儲功能的秒表,最小單位為毫秒。題目九
倒計時牌
設計日期倒計時牌界面,可輸入設定日期,顯示當前日期的統計天數,如奧運計時牌。題目十
數字時鐘
編程實現時鐘功能,按秒刷新,要求定位在屏幕右上角。
硬件設計題
總體要求:根據題意自行設計電路,編寫相關匯編程序。題目一
交通燈控制系統
1.利用8253定時,8259中斷及8255設計電路,實現十字路口交通燈模擬控制。2.實現能自動控制和手動應急控制。
3.實現能隨時可以調整自動模式的綠燈和紅燈時間。題目二 實現特定功能的鍵盤及LED顯示
了解鍵盤及LED顯示接口原理,設計實驗電路圖完成以下功能: 1.按1鍵顯示年; 2.按2鍵顯示月日; 3.按3鍵顯示GOOD ;
4.按4鍵數碼管由左到右字符“0”循環顯示。5.自行設計特效顯示功能。題目三
LED七段數碼管數字鐘
設計并完成LED七段數碼管數字鐘電路,數字鐘顯示格式為:HH:MM:SS。要求:具有通過鍵盤能夠調整時、分、秒的功能。題目四
閃爍燈
利用8253和LED燈相結合實現閃爍燈效果。題目五
電子鐘
利用8253定時器設計一個電子鐘,并定義一個啟動鍵。當按下該鍵時電子時鐘從當前設定值開始走時。
附錄:實驗箱功能模塊電路圖
第四篇:2008微機原理課程設計
《微機原理及接口》課程設計任務書
適用專業:05電子信息工程 通信工程
一、本次課程設計的目的和意義
學習和掌握計算機中常用接口電路的應用和設計技術,充分認識理論知識對應用技術的指導性作用,進一步加強理論知識與應用相結合的實踐和鍛煉。通過這次設計實踐能夠進一步加深對專業知識和理論知識學習的認識和理解,使自己的設計水平和對所學的知識的應用能力以及分析問題解決問題的能力得到全面提高。
二、設計時間和設計題目
(一)、設計時間:一周(二)、設計題目:可從以下題目中任選一題,原則上每班每題不超過5人。每題的設計要求:a、設計出完整的接口電路。B、編寫出全部程序。
1、交通燈控制系統:按照時間控制原則,利用并行接口和定時器,采用時間中斷方式設計一套十字路口的交通燈管理系統,通行時間(或禁止時間)30秒,準備時間3秒,在準備時間里黃燈閃爍3次,閃爍頻率為0.5秒,周而復始。可利用8255、8253、8259等接口電路。
2、溫度測控系統的設計:利用ADC0809采用中斷式設計一個溫度測控系統,在LED數碼顯示器上顯示溫度值,并對溫度進行測試和控制,當檢測溫度到達溫度上限60℃時開風扇(即開啟電動機),低于下限30℃時關閉風扇,LED上的顯示內容為:XX ℃(采用十進制顯示)。
3、函數發生器1的設計:利用D/A設計一個函數發生器,并利用按鍵選擇輸出波形,能分別產生三角波、階梯波(每階梯1V)、正向鋸齒波、負向鋸齒波和方波。并利用按鍵(自行定義)進行輸出波形選擇,同時將當前輸出波形代號顯示在LED上(左邊位):0為方波、1為正向鋸齒波、2為負向鋸齒波、3 為三角波、4為階梯波。
4、函數發生器2的設計:設計一個三角波發生器,可利用鍵盤改變其輸出波形的幅值。例如,可利用1---5這5個數字鍵改變其輸出波形的幅值,當按下1---5數字鍵時使D/A輸出幅值從1V增加到5V。
5、電子音樂播放器:設計要求:利用8253作為音階頻率發生器,應先對一段音樂進行編碼后存入音符表,并建立好音階表(只建立一個8度即可,音階表見附錄),音符長度不能少于60個,連續播放3遍后停止。
6、鍵盤電子樂器:利用并行接口8255作為鍵盤接口,設計一個具有2個八度音階的鍵盤樂器,音階鍵不少于16個,采用掃描方式管理鍵盤,音域范圍自行定義。
7、電子時鐘設計:利用8253定時器設計一個具有時、分、秒顯示的電子時鐘,并定義一個啟動鍵,當按下該鍵時電子時鐘從當前設定值開始走時。
8、壓力測控系統的設計:對壓力傳感器的信號進行檢測并在LED數碼顯示器上顯示壓力值,當壓力低于30pa時,黃燈閃爍,閃爍周期為1秒。當壓力高于150pa時,紅燈閃爍。LED的顯示內容為P=XXX為測試值。
9、可變輸出頻率方波發生器設計:設計一個輸出方波頻率可利用按鍵改變的方波信號發生器(可以使用D/A也可以直接使用8253產生方波),利用鍵盤選擇方波發生器的輸出頻率并驅動喇叭。輸出頻率=鍵號*100HZ。
10、直流電機速度控制器設計:利用按鍵控制直流電動機的轉速。按鍵定義如下:0 停止,1 1/10轉速,2 2/10轉速…… 9 最高速(D/A輸出滿量程),鍵號每加1,D/A輸出增加0.5V。
11、可任意啟動/停止的電子秒表設計:6位LED數碼顯示,計時單位為1/100秒。利用功能鍵進行啟/停控制。其功能為:上電后計時器清0,當第一次(或奇數次)按下啟/停鍵時開始計數。第2次(或偶數次)按下該鍵時停止計時,再一次按啟/停鍵時清零后重新開始計時……。12簡易計算器系統設計:設計一個可以進行2位數四則運算的計算器,要求:1,用按鍵輸入數和運算符號;2,用LED顯示運算過程和結果(十進制數);3,可以表示出當前的運算類型;4,具有清零和復位功能;5,具有連續運算功能。
13點陣LED顯示系統設計:設計一個點陣式LED顯示系統。要求:1,每次顯示一個文字和圖形;2,每隔一固定時間更變需要顯示的文字或圖形;3,可以現實循環顯示幾個文字或圖形;4,可以根據按鍵來控制顯示的文字的替換時間的長短;5,具有復位功能。
三、設計任務及要求:
1、接口電路設計:根據所選題目和所用的接口電路芯片設計出完整的接口電路,并進行電路連接和調試。
2、程序設計:要求畫出程序框圖,設計出全部程序并給出程序設計說明和程序注釋。
3、設計文件:a、設計圖紙(接口電路原理圖);b、使用或操作說明;c、設計報告:字數約3000~4000字,內容包括:(1)設計題目;(2)系統的主要功能作用及主要技術性能和指標;(3)總體設計方案及組成原理(框圖)或設計說明及技術路線;(4)系統設計:接口電路設計,程序設計(程序框圖和程序清單及注釋)其他有關的理論分析和計算;(5)設計總結:對設計中所存在的問題和不足進行分析和總結,提出解決的方法、措施、建議和對這次設計實踐的認識、收獲和提高。
4、設計要求:
不允許抄襲和復印,否則取消設計成績。
四、設計時間和成績分配:
(一)設計時間:一周(二)設計成績分配:
1、接口電路設計占30%(包括電路圖設計、電路連接和調試通過)。
2、設計文件占30%
3、答辯占40%
第五篇:微機原理課程設計
接口技術課程設計
一、設計內容
設計一個投票統計器,完成投票、計票統計和票數顯示等功能。
二、設計原理及方案
在8086最小工作模式下,連接一塊8255A芯片。在 8255A的C端口連接8個開關,開關按下表示支持,燈亮,開關不按便是反對,燈不亮,從8255A的C端口輸入投票結果,經8086運算統計出結果;在 8255A的A端口連接一塊7段LED數碼管,將輸出結果通過數碼管顯示出來。電路圖:
接口技術課程設計
程序代碼: A_PROT B_PROT C_PROT CT_PROT DATA DATA CODE
MOV DX,C_PROT IN AL,DX EQU EQU EQU EQU 200H 202H 204H 206H
;可通過計算獲得,連接的是IO1 SEGMENT ENDS SEGMENT MOV AX,DATA MOV DX,AX MOV AL,10001001B MOV DX,CT_PROT OUT DX,AL
;控制字寫入
;A端口輸出,C端口輸入 TAB1 DB 7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH ASSUME CS:CODE,DS:DATA
START: MOV DX,C_PROT MOV AL,0 OUT DX,AL
;C端口清零
AGAIN: TJ: XOR AH,AH
MOV CX,8 LOOP1: SAL AL,1
ADC AH,0
LOOP LOOP1
MOV AL,AH
PUSH BX
LEA BX,TAB1
XLAT
MOV DX,A_PROT
OUT DX,AL
PUSH CX
MOV CX,2801 WAIT1: LOOP WAIT1
POP CX
JMP AGAIN
MOV AH,4CH INT 21H CODE ENDS END START
接口技術課程設計
;統計1個數
;進位加CF,以統計出C端口中1的個數
;延時10ms
接口技術課程設計
三、運行結果
程序結果圖:
接口技術課程設計
四、設計總結與體會
為期一周的微機原理課程實踐終于結束了,回過頭來,感慨萬千。過了一個多月,書本上的好些知識已然忘卻,剛開始拿到課題時,看到一大堆傳說中的神器,霎時凌亂了,選來選去,從僅剩的課題中挑了“投票統計器”,上網搜索了一下,大體上把設計的方向搞清了,接下來,便是開始設計了。
畫模擬圖對于我們來說,還是比較困難的,特別是8086那一塊兒,大家參考網上的資料,反復討論,著實花了不少時間。接下來的畫圖連線就比較簡單了,為了節省時間,在做模擬圖的同時,其他兩個人便開始編寫程序了。將設計流程圖簡略寫下來,對照流程圖,分塊兒編寫程序,顯得很有條理,簡單輕松些。
就這樣,三次課之后,設計的圖和程序都好了,只剩下調試程序,查看模擬結果了。這是檢錯和糾錯的過程,輕松但也不輕松,因為那么多東西,如果看不仔細了,你就找不到錯誤,也就沒法兒解決問題了,費事費力還一無所獲,這是最傷腦筋的事情。還好,運氣不錯,只是程序出現了小小的問題,改好之后,得到了很滿意的結果。
最后的驗收,是對書本與實踐知識的融匯總結,本以為毫無問題的我們,沒想到被程序中的一個問題給秒殺了,大家四處找資料,和別的組的同學討論,反復演算了半天,終于會了。當然,就算是會了,我們也只是懂得了微機原理中的一點皮毛而已,學的扎實很重要,因為這樣才能把理論知識運用到實踐中去,不斷地提高自己。
五、參考文獻 1.周明德.微型計算機系統原理及應用.北京:清華大學出版社
2.張彌左,王兆月,邢立軍等.微型計算機接口技術.北京:機械工業出版社 3.戴梅萼,史嘉權.微型計算機技術及應用.北京:清華大學出版社 4.沈美明,溫冬嬋.IBM-PC匯編語言程序設計.北京:清華大學出版社