求最大公約數(shù)和大獎賽計分程序_微機原理課程設計_第1頁
求最大公約數(shù)和大獎賽計分程序_微機原理課程設計_第2頁
求最大公約數(shù)和大獎賽計分程序_微機原理課程設計_第3頁
求最大公約數(shù)和大獎賽計分程序_微機原理課程設計_第4頁
求最大公約數(shù)和大獎賽計分程序_微機原理課程設計_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、課程設計報告( 20122013 年度第 一 學期)課 程:微機原理及應用 題 目:求最大公約數(shù)和大獎賽計分程序院 系:自動化系班 級:自動化1002班學 號:學生姓名:指導教師:設計周數(shù):成 績: 日期:2013年 1 月 11 日微機原理及應用課程設計任 務 書一、 目的與要求1 通過對微機系統(tǒng)分析和具體設計,使學生加深對所學課程的理解。2 掌握匯編語言程序設計的基本方法和典型接口電路的基本設計方法。3 培養(yǎng)學生分析問題、解決問題的能力。4 培養(yǎng)學生對微型計算機應用系統(tǒng)的基本設計能力。5 提高學生的實踐動手能力和創(chuàng)新能力。二、 主要內(nèi)容1 求最大公約數(shù)和大獎賽計分程序。2 根據(jù)所選題目的要

2、求對微機系統(tǒng)進行程序設計,繪制程序總體流程圖并編寫源程序上機調(diào)試。3 寫出課程設計報告,對整個設計過程進行歸納和綜合,對設計中所存在的問題和不足進行分析和總結(jié),提出解決的方法、措施、建議和對這次設計實踐的認識和收獲。 三、 進度計劃序號設計內(nèi)容完成時間備注1選擇課程設計題目,查閱相關(guān)資料周二2進行軟硬件設計周三3上機調(diào)試周四4撰寫設計報告周四5演示及答辯周五四、 設計成果要求1 系統(tǒng)硬件設計合理,軟件編程達到設計要求。2 系統(tǒng)硬件結(jié)構(gòu)圖和軟件流程圖繪制清楚規(guī)范。3 設計報告完整規(guī)范。五、 考核方式根據(jù)設計任務的完成情況、課程設計報告撰寫情況及演示答辯情況采用五級記分制評定成績。學生姓名:1 李

3、俊杰 4 張茜 8 周小朋指導教師:焦嵩鳴 微機原理及應用課程設計 一、課程設計目的與要求1 通過對微機系統(tǒng)分析和具體設計,使學生加深對所學課程的理解。2 掌握匯編語言程序設計的基本方法和典型接口電路的基本設計方法。3 培養(yǎng)學生分析問題、解決問題的能力。4 培養(yǎng)學生對微型計算機應用系統(tǒng)的基本設計能力。5 提高學生的實踐動手能力和創(chuàng)新能力二、課程設計正文設計題目一:求最大公約數(shù)設計任務及要求:提示輸入兩個小于100的十進制正整數(shù),求出這兩個數(shù)的最大公約數(shù),數(shù)據(jù)的輸入和結(jié)果的輸出都要有必要的提示,且提示獨占一行。(1)在屏幕上顯示INPUT STRING1:”,“INPUT STRING2:”,

4、“GREATEST COMMON DIVISOR IS:”;(2)在鍵盤上輸入兩個數(shù)并在屏幕上顯示,每個數(shù)以ENTER鍵結(jié)束;(3)把輸入的十進制數(shù)轉(zhuǎn)換成二進制數(shù),并求出它們的最大公約數(shù);(4)把二進制表示的最大公約數(shù)轉(zhuǎn)換成ASCII碼,并在屏幕上顯示。 設計題目二:大獎賽計分程序設計任務及要求:從鍵盤上輸入十個十進制數(shù)(一位或兩位的整數(shù)),代表十個評委的評分,減去十個數(shù)的最大數(shù)和最小數(shù),求出平均值,并在屏幕上以十進制顯示。(1)在屏幕上顯示“INPUT:”;(2)輸入分數(shù)并在屏幕上顯示,每個分數(shù)以ENTER鍵結(jié)束;(3)把輸入的十進制數(shù)轉(zhuǎn)換成二進制數(shù),并求出最大數(shù)和最小數(shù);(4)求出十個數(shù)的

