汇编语言程序设计,计算比赛成绩
一、設計內容與設計要求
1.課程設計目的:
《匯編語言程序設計》是計算機專業的重要的專業基礎課,通過本課程設計使學生進一步鞏固課堂所學,全面熟悉、掌握8088宏匯編語言程序設計的基本方法和技巧,進一步提高編寫程序、閱讀分析程序及上機操作、調試程序的能力。
2.課題題目
1)測量任意程序的運行時間
2)讀入一個文本文件并以DEBUG中的D命令格式顯示。
3)文件加密程序
4)編寫一個時鐘程序
5)畫網格線
6)畫脈沖波圖形
7)用“*”畫菱形框
8)計算比賽成績
3.設計要求:
1)在一周內學生須上機16小時以上,程序調試完后,須由指導老師在機器上檢查運行結果,經教師認可后的源程序可通過打印機輸出。
2)分組及安排
A.每組同學必須完成所指定的題目,每個同學須自己完成設計,應有不同的思路。
B.按學號分組,第一組為1、9、17、25、33號同學,第二組為2、10、18、26、34號,第三組為3、11、19、27、35號,依次類推,其中第一組做第一題,第二組做第二題,依次類推。
3)按規定格式完成課程設計報告,將其打印稿(A4紙)上交給老師存檔。
4)不得抄襲他人程序、課程設計報告,每個人應體現自己的個性設計,成績的考核按上機表現、答辯成績及課程設計說明書來綜合評定。成績分為優、良、中、及格、不及格五級分評定。
?
?
?
?
二、進度安排
第15 周??
星期三? 14時:00分——18時:00分
星期日? 8時:00分——12時:00分
第16 周? 星期一? 14時:00分——18時:00分
星期三? 8時:00分——12時:00分
星期三? 14時:00分——18時:00分
星期五? 8時:00分——12時:00分
課題1.測量任意程序的運行時間
????要求:該程序駐留內存
??? 思路:DOS操作系統中,程序的調入運行及程序的終止均是通過相應的軟中斷來實現的。若竊取相應軟中斷,記錄下程序開始調入運行的時間及程序終止的時間,則可測量出該程序運行的時間。
??? 提示要點:與之相關的軟中斷分別為:
??? 程序開始執行:4BH號系統功能調用(INT? 21H)
??? 程序結束: INT 20H
?????????????? INT 27H
?????????????? 00H、3lH、4CH號系統功能調用(INT 21H)
課題2.讀入一個文本文件并以DEBUG中的D命令格式顯示。
????要求:A、以DEBUG中的D命令格式顯示一個文本文件。
????????? B、文件名從鍵盤鍵入。
??? 思路:A、打開相應文件,讀內容至程序緩沖區。
????????? B、按要求顯示。
課題3.文件加密程序
?????要求:A、文件名從鍵盤輸入。
?????????? B、加密密鑰從鍵盤輸入。
???? 思路:從原文件讀取內容至緩沖區,對其加密后,重新寫回文件原來的地方。
???? 提示要點:A、加密可使用“異或”操作。
?????????????? B、相關中斷為3DH,3EH,3FH,40H,42H號系統功能調用(INT 21H)
課題4.編寫一個時鐘程序
???? 要求:A、駐留內存。?????
B、不影響其它程序運行。
C、把時鐘信號顯示在屏幕固定位置(最好為右上角)。
??? ?思路:先從系統實時鐘取得當前時間,每隔約0.05秒定時器向CPU發出一次8號中斷請求,是一個硬中斷。竊取 INT? 1CH中斷服務程序。
課題5.畫網格線
要求:A、背景為藍色、橫線為紅色、直線為黃色。
B、按用戶輸入的起點和終點坐標、列距和行距的大小畫出任意條橫豎線。
C、參數以十進制數形式輸入,格式如下:
??? Please enterstarting point (x1,y1):XX, XX
??? Please enterending point (x2,y2):XX, XX
??? Please enterdistance (row,col):XX, XX
課題6.畫脈沖波圖形
????? 要求:用戶以十進制數形式從鍵盤輸入脈沖高度、脈沖寬度和顏色參數(格式同上)后,以屏幕中間行為脈沖中間行,從左到右、滿屏畫出相應的脈沖波圖形。
課題7.用“*”畫菱形框
要求:A、背景為藍色、“*”為紅色,菱形框畫在屏幕中間,菱形中間為空格。
B、用戶以十進制數形式輸入菱形寬度和高度(格式同上)。
課題8.計算比賽成績
要求:A、7個評委,每個評委給分范圍為0~10分(整數)。
B、7個評委的給分中,去掉一個最高分和一個最低分,余下5位評委的平均分即為參加者的得分(精確到小數點后一位)。
C、將分數在屏幕中間位置處用紅色顯示出來。
?
?
目? 錄
?
1.???????? 題目... 1
2.???????? 程序總體設計方案、思路... 1
3.???????? 程序設計框圖... 1
4.???????? 源程序清單... 5
5.???????? 程序調試結果及分析... 12
6.???????? 設計總結... 13
?
?
1.????? 題目
計算比賽成績
要求:A、7個評委,每個評委給分范圍為0~10分(整數)。
B、7個評委的給分中,去掉一個最高分和一個最低分,余下5位評委的平均分即為參加者的得分(精確到小數點后一位)。
C、將分數在屏幕中間位置處用紅色顯示出來。
2.????? 程序總體設計方案、思路
程序總體設計可分為三個部分,三個子函數,先定義一段7個字節的內存空間ARRY存放7個評委給出的分數,定義兩個2字節存放最大和最小分數、2個字節存放平均分數以及一些信息字符串,第一個子函數DIB用于輸入7個分數,第二個子函數FIND用于找出7個分數中的最大值和最小值并存放到預先定義的兩個字節中,第三個子函數C_DISP計算出7個分數的平均值并輸出顯示,先將7個數相加,加完后再減去存放在內存里的最大和最小分數,最后除以5得到平均值,最后結合顯示器中斷調用(INT 10H)輸出平均分數,程序大致就這個過程。
3.????? 程序設計框圖
匯編程序流程圖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?????????????????圖3.1 程序流程圖,從開始到結束調用了三個子程序。
?
?
DIB子程序流程圖
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?? ???????????????????????????????圖3.2 DIB子程序流程圖,輸入7個數字到ARRY數組,
? ? ? ? ? ? ? ? ?這個流程圖的工序有些復雜,但還是準確表達子程序的思想。
FIND子程序流程圖
????????? ??圖3.3 FIND子程序是一個利用了一個簡單的算法來找出ARRY
數組里的最大和最小值,并存儲和顯示出來。
?
?
?C_DISP子程序流程圖(簡約流程圖)
??
?? ?????????????圖3.4 子程序C_DISP的流程圖,其實這個子程序是比較
復雜的,程序里面用字母’A’替代了10,在累加和輸出以及求平均數時的小數處理細節沒有寫出來。
?
?
?
4.????? 源程序清單
;2009年6月3日星期三 9:6:51
DATA SEGMENT
? ARRY DB 8DUP(?)
? MAX_MIN DB0,'A'
? SCORE DB 2DUP(?)
? MESSAGE DB'Please enter the seven consecutive Score(0~10):$'
? MESSAGE_MAXDB 0DH,0AH,'Max score:$'
? MESSAGE_MINDB 0DH,0AH,'Min score:$'
? MESSAGE_AVEDB 0DH,0AH,'Average score:$'
DATA ENDS
CODE SEGMENT
? ASSUMECS:CODE,DS:DATA
START:MOV AX,DATA
????? MOVDS,AX
?
????? CALLDIB
????? CALLFIND
????? CALLC_DISP
?
????? MOVAH,1
????? INT 21H
????? MOVAX,4C00H
????? INT 21H
;從鍵盤輸入7個0~10的數字到arry????????
DIB PROC NEAR
????? PUSH AX
????? PUSH CX
????? PUSH SI
????? MOVCX,7
????? LEASI,ARRY
?
????? LEADX,MESSAGE? ?;顯示提示信息
????? MOVAH,9
????? INT 21H
?
REP1: MOV AH,1
????? INT 21H
????? SUBAL,30H??
????? CMPAL,0
????? JL REP1
????? CMPAL,9
????? JG REP1
????? CMPAL,1
????? JEREP_10
????? JMP PUT
?
REP_10:MOV AH,7????;如果是第二次輸入,調用int21h的7h功能輸入,不用回顯出來
?????? INT21H
?
?????? SUBAL,30H??? ;是0嗎?
?????? CMPAL,0
?????? JEINPUT_A? ?;輸入10,用'A'代替輸入
INPUT_1:MOV AL,1
?????? JMPPUT
INPUT_A:
?????? MOVAH,2??? ?;如果判斷出來是數字0,就回顯一下,有輸入10的感覺
?????? MOVDL,'0'
?????? INT21H
?????? MOVAL,41H ?;輸入10,用'A'代替輸入
?
PUT:? MOV[SI],AL?
????? MOVDL,2CH?
????? MOVAH,2
????? INT 21H
????? INC SI
????? DEC CX
????? CMPCX,0
????? JNZREP1
?
??????
EXIT1: MOV BYTE PTR [SI],'$'
???? POP SI
???? POP CX
???? POP AX
???? RET
DIB ENDP
;查找最大和最小score的函數
FIND PROC NEAR
??? PUSH BX
??? PUSH CX
??? PUSH SI
??? MOV CX,7
??? LEASI,ARRY
REP2:MOV BL,[SI]
???? CMPMAX_MIN,BL
???? JG NEXT
???? MOVMAX_MIN,BL
NEXT:CMP MAX_MIN+1,BL
???? JL NEXT2
???? MOVMAX_MIN+1,BL
NEXT2:INC SI
???? LOOPREP2
?
;MAX,MIN
????? LEADX,MESSAGE_MAX? ?;顯示提示信息
????? MOVAH,9
????? INT 21H
????? MOVDL,MAX_MIN
????? CMPDL,41H
????? JNZNEXT_0
????? JMPOUT1_00?? ;輸出A時,用'1'&'0'代替
NEXT_0:ADD DL,30H
????? MOVAH,2
????? INT 21H
????? JMPTO_MIN
OUT1_00:MOV AH,2
??????? MOVDL,'1'
??????? INT21H
??????? MOVDL,'0'
??????? INT21H
?
TO_MIN:LEA DX,MESSAGE_MIN?? ;顯示提示信息
????? MOVAH,9
????? INT 21H
????? MOVDL,MAX_MIN+1
????? CMPDL,41H
????? JNZ NEXT_N0
????? JMPOUT1_000
NEXT_N0:ADD DL,30H
????? MOVAH,2
????? INT 21H
????? JMPTO_WAIT
OUT1_000:MOV AH,2
??????? MOVDL,'1'
??????? INT21H
??????? MOVDL,'0'
??????? INT21H
TO_WAIT:
????? MOVAH,1
????? INT 21H
?
EXIT2:POP SI
???? POP CX
???? POP BX
???? RET
FIND ENDP
;計算平均值得分并輸出來,精確一位小數,注意,5個數字的平均值,一定最多是1位小數位
C_DISP PROC NEAR
???? PUSH AX
???? PUSH CX
???? PUSH DX
???? PUSH SI
???? MOV CX,7
???? LEASI,ARRY
???? MOV AL,0
REP3:MOV BL,[SI] ?;將7個數都加起來到AX,最后減去MAXscore和MIN score
???? CMPBL,41H
???? JE NEXT33
???? ADDAL,BL
???? JMPNEXT3
NEXT33:ADD AL,10
NEXT3:INC SI
???? LOOPREP3
?
???? CMPMAX_MIN,41H
???? JESUB_10
???? SUBAL,MAX_MIN
???? JMPSUB_MIN
SUB_10:SUB AL,10
SUB_MIN:CMP MAX_MIN+1,41H
???? JESUB_N10
???? SUBAL,MAX_MIN+1
???? JMPNEXT44
SUB_N10:SUB AL,10
;CBW將AL累加起來的和擴展到AX
NEXT44:CBW
???? MOV BL,5
???? DIV BL
???? MOVSCORE,AL? ;score放商
???? CMPAH,0??? ;AH里是余數
???? JNZNEXT4 ??;余數不為0就再除一次即可
???? MOVSCORE+1,AH
???? JMPPRINT
NEXT4:MOV BL,AH
????? MOVAL,BL
????? CBW
????? MOVBL,10
????? MULBL? ??; (ax)←(al)*(src)
????? MOVBL,5
????? DIVBL??? ?;此處又是(al)←(ax)/(src)商,(ah)←(ax)/(src)余數一定是0了
????? MOVSCORE+1,AL
PRINT:MOV AH,0
????? MOVAL,3
????? INT 10H??;重新設置屏幕
?
????? LEADX,MESSAGE_AVE
????? MOVAH,9
????? INT 21H
?
????? MOVAH,2
????? MOVDX,0B26H
????? INT10H?????? ;調整光標位置
?
????? MOVAH,9
????? MOVBH,0
????? MOVBL,0CH ;(BL)前一個控制背景顏色,后一個控制字體顏色,0為黑,C為紅,0CH就是紅字黑底
????? MOVCX,3??
????? INT 10H
?????
????? MOVDL,SCORE? ??;average score的整數部分
????? ADDDL,30H
????? CMPDL,3AH
????? JNZ NNN2
????? JMPOUT1_0?
OUT1_0:INC CX??????
?
????? INT 10H
????? MOVDL,'1'? ;輸出'1'&'0'
????? MOVAH,2
????? INT 21H
?
????? MOVDL,'0'
????? INT 21H
????? JMP XSD
??????
NNN2:MOV AH,2
????? INT 21H
?
XSD:? MOVDL,'.'? ?;小數點
????? MOVAH,2
????? INT 21H
?
????? MOV DL,SCORE+1 ?;average score小數部分,只有1位
????? ADDDL,30H
????? MOVAH,2
????? INT 21H
EXIT5:POP SI
????? POP DX
????? POP CX
????? POP AX
????? RET
C_DISP ENDP
CODE ENDS
???? ENDSTART
5.????? 程序調試結果及分析
?
??????????????圖5.1 ?程序運行的第一個界面,這里顯示的是輸入7個分數之后的情況。
?
?
??????????????? 圖5.2 這是程序運行時的第二個界面,顯示了提示信息和
在屏幕中央用紅色字體顯示平均分數。
?
?
?
6.????? 設計總結
?
總結
以上是生活随笔為你收集整理的汇编语言程序设计,计算比赛成绩的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 6.5 设计数字滤波器
- 下一篇: 中国首次全尺寸超导航行试验成功,速度超