




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
目錄
摘要............................................................1
1概述............................................................2
2程序設(shè)計......................................................2
2.1系統(tǒng)程序綜述...........................................................2
2.2各模塊框圖.............................................................2
3具體設(shè)計......................................................6
3.1各模塊說明.............................................................6
3.2各模塊具體設(shè)計.........................................................7
4程序調(diào)試......................................................10
4.1運行界面分析..........................................................10
4.2調(diào)試過程及分析........................................................13
5心得體會......................................................14
附錄程序清單..................................................15
參考文獻(xiàn)........................................................25
本科生課程設(shè)計成果評定表.......................................26
摘要
隨著電子技術(shù)的進(jìn)展,計算機在現(xiàn)代科學(xué)技術(shù)的進(jìn)展中起著越來越重要的作
用。多媒體技術(shù)、網(wǎng)絡(luò)技術(shù)、智能信息處理技術(shù)、自適用掌握技術(shù)、數(shù)據(jù)挖掘與
處理技術(shù)等都離不開計算機。在此設(shè)計中采用DOS21H中斷類型的10號鍵盤功
能調(diào)用,將從鍵盤接收的表示年份數(shù)值的字符串按字節(jié)存入緩沖區(qū)。將字符串中
的每個字符轉(zhuǎn)換為對應(yīng)的十進(jìn)制數(shù)值(采用0—9這10個數(shù)的ASCII碼值比其本
身大30H的關(guān)系),采用推斷某年是否為閏年的表達(dá)式,輸出該年是否為閏年的
信息。
解決本問題的關(guān)鍵是找到推斷閏年的方法。推斷閏年的規(guī)章是:假如某一年
能被4整除但不能被100整除或者該年能被400整除,則該年為閏年。
推斷某年是否為閏年的匯編語言的表達(dá)式為:
(((AX)MOD4EQ0)AND((AX)MOD100NEO))OR((AX)
MOD400EQ0)
本課程設(shè)計的主程序依據(jù)以上的表達(dá)式設(shè)計的,而且創(chuàng)新地增加了推斷該年
份的生肖屬性模塊。
關(guān)鍵詞:閏年匯編語言微機原理中斷
推斷閏年
1概述
本次課程的內(nèi)容是采用DOS21H中斷類型的10號鍵盤功能調(diào)用,將健盤
接受到的年份數(shù)值的字符串按字節(jié)存入緩沖區(qū)。將字符串中的每個字符轉(zhuǎn)換為對
應(yīng)的十進(jìn)制數(shù)值(采用0-9這10個數(shù)的ASCH碼值比其本身大30H的關(guān)系),
采用推斷某年是否為閏年的表達(dá)式,輸入該年是否為閏年的信息。要求輸入具體
的年份后,輸出是否為閏年的提示信息,并且可接著輸入年份連續(xù)推斷,按Q
或q鍵退出程序。由于此程序比較簡潔,我們對輸入的年份限定了一個范隹I,當(dāng)
所輸入的年份超出這個范圍,或者輸入的根本就不是年份時,系統(tǒng)就會提示錯誤
并重新輸入。此外增加了一段推斷所輸入的年份的生肖屬性模塊。當(dāng)輸入2022
年時,dos界面會顯示“2022isayearofHorse
2.程序設(shè)計
2.1系統(tǒng)程序綜述
閏年的具體算法為:假如該年份的數(shù)值能被4整除卻不能被100整除,或者
該年份的數(shù)值能被400整除,則該數(shù)值代表的年份為閏年。推斷生肖年的核心算
法為:用該年份的數(shù)值除以12,若余數(shù)為0,則說明是猴年,以此類推。
2.2各模塊框圖
此程序雖然不難,但也不是很短,因此為了讓程序條理清楚,我們將整段程
序分為四個模塊:MAIN、INPUT、JUDGE及WHICHYEAR。各模塊的程序流
程圖分別如圖2-1、2-2.2-3及2-4所示。
圖2TMAIN模塊流程圖
圖2-2INPUT模塊流程圖
N
是閨年y——<是否整除?:>
圖2-3JUDGE模塊流程圖
開始
將所輸入的年份存入AX
用AX除以12
對應(yīng)屬相字符串地址
輸出顯示屬相的名稱
_1[__
f結(jié)束:
圖2-4WHICHYEAR模塊流程圖
3具體設(shè)計
3.1各模塊說明
主模塊MAIN用來顯示提示輸入以及輸入的字符內(nèi)容,最終輸出做出的推斷
并確定是否退出程序;INPUT子模塊用來將數(shù)字字符串轉(zhuǎn)換為數(shù)字,以便進(jìn)行
下面的程序操作,同時對輸入的年份格式進(jìn)行推斷,若格式錯誤則輸出4Input
illegal!’,并要求重新輸入年份;JUDGE子模塊用來推斷所輸入的年份是否為閏
年,若輸入閏年2000則輸出42000isleapyear!',若輸入非閏年1900則輸出'1900
isnotle叩year!';WHICHYEAR子模塊用來推斷所輸入的年份是什么生肖年,
若輸入2022則輸出'2022isayearofRabbit!
3.2各模塊具體設(shè)計
在主模塊MAIN中分別調(diào)用三個子模塊INPUT、JUDGE、WHICHYEAR,
做出推斷后顯示是否退出的提示信息,按下任意鍵連續(xù),按下Q或q鍵則退出程
序。
MAIN主模塊的部分程序代碼如下。
LOPO:
CALLINPUT
CALLJUDGE
CALLWHICHYEAR
LEADX,MESS
MOVAH,09H
INT21H
MOVAH,08H
INT21H
CMPAL/Q'
JEEXIT
CMPAL,'q'
JEEXIT
LEADX,NEWLINE;回車、換行
MOVAH,09H
INT21H
JMPLOPO
INPUT子模塊首先推斷輸入的年份是否正確,由于我們的要求是從190()年
到210()年,因此輸入的年份必需是4位的,若不是系統(tǒng)會提示錯誤,這個功能
由以下程序代碼完成。
MOVDL,BYTEPTRINBUFFfl]
CMPDL,4
JNEERROR
此外,推斷所輸入的年份是否在19()0年到2100年之間的程序代碼如下。
CMPAXJ900
JBERROR
CMPAX,2IOO
JAERROR
JMPS2
由于輸入的年份是字符串,因此需要轉(zhuǎn)換為數(shù)。數(shù)字所對應(yīng)的ASCII值與他
們相差30H,所以只需要將所輸入的字符減30H就可以得到相應(yīng)的數(shù)值。若輸入
的是非數(shù)字,那么經(jīng)轉(zhuǎn)換后得到的數(shù)值就不再0到9之間,此時系統(tǒng)會提示錯誤。
LOP1:
MOVDLJ0
MULDL
MOVDL,BYTEPTR[BX]
SUBDL,30H
CMPDL,0
JBERROR
CMPDL,9
JAERROR
ADDAX,DX
INCBX
LOOPLOP1
JUDGE子模塊用來推斷所輸入的年份是否為閏年,先用轉(zhuǎn)換后的數(shù)值除以
4,若不能整除,則確定不是閏年,若可以整除貝!再用其除以100,若不能整除,
則確定是閏年,若能整除則說明不是閏年。最終用轉(zhuǎn)換后的數(shù)值除以400,若可
以整除,則確定是閏年,否則就不是閏年。其核心算法如下。
MOVDX,0
MOVCX,AX
MOVBX,4
DIVBX
CMPDX,()
JNENOTLEAP
MOVAX,CX
MOVBXJOO
DIVBX
CMPDX,0
JNEISLEAP
MOVAX,CX
MOVBX,4(X)
DIVBX
CMPDX,0
JNENOTLEAP
在WHICHYEAR子模塊中,用轉(zhuǎn)換后的數(shù)值除以12,若余數(shù)為0,則說明
是猴年;若余數(shù)是1,則說明是雞年;若余數(shù)是2,則說明是狗年,以此類推。
LOP3:
MOVDL,BYTEPTR[BX]
MOVAH,02H
INT2IH
INCBX
LOOPLOP3
POPAX
MOVDX,0
MOVBXJ2
DiVBX
CMPDX,0
JEMONKEYYEAR
CMPDXJ
JEROOSTERYEAR
CMPDX,2
JEDOGYEAR
CMPDX3
JEBOARYEAR
CMPDX,4
JERATYEAR
CMPDX,5
JEOXYEAR
CMPDX,6
JETIGERYEAR
CMPDX,7
JERABBITYEAR
CMPDX,8
JEDRAGONYEAR
CMPDX,9
JESNAKEYEAR
CMPDXJO
JEHORSEYEAR
JMPGOATYEAR
4程序調(diào)試
4.1運行界面分析
執(zhí)行程序后的初始界面如圖4-1所示。
C:\fIMDOfS\syste?32\od.exe-Exl
Pleaseinputtheyeai?<1900-2100>:
圖4-1
輸入年份2022后執(zhí)行程序,界面如圖4-2所示。
C:\fINDO¥S\systea32\cBd.eze-I°|x|
leaseinputtheyear<1,900-2100〉:19ab
nputillegal?
pleaseinputtheyear<^00^2^0^20O
2014isnotleapyear?
|2H14sayeai'oft.he
Ifyout;anttoquitpleaseress...q.
Pressotherkeytocontinue!
圖4-2
此時按下除Q和q的任意鍵可以連續(xù)執(zhí)行程序,輸入年份1900后再次執(zhí)行
程序,界面如圖4-3所示。
C:\¥Hn)0¥S\syste?32\c?d.exe
leasejinput._theyear<1900-2100>:[L9ab
putillegal?
p1ea
20l4inputtheyear<1900-2100>:2014
―
20l4notleapyear?
ayearoftheHorse?
Ifyouwanttoquitpleaseress...q/Q...
Pressotherkeutocontinue
Pleaseinputtheyear<1900-2100〉
1900isnotleapyear?
1900isauearoftheRat?
Ifyouwanttoquitplease
PressotherkeytocontinueHHHHMHHHi
圖4-3
按下除Q和q的任意鍵可以連續(xù)執(zhí)行程序,若此時輸入的年份不是4位數(shù)的
或者輸入的是字母、符號等,系統(tǒng)會提示錯誤并要求重新輸入,界面如圖4-4所
示。
圖4-4
輸入了正確格式的年份后連續(xù)執(zhí)行程序,然后按下Q或者q可以退出程序。
4.2調(diào)試過程及分析
最初在調(diào)試時,大部分的年份都可以推斷正確,但對于1900、2000、2100
等這些特殊年份,有時候推斷正確有時候推斷錯誤。后來經(jīng)過檢查發(fā)覺是JUDGE
子模塊程序錯誤,經(jīng)過長時間的修改后,排解了錯誤,可以止確推斷閏年。
后來在程序中加入了WHICHYEAR子模塊后再調(diào)試時,發(fā)覺不管輸入哪個
年份,推斷得到的都是猴年。檢查后發(fā)覺是由于在執(zhí)行JUDGE子模塊后AX寄
存器的值為0,用0去除以12后得到的余數(shù)總是0,因此得到的都是猴年。在
JUDGE子模塊中加入了一對PUSHAX和POPAX后順當(dāng)解決了此問題。
5心得體會
這是我其次次做課程設(shè)計,經(jīng)過第一次的熬煉,我對課程設(shè)計的基本要
求有了更清楚的了解C在設(shè)計的過中仍舊遇到了許多問題,但最終通過自己的
思索與詢問他人,我勝利的完成了整體設(shè)計要求。通過前期自己查資料,思索
課題,我學(xué)到了許多課外的學(xué)問。經(jīng)過幾天的修改,我完成了要求的設(shè)計方案,
畫出了設(shè)計流程圖。接下來我依據(jù)流程圖完成了程序的編寫,程序編完后用了
一段時間對程序進(jìn)行調(diào)試。在調(diào)試的過程中,我遇到了一些問題,剛開頭程序
并不能很好的運行,經(jīng)過錯誤分析與不斷修改,最終解決了問題,程序能夠正
常運行并輸出正確的結(jié)果。通過本次試驗,我對循環(huán)語句、分支語句和子程序
有了進(jìn)一步的了解,明確了它們各自的功能及具體的運用狀況。特殊是在子程
序設(shè)計時,應(yīng)認(rèn)真考慮哪些寄存器是必需保存的,哪些寄存器是不必要或不應(yīng)
當(dāng)保存的。一般說來,子程序中用到的寄存器是應(yīng)當(dāng)保存的。但是,假如使用
寄存器在主程序和子程序之間傳送參數(shù)的話,則這種寄存器就不肯定需要俁存,
特殊是用來向主程序回送結(jié)果的寄存器,就更不應(yīng)當(dāng)因保存和恢復(fù)而破壞了應(yīng)
當(dāng)向主程序傳送的信息。在試驗中體現(xiàn)出對指令不嫻熟,因此應(yīng)當(dāng)在以后的學(xué)
習(xí)中進(jìn)一步的學(xué)習(xí),編出實現(xiàn)功能更好的,讓自己滿足的程序來。
經(jīng)過這次課程設(shè)計,大大地提高了我的分析解決問題的力量,在這一過程中,
我依據(jù)課程設(shè)計題目所給定的總題要求,獨立設(shè)計、分析和調(diào)試程序,在面對問
題時,能夠急躁思索,解決了許多問題,從中也學(xué)到了許多書面上所沒有講明的
問題。在運用匯編語言理論學(xué)問去解決問題時,也對以前學(xué)過的學(xué)問點有更深一
層的了解??傊?,這次課程設(shè)計,讓我學(xué)到了許多有用的學(xué)問,對我以后的學(xué)習(xí)
有很大的關(guān)心與提高。而且我深刻地熟悉到學(xué)好專業(yè)學(xué)問的重要性,也理解了理
論聯(lián)系實際的含義,并且檢驗了自己的學(xué)習(xí)成果。設(shè)計的整個過程,熬煉了我們
的思索與運用的學(xué)問力量,并旦學(xué)習(xí)到做討論的急躁與專注力,要有一絲不茍的
態(tài)度,科學(xué)不行有半點馬虎。這次設(shè)計,讓我熟悉到自己對于學(xué)問的運用和連接
還不夠嫻熟,我將在以后的學(xué)習(xí)中連續(xù)努力、不斷完善,為今后的進(jìn)展打下了良
好的基礎(chǔ)。
附錄程序清單
DATASEGMENT
INBUFFDB5,?,5DUP(?)淀義輸入緩沖區(qū)
PROMPTDB0DH,0AH,'Pleaseinputtheyear(l900-2100):','$'
ERRMSGDB'Inputillegal!\'$'
YESDB'isleapyearS'/S'
NODBrisnotleapyear!';$'
MESSDB'Ifyouwanttoquitpleasepress...q/Q...,
DB0AH,0DH,'Pressotherkeytocontinue','$'
NEWLINEDB13,10,$
ZlDB*isayearoftheRabbit!',0DH,0AH,$
Z2DB'isayearoftheDragon!',0DH,0AH/$'
Z3DB'isayearoftheSnake!1,0DH,0AH;$'
Z4DB,isayearoftheHorse!1,0DH,0AH,'$'
Z5DB1isayearoftheGoat!',0DH,0AH,'$'
Z6DB*isayearoftheMonkey!',0DH,()AH,$
Z7DB*isayearoftheRooster!*,0DH,0AH:$'
Z8DB,isayearoftheDog!,,0DH,0AH;$'
Z9DB,isayearoftheBoar!;0DH,0AH:$'
ZI0DB*isayearoftheRat!',0DH,0AH,'$'
ZllDB'isayearoftheOx「,0DH,0AH,$
Z12DB*isayearoftheTiger!\0DH,0AH,'$'
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:CODE,DS:DATA
START:
PUSHDX
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
LOPO:
CALLINPUT,調(diào)用INPUT子模塊
CALLJUDGE;調(diào)用JUDGE子模塊
CALLWHICHYEAR;調(diào)用WHICHYEAR子模塊
LEADX,MESS;顯示提示信息
MOVAH,09H多字符輸出
INT21H
MOVAH,08H;鍵盤輸入無回顯
INT21H
CMPAL:Q';輸入Q或q退出程序
JEEXIT
CMPAL,'q'
JEEXIT
LEADX,NEWLINE;回車、換行
MOVAH,09H
1NT21H
.IMPLOPO
EXIT:
RET
MAINENDP
INPUTPROCNEAR
PUSHBX
PUSHCX
PUSHDX
SI:
LEADX,PROMPT;輸入年份提示
MOVAH,09H
INT21H
LEADX,INBUFF
MOVAH,0AH
INT2IH
MOVDL,BYTEPTRINBUFF[I1;若輸入的生份不是4為就退出程序
CMPDL,4
JNEERROR
MOVCX,4
LEABX,INBUFF
ADDBX,2
MOVAX,0
MOVDX,0
LOP1:
MOVDL,10
MULDL
MOVDL.BYTEPTR[BX]
SUBDL,30H輸入字符的ASCII值減去3()H得到對應(yīng)的數(shù)值
CMPDL,0;數(shù)值小于0則系統(tǒng)提示錯誤
JBERROR
CMPDL,9;數(shù)值大于9則系統(tǒng)提示錯誤
JAERROR
ADDAX,DX
INCBX
LOOPLOP1
CMPAXJ900;組合后的數(shù)值小于1900則系統(tǒng)提示錯誤
JBERROR
CMPAX,2100;組合后的數(shù)值大于2100則系統(tǒng)提示錯誤
JAERROR
JMPS2
ERROR:;系統(tǒng)提不錯誤信息
LEADX,NEWLINE
MOVAH,09H
INT2IH
LEADX,ERRMSG
MOVAH,09H
INT21H
LEADX,NEWLINE
MOVAH,09H
INT21H
JMPS1
S2:
MOVCX,AX
LEADX,NEWLINE
MOVAH,09H
INT21H
MOVAX,CX
POPDX
POPCX
POPBX
RET
INPUTENDP
JUDGEPROCNEAR
PUSHBX
PUSHCX
PUSHDX
PUSHAX
PUSHAX
MOVCX,4
LEABX,INBUFF
ADDBX,2
LOP2:
MOVDL,BYTEPTR[BX]
MOVAH,02H
INT21H
INCBX
LOOPLOP2
POPAX
MOVDX,0
MOVCX,AXN^AX中的值暫存在CX中
MOVBX,4
DIVBX;年份對應(yīng)的數(shù)值除以4
CMPDX,0
JNENOTLEAP
MOVAX,CX
MOVBXJOO;年份對應(yīng)的數(shù)值除以10()
DIVBX
CMPDX,0
JNEISLEAP
MOVAX,CX
MOVBX,400;年份對應(yīng)的數(shù)值除以400
DIVBX
CMPDXQ
JNENOTLEAP
ISLEAP:;顯示閏年提示信息
LEADX,YES
MOVAH,09H
INT21H
JMPS3
NOTLEAP:;顯示非閏年提示信息
LEADX,NO
MOVAH,09H
INT2IH
S3:
LEADX,NEWLINE
MOVAH,09H
INT21H
POPAX
POPDX
POPCX
POPBX
RET
JUDGEENDP
WHICHYEARPROCNEAR
PUSHBX
PUSHCX
PUSHDX
PUSHAX
MOVCX,4
LEABX.INBUFF
ADDBX,2
LOP3:
MOVDL,BYTEPTR[BX]
MOVAH,02H
INT21H
INCBX
LOOPLOP3
POPAX
MOVDX,0
MOVBX,12
DIVBX,年份對應(yīng)的數(shù)值除以12
CMPDX,0;余數(shù)為0則為猴年
JEMONKEYYEAR
CMPDX,1;余數(shù)為1則為雞年
JEROOSTERYEAR
CMPDX,2;余數(shù)為2則為狗年
JEDOGYEAR
CMPDX,3;余數(shù)為3則為豬年
JEBOARYEAR
CMPDX,4;余數(shù)為4則為鼠年
JERATYEAR
CMPDX,5;余數(shù)為5則為牛年
JEOXYEAR
CMPDX,6;余數(shù)為6則為虎年
JETIGERYEAR
CMPDX,7;余數(shù)為7則為兔年
JERABBITYEAR
CMPDX,8;余數(shù)為8則為龍年
JEDRAGONYEAR
CMPDX,9;余數(shù)為9則為蛇年
JESNAKEYEAR
CMPDXJO;余數(shù)為1()則為馬年
JEHORSEYEAR
JMPGOATYEAR;否則,則為羊年
MONKEYYEAR:;顯示猴年提示信息
LEADX.Z6
MOVAH,09H
INT21H
JMPS4
ROOSTERYEAR;,顯示雞年提示信息
LEADX,Z7
MOVAH,09H
INT21H
JMPS4
DOGYEAR:;顯示狗年提示信息
LEADX,Z8
MOVAH,09H
INT2IH
JMPS4
BOARYEAR:;顯示豬年提示信息
LEADX.Z9
MOVAH,09H
INT21H
JMPS4
RATYEAR:;顯示鼠年提示信息
LEADX,Z10
MOVAH,09H
INT21H
JMPS4
OXYEAR:;顯示牛年提示信息
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 地鐵工程檔案資料集中管理措施
- 小學(xué)普通話節(jié)慶活動推廣計劃
- 網(wǎng)球培訓(xùn)機構(gòu)教學(xué)計劃
- 裝飾工程施工技術(shù)質(zhì)量保證體系及措施
- 小學(xué)乒乓球社團(tuán)多樣化訓(xùn)練計劃
- 科技企業(yè)人力資源部創(chuàng)新激勵計劃
- 金融行業(yè)風(fēng)險資源配備計劃
- 腫瘤科輸血流程與規(guī)范管理
- 綜藝節(jié)目腳本策劃書范文
- 拆除施工塵土污染防治文明措施
- 體育經(jīng)紀(jì)人資格考試復(fù)習(xí)資料
- 2025年英語四級考試試卷及答案
- 中國絲綢文化課件
- 人工血管內(nèi)瘺穿刺技巧與護(hù)理
- 脊柱術(shù)后腦脊液漏護(hù)理
- 預(yù)防溺水小學(xué)課件
- 血小板減少課件
- 裝修工程滿堂腳手架施工方案
- 12J12無障礙設(shè)施圖集
- VMware數(shù)據(jù)中心的服務(wù)器虛擬化與運維管理解決方案
- 夫妻婚內(nèi)財產(chǎn)約定協(xié)議書范本(2025年)
評論
0/150
提交評論