5、總和,減去最大數(shù)和最小數(shù)后再求平均數(shù);(5)把二進制的平均數(shù)轉(zhuǎn)換成十進制,并在屏幕上顯示。三、課程設計總結(jié):(1)求最大公約數(shù) 這次的微原課程設計,老師提供了硬件和軟件兩個大的方向給我們,但我從幾次的微原實驗發(fā)現(xiàn)我對硬件的掌握和理解確實不好,所以我選擇了做軟件類的課程設計。課上老師說可根據(jù)提供的題目參考著來自己選擇對應的題目,所以我們選擇了兩個題目,分別是求最大公約數(shù)和大獎賽計分程序的設計。一開始以為題目要求的把輸入的兩個數(shù)的所有公約數(shù)顯示出來比較麻煩,所以改成了求最大公約數(shù),可編著才知道求最大公約數(shù)的算法實在比較難想,廢了不少時間。在求最大公約數(shù)的編程中,遇上了好幾個麻煩,其中我覺得比較有代

6、表性的是以下幾個方面: 輸入兩個數(shù)的問題,是緊接著程序分別寫輸入程序還是采用CALL函數(shù)調(diào)用,但一看后面的第二個課題要輸入10個數(shù),我們果斷的選擇了函數(shù)調(diào)用的方法,但還是不知道該怎么設計輸入程序,因為根本沒見過,最后在一本參考書中發(fā)現(xiàn)了經(jīng)典的多位數(shù)輸入程序函數(shù),也就是我們程序中的INPUT函數(shù),才解決了輸入的問題; 最大公約數(shù)的核心算法不清楚,因為我們學到的匯編畢竟是低級語言,和以前的C+相比,它的算法一定要更精巧和簡潔。在網(wǎng)上搜到了它的核心算法后,我們自己編寫了求最大公約數(shù)的這一部分程序,沒有參照任何的資料,感覺很棒; 輸出最大公約數(shù)時該怎么輸出的思想也是很模糊的,對是根據(jù)它有一位還是兩位分

7、別跳轉(zhuǎn)到對應的輸出段還是直接編寫對一位數(shù)和兩位數(shù)都有效的輸出程序拿捏不定。最后在網(wǎng)上找到了輸出一位的程序段,我們相互討論和摸索之后,編出了現(xiàn)在能輸出兩位數(shù)的程序; 對編譯錯誤的改正還比較簡單,但程序中出現(xiàn)了能編譯、能輸入、能輸出但結(jié)果不對的問題。從頭到尾查了好幾遍,但就是找不到問題。最后輸入了很多遍,從輸出結(jié)果看出了規(guī)律才找到了問題所在。那段錯誤程序如下:MOV AL,BL ;最大公約數(shù)計算結(jié)束,把最大公約數(shù)保存到AL中 XOR AH,AH ;將AL中的一個8位無符號數(shù)擴展成16位,存放在AX中 MOV CL,10 DIV CL ;將公約數(shù)除以10,商就是顯示器十位上的值,余數(shù)就是各位的值 C

8、MP AL,0 JZ NEXT3 ;若AL中的商等于0,則直接跳到NEXT3,不顯示十位上的0 MOV DL,AL ADD DL,30H MOV AH,2 INT 21H ;若AL中的商不為0,則輸出顯示在屏幕上 NEXT3:AND DL,0 MOV DL,AH ADD DL,30H AND AH,0 MOV AH,2 INT 21H 大量的對程序進行實驗才發(fā)覺輸入兩個一位的數(shù)字時候是完全正確的,而輸入的兩個數(shù)的最大公約數(shù)是兩位時,輸出結(jié)果的個位總是要不正確要不和正確值偏差點,再實驗后發(fā)現(xiàn)輸入的兩個數(shù)的最大公約數(shù)是兩位時,輸出結(jié)果的個位永遠是2,我們這才發(fā)現(xiàn)了問題是在哪。原來如果輸入兩個最大公

9、約數(shù)是兩位的數(shù)時,第一次取的余數(shù)(也就是輸出數(shù)的個位)默認放在了AH里,而02H功能調(diào)用輸出十位上的數(shù)時,AH被重新賦值了2,所以輸出顯示的也永遠是2,。而當輸入的兩個數(shù)的最大公約數(shù)是一位時,在CMP AL,0JZ NEXT3那里就跳轉(zhuǎn)到了輸出個位的指令,從而輸出正確。最后把AH中的個位先賦給了一個空閑寄存器,等輸出個位時再掉用那個空閑寄存器而不是AH就輕松解決了問題,可找過程的過程確實很艱辛,但也弄懂了很多很多其他的東西。最后就是對程序進行解釋說明了,寫好之后才發(fā)覺會編程和能說清楚是兩碼事,但本來還是有點模糊的程序?qū)懲曜⑨屩缶透杏X特別的清晰明朗,這不得不說是意外的收獲。(2)大獎賽計分程序

10、源程序建立以后要對其進行匯編,匯編程序會指出源程序中的錯誤,這些錯誤要經(jīng)過調(diào)試階段才能糾正,從而得到正確的結(jié)果。常用的調(diào)試程序為DEBUG程序,它通過單步,設置斷點等方式提供了非常有效的調(diào)試手段?,F(xiàn)將本程序設計中遇到的錯誤和修正總結(jié)如下:1.在初次編譯時,匯編程序提示有大量錯誤,仔細檢查后發(fā)現(xiàn)比較指令格式運用出錯,不能對兩個存儲器數(shù)直接進行比較。原程序 CMP AA,BB 修改后 MOV AL,AA MOV BL,BB MOV AL,BL2.將源程序再次匯編后得到?jīng)]有語法錯誤OBJ文件,然后用LINK程序把OBJ文件轉(zhuǎn)換成可執(zhí)行的EXE文件,在DOS環(huán)境下可直接運行該文件,但運行后系統(tǒng)提示除數(shù)

11、溢出,我們在程序中找不到錯誤,只好用DEBUG調(diào)試。只需EDIT環(huán)境,輸入TDEBUG加文件名之后回車,就可以進入DEBUG環(huán)境進行程序調(diào)試。我們根據(jù)系統(tǒng)提示用F8單步進行調(diào)試,觀察每一步結(jié)果,當執(zhí)行到數(shù)值轉(zhuǎn)換哪里時,我們發(fā)現(xiàn)結(jié)果出現(xiàn)了問題,兩位數(shù)轉(zhuǎn)換之后是正確的,但一位數(shù)卻出現(xiàn)了錯誤。于是對程序進行了修改,但還是出現(xiàn)了錯誤,最后通過查閱書籍得到了一個可以將鍵盤上輸入的099之間的十進制整數(shù)轉(zhuǎn)換成響應二進制并存儲的程序(程序段中的INPUT子程序),我們經(jīng)過仔細研究并看懂了這個程序,然后用他換掉了原來的換碼程序,并通過CALL指令來調(diào)用此子程序。3.繼續(xù)編譯執(zhí)行,這次依然沒有出現(xiàn)語法上的錯誤,

12、但通過計算器檢驗程序的輸出結(jié)果依然有誤,通過仔細檢查程序發(fā)現(xiàn),對十個數(shù)進行相加后把總和放到了AL寄存器里面,造成溢出,從而輸出了錯誤了結(jié)果,然后我們又對程序作了相應修改。原程序:ADD AL,BL修改后:ADD AX,BX再次編譯,通過幾次計算器的檢驗,程序均得到了正確的結(jié)果。本程序設計結(jié)束。通過本次試驗,我們掌握了匯編程序的基本設計方法,加深了對本門課程的理解和掌握,達到了本次課程設計的目的。 附錄:求最大公約數(shù)程序:DATA SEGMENT ;數(shù)據(jù)段定義STRING1 DB INPUT STRING1:$STRING2 DB INPUT STRING2:$STRING3 DB GREATE

13、ST COMMON DIVISOR IS: $AA DB 20 DUP(?) BB DB 20 DUP(?)DATA ENDS ;數(shù)據(jù)段定義結(jié)束CODE SEGMENT ;代碼段定義 ASSUME CS:CODE,DS:DATA ;定義代碼段和數(shù)據(jù)段的默認寄存器START: MOV AX,DATA ;程序開始執(zhí)行 MOV DS,AX LEA DX,STRING1 ;取第一個提示語的有效地址放入DX中 MOV AH,09H INT 21H ;輸出第一個提示輸入語 CALL INPUT ;調(diào)用函數(shù)INPUT,輸入第一個數(shù) MOV AA,BL ;將第一個數(shù)存入存儲空間AA中 LEA DX,STRIN

14、G2 ;取第二個提示語的有效地址放入DX中 MOV AH,09H INT 21H ;輸出第二個提示輸入語 CALL INPUT ;輸入第二個數(shù)數(shù) MOV BB,BL ;將第二個數(shù)存入存儲空間BB中 LEA DX,STRING3 ;取第三個提示語的有效地址放入DX中 MOV AH,09H INT 21H ;輸出結(jié)果提示語 MOV AL,AA MOV BL,BB CMP AL,BL JG NEXT XCHG AL,BL ;把輸入的兩個數(shù)取出,較大的數(shù)存入AL,較小的數(shù)存入BLNEXT: AND AH,0 ;用輾轉(zhuǎn)相除法求最大公約數(shù) DIV BL CMP AH,0 JZ NEXT2 ;AL中的數(shù)除以

15、BL中的數(shù),直到AH中存的余數(shù)等于0跳轉(zhuǎn)到NEXT2 MOV AL,BL ;若AH中的余數(shù)不等于0,繼續(xù)進行最大公約數(shù)的計算 MOV BL,AH AND AH,0 JMP NEXT NEXT2: MOV AL,BL ;最大公約數(shù)計算結(jié)束,把最大公約數(shù)保存到AL中 XOR AH,AH ;將AL中的一個8位無符號數(shù)擴展成16位,存放在AX中 MOV CL,10 DIV CL ;將公約數(shù)除以10,商就是顯示器十位上的值,余數(shù)就是各位的值 MOV CH,AH ;把余數(shù)放入空閑寄存器CH,防止02H功能調(diào)用重新對AH賦值 CMP AL,0 JZ NEXT3 ;若AL中的商等于0,則直接跳到NEXT3,不

16、顯示十位上的0 MOV DL,AL ADD DL,30H MOV AH,2 INT 21H ;若AL中的商不為0,則輸出顯示在屏幕上 NEXT3:AND DL,0 MOV DL,CH ADD DL,30H AND AH,0 MOV AH,2 INT 21H ;把CH中的余數(shù)也就是個位緊接著十位顯示在屏幕上 INPUT:MOV BX,0 ;定義輸入函數(shù)INPUT,供CALL指令隨時調(diào)用 ABC:MOV AH,1 INT 21H ;01H功能調(diào)用,輸入第一個數(shù)的第一個數(shù)字到AL中 CMP AL,0DH JZ EXIT ;判斷輸入是否是回車鍵,是的話說明輸入結(jié)束,跳轉(zhuǎn)到EXIT返回源程序 AND A

17、X,000FH XCHG AX, BX ;若不是回車鍵,則把AH清零,和BX中的數(shù)據(jù)交換 MOV CX,10 MUL CX ADD BX,AX JMP ABC EXIT: RET ;輸入數(shù)字結(jié)束,輸入的數(shù)存在BX寄存器中返回源程序 CODE ENDS ;代碼段定義結(jié)束 END START ;程序結(jié)束求最大公約數(shù)的程序流圖:大獎賽計分程序的設計程序:DATA SEGMENT ;數(shù)據(jù)段定義STRING0 DB INPUT0:$STRING1 DB INPUT1:$STRING2 DB INPUT2:$STRING3 DB INPUT3:$STRING4 DB INPUT4:$STRING5 DB

18、INPUT5:$STRING6 DB INPUT6:$STRING7 DB INPUT7:$STRING8 DB INPUT8:$STRING9 DB INPUT9:$ MAX DB 16 DUP(?) MIN DB 16 DUP(?) AA DB 16 DUP(?) BB DB 16 DUP(?) CC DB 16 DUP(?) DDD DB 16 DUP(?) EE DB 16 DUP(?) FF DB 16 DUP(?) GG DB 16 DUP(?) HH DB 16 DUP(?) II DB 16 DUP(?) JJ DB 16 DUP(?)DATA ENDS ;數(shù)據(jù)段定義結(jié)束COD

19、E SEGMENT ;代碼段定義ASSUME CS:CODE,DS:DATA ;定義代碼段和數(shù)據(jù)段的默認寄存器START: MOV AX,DATA ;程序開始執(zhí)行 MOV DS,AX LEA DX,STRING0 ;取第一個提示語的有效地址 MOV AH,09H INT 21H ;09H功能調(diào)用 CALL INPUT ;調(diào)用函數(shù)INPUT,開始輸入數(shù)字 MOV AA,BL ;將輸入的數(shù)字存入存儲空間AA LEA DX,STRING1 ;重復上述過程,將輸入的數(shù)字存入相應的存儲空間 MOV AH,09H INT 21H CALL INPUT MOV BB,BL LEA DX,STRING2 MO

20、V AH,09H INT 21H CALL INPUT MOV CC,BL LEA DX,STRING3 MOV AH,09H INT 21H CALL INPUT MOV DDD,BL LEA DX,STRING4 MOV AH,09H INT 21H CALL INPUT MOV EE,BL LEA DX,STRING5 MOV AH,09H INT 21H CALL INPUT MOV FF,BL LEA DX,STRING6 MOV AH,09H INT 21H CALL INPUT MOV GG,BL LEA DX,STRING7 MOV AH,09H INT 21H CALL IN

21、PUT MOV HH,BL LEA DX,STRING8 MOV AH,09H INT 21H CALL INPUT MOV II,BL LEA DX,STRING9 MOV AH,09H INT 21H CALL INPUT MOV JJ,BL ;輸入數(shù)字結(jié)束,將第十個數(shù)字存入存儲空間JJ MOV AL,AA ;開始分別調(diào)用十個存儲空間里的數(shù)進行比較,把最大的數(shù)存到AL中 MOV BL,BB CMP AL,BL JA NEXT1 XCHG AL,BL NEXT1:MOV BL,CC CMP AL,BL JA NEXT2 XCHG AL,BL NEXT2:MOV BL,DDD CMP AL,B

22、L JA NEXT3 XCHG AL,BL NEXT3:MOV BL,EE CMP AL,BL JA NEXT4 XCHG AL,BL NEXT4:MOV BL,FF CMP AL,BL JA NEXT5 XCHG AL,BL NEXT5:MOV BL,GG CMP AL,BL JA NEXT6 XCHG AL,BL NEXT6:MOV BL,HH CMP AL,BL JA NEXT7 XCHG AL,BL NEXT7:MOV BL,II CMP AL,BL JA NEXT8 XCHG AL,BL NEXT8:MOV BL,JJ CMP AL,BL JA NEXT9 XCHG AL,BL NE

23、XT9:MOV MAX,AL ;將輸入的最大值放入存儲空間MAX中,找尋最大數(shù)值過程結(jié)束 MOV AL,AA ;開始分別調(diào)用十個存儲空間里的數(shù)進行比較,把最小的數(shù)存到AL中 MOV BL,BB CMP AL,BL JB NEXT11 XCHG AL,BLNEXT11:MOV BL,CC CMP AL,BL JB NEXT22 XCHG AL,BLNEXT22:MOV BL,DDD CMP AL,BL JB NEXT33 XCHG AL,BLNEXT33:MOV BL,EE CMP AL,BL JB NEXT44 XCHG AL,BLNEXT44:MOV BL,FF CMP AL,BL JB N

24、EXT55 XCHG AL,BLNEXT55:MOV BL,GG CMP AL,BL JB NEXT66 XCHG AL,BLNEXT66:MOV BL,HH CMP AL,BL JB NEXT77 XCHG AL,BLNEXT77:MOV BL,II CMP AL,BL JB NEXT88 XCHG AL,BLNEXT88:MOV BL,JJ CMP AL,BL JB NEXT99 XCHG AL,BLNEXT99:MOV MIN,AL ;將輸入的最小數(shù)放入存儲空間MIN,找尋最小數(shù)值過程結(jié)束 MOV AL,AA MOV BL,BB ;把AA和BB中的值分別賦給AL和BL,讓隨后的運算程序得

25、以執(zhí)行 XOR AH,AH XOR BH,BH ;把AH和BH清零,防止累加之后AL存儲空間不夠占用AH的空間 ADD AX,BX ;依次進行累加,把累加值存入AX MOV BL,CC ADD AX,BX MOV BL,DDD ADD AX,BX MOV BL,EE ADD AX,BX MOV BL,FF ADD AX,BX MOV BL,GG ADD AX,BX MOV BL,HH ADD AX,BX MOV BL,II ADD AX,BX MOV BL,JJ ADD AX,BX ;將10個數(shù)的和放在AX寄存器中,累加結(jié)束 MOV BL,MAX ;將最大值賦給BL XOR BH,BH ;BH

26、清零,使隨后減法運算BX中只有最大值MAX的數(shù)據(jù) SUB AX,BX MOV BL,MIN ;將最小值賦給BL,因BH沒用到,所以這里不用再次清零 SUB AX,BX ;減去最大數(shù)和最小數(shù),將結(jié)果保存在AX中 MOV CL,8 DIV CL MOV DH,AH ;將8個數(shù)的和除8后的余數(shù)放在DH寄存器中 XOR AH,AH ;開始把整數(shù)部分輸出,AH清零,防止后面DIV運算中AH影響結(jié)果 MOV CL,10 DIV CL MOV CH,AH ;把要輸出的整數(shù)部分的個位數(shù)賦給CH,防止后續(xù)功能調(diào)用時覆蓋AH CMP AL,0 JZ NEXT ;判斷輸出的最高位是否為0,若是則跳轉(zhuǎn),不顯示在屏幕上 MOV DL,AL ADD DL,30H ;將相應的數(shù)轉(zhuǎn)換成對應的ASCII碼 MOV AH,2 INT 21H ;若輸出的最高位不為0,則用02H功能調(diào)用顯示在屏幕上 NEXT:AND DL,0 MOV DL,CH ;把要顯示數(shù)的個位上的數(shù)賦給DL ADD DL,30H ;將要顯示數(shù)的個位上的數(shù)轉(zhuǎn)換成ASCII碼 AND AH,0 MOV AH,2 INT 21H ;將要顯示數(shù)的個位上的數(shù)緊接著十位輸出在屏幕上 MOV DL,2EH MOV AH,02H INT 21H ;將小數(shù)點顯示在屏幕上 MOV CL,10 XOR AH,AH M

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論