匯編課程設(shè)計報告_第1頁
匯編課程設(shè)計報告_第2頁
匯編課程設(shè)計報告_第3頁
匯編課程設(shè)計報告_第4頁
匯編課程設(shè)計報告_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

萬年歷顯示程序(《微機(jī)接口與匯編語言》)一、課題內(nèi)容和要求題目描述:用匯編語言編寫一個有簡單界面顯示的日歷,要求輸入年月日后,將該月的完整日歷顯示出來,包括星期幾,且每月的星期六,日用不同顏色來表示。并且要求顯示輸入的日期?;疽螅海?)設(shè)計一個簡單的接受鍵盤輸入年月日信息的界面;(2)輸入年月日后,將該月的完整日歷顯示出來,包括星期幾,且每月的六,日。(3)實物演示時要求講出程序原理和設(shè)計思想;(4)程序運(yùn)行良好、界面清晰。提高要求:(1)界面色彩鮮明、友好,能夠突出顯示主題;(2)用不同的色彩明顯表示出輸入的日期;(3)錯誤輸入要有提示及處理,結(jié)果顯示清晰、合理。二、需求和思路分析 本課題要求設(shè)計一個顯示萬年歷的程序,即要輸入年月日后,將這個月的完整日歷顯示出來,包括這個月的每一天是星期幾也要顯示。公歷每年有12個月,其中1、3、5、7、8、10、12月為大月,每月31天;4、6、9、11月為小月,每月30天。公歷有閏年平年之分,若某年是閏年,則該年2月有29天,全年有366天;若某年是平年,則該年2月有28天。那么首先要做的就是完成通過鍵盤輸入得到要顯示的年月日,能夠?qū)⒛暝氯諆Υ嫫饋硗瑫r將輸入的日期顯示出來這個功能。在這里可以調(diào)用INT21H的0AH的功能將鍵入的一串字符送入用戶程序的緩沖區(qū),0AH功能要求鍵入的字符串必須以“回車”做為結(jié)束標(biāo)志,換句話說,按下回車鍵后,本次功能調(diào)用結(jié)束。由于題目的要求錯誤輸入要有提示及處理,所以也要考慮到所輸入的年月日是否有符合日常邏輯,如果輸入不正確,要顯示出錯誤輸入信息,并且提示重新輸入年月日。本課題的重點(diǎn)的地方和難點(diǎn)的地方就是怎么將輸入的日期的當(dāng)月的完整日歷給顯示出來。那么就得在屏幕上先顯示出星期一到星期日,在設(shè)計時將SUN…SAT在屏幕上顯示出來,然后在下面依次顯示完這個月的所有天數(shù),而且要正確顯示。在顯示每個月的第一天的時候,首先要能夠確定第一天是星期幾。這樣才能夠正確的向下顯示,并且顯示這個月的最后一天不能夠超出這個月的最大天數(shù),在這里也就要考慮到各個月不同天數(shù)的情況,尤其是二月,閏年的二月有29天。在確定輸入的那個月的第一天是星期幾可以通過蔡勒公式求得,計算某一天是星期幾,如下:W=[C/4]-2C+y+[y/4]+[13*(M+1)/5]+d–1,C是世紀(jì)數(shù)減1,y是年份后兩位,M是月份,d是日數(shù),計算出來的結(jié)果模取7。求得這個月的第一天是星期幾后,會發(fā)現(xiàn)如果是星期一的話,最后算得的W的值為1,依次類推,星期日的W值為0,那么可以根據(jù)W值來確定要顯示的行和列,最后限定一下要顯示的這個月的最后一天,那么日歷就可以正確的顯示出來了。在用蔡勒公式計算的時候要注意1月和2月按上一年的13月和14月來算,這時C和y均按上一年取值。日歷的顯示也要注意光標(biāo)的定位。設(shè)置星期六、日兩列的字體為紅色,打印出當(dāng)前顯示的是哪一年的哪一個月,打印出MON,TUR等字樣,以標(biāo)注哪天是星期幾。根據(jù)月的大小進(jìn)行循環(huán)的輸出日期,在此過程中,要注意一位數(shù)與兩位數(shù)對格式的影響,最后顯示出來的界面要清潔。三、概要設(shè)計1.程序系統(tǒng)整體流程圖:2.程序系統(tǒng)每個子程序的流程圖(1)二進(jìn)制轉(zhuǎn)十進(jìn)制子程序(2)判斷閏年子程序(3)求輸入的日期對應(yīng)月的第一天是星期幾四、詳細(xì)設(shè)計1、輸入年月日模塊 本課題要求輸入年月日就顯示該月的日歷,首先要做的是通過鍵盤來輸入日期,在程序中使用INT21H的0AH的功能調(diào)用,它的功能是等待鍵入一串字符送入用戶程序的數(shù)據(jù)緩沖區(qū)。0AH功能要求鍵入的字符串以“回車”做為結(jié)束標(biāo)志,按下回車以后,本次功能調(diào)用結(jié)束,光標(biāo)返回當(dāng)前行始格?!盎剀嚒狈粼诰彌_區(qū)當(dāng)中。對緩沖區(qū)的格式有如下要求,緩沖區(qū)要設(shè)置在程序數(shù)據(jù)段,調(diào)用前,緩沖區(qū)的首址偏移量應(yīng)賦給DX寄存器。緩沖區(qū)首單元應(yīng)預(yù)置“允許接收的字符個數(shù)”(包括回車鍵在內(nèi))。用戶鍵入回車之后,由0AH功能把實際鍵入的字符個數(shù)(不包括回車鍵)寫入STR1+1單元。鍵入的字符串從STR1+2單元開始依次存放。因此緩沖區(qū)的容量要不小于鍵入的鍵入的串的長度(包括回車鍵)+2。在程序中這么定義的:STR1DB 9 DB ? DB 9DUP(?)比如要輸入20090327,這樣只能輸入像這種格式的8個字符。這樣輸入就完成了,但是由于輸入的是年月日,也要判斷其是否符合現(xiàn)實。也就要對輸入的年月日進(jìn)行處理,如果輸入不正確就提示出錯,并且重新輸入。判斷輸入的是否正確有以下幾個方面要考慮,首先輸入的月只能在01-12里面的情況,日的最小天數(shù)要不小于1,最大不能超過剛才輸入的月的最大天數(shù)。在程序里,我是通過這樣的方法實現(xiàn)的,我把12個月的天數(shù)定義為BUF1DB31,?,31,30,31,30,31,31,30,31,30,31,其中?就是2月的天數(shù),由于不知道輸入的年是否是閏年,所以2月的最大天數(shù)在這里還未知。下面要做的就是首先判斷輸入的年是否是閏年,程序中通過CALLPR調(diào)用判斷平年還是閏年的程序。關(guān)于通過什么算法來判斷是否閏年的這里就不再詳細(xì)的介紹了,算法的流程圖已經(jīng)在上面給出了。通過算法判斷得出輸入的年是否是閏年,如果是閏年那么就將29存到剛才定義的BUF1里面,如是平年就將28存到BUF1里。這樣通過輸入的月就可以知道每個月的最大天數(shù)了。比如輸入的是1月,那么就調(diào)用BUF1里面第一個數(shù)據(jù)就知道1月的最大天數(shù)31天了。一個輸入年月日的模塊也就完成了,也能夠判斷輸入是否正確。2、顯示日歷模塊 課題中對于顯示也作了要求:日歷的顯示。注意光標(biāo)的定位。設(shè)置星期六、日兩列的字體為紅色,打印出當(dāng)前顯示的是哪一年的哪一個月,打印出MON,TUR等字樣,以標(biāo)注哪天是星期幾。根據(jù)月的大小進(jìn)行循環(huán)的輸出日期,在此過程中,要注意一位數(shù)與兩位數(shù)對格式的影響。另外,打印到星期天要輸出換行。要打印出MON,TUR等字樣,以標(biāo)注哪天是星期幾。首先定義一個數(shù)據(jù)緩沖區(qū)WEEKDB"SUNMONTUEWEDTHUFRISAT$"然后在后面直接用顯示功能,使其在屏幕中顯示出來。下面做的就是要輸出輸入的月的所有天數(shù),這里關(guān)鍵先要判斷這個月的第一天是星期幾,算法在上面流程圖中也給出了。通過算法得出月的第一天是星期幾,然后往下依次輸出其最大天數(shù)從上面的BUF1中獲取。對于題中給的要求,設(shè)置星期六、日兩列的字體為紅色。這個只需在顯示日歷的時候,判斷要顯示的是否是第一列和最后一列,如果是就運(yùn)用BIOS的INT10H的06H功能就能將其顏色設(shè)置成紅色。其入口參數(shù)AL=上卷行數(shù);AL=0:整個窗口空白,BH=卷入行屬性,CH:CL=左上角行號:列號,DH:DL=右下角行號:列號。對于上面的輸入日期的顏色以及程序運(yùn)行的背景顏色也都是通過這種方法實現(xiàn)的。3、源程序代碼:DATASSEGMENTA1DB"=====================================$"A2DB"*******Calendar********$"A3DB"designer:Wubinghui$"A4DB"Pleaseinputthedate:$"A5DB"Pleaseinputthedatelike:20090101$"STR1DB9 DB? DB9DUP(?)A6 DW0A7DB0A8 DB"Date:$" B DW?C1DW0C2DB0GDB0N DB?P DW?YDB?WEEKDB"SUNMONTUEWEDTHUFRISAT$"YEAR DW?MONTHDW?DAYDW?WRONGDB"Thedateyouinputiswrong!Pleasetryagain$"ROW DB1BUF1 DB31,?,31,30,31,30,31,31,30,31,30,31BUF2 DB1,2,3,4,5,6,7,8,9,10,11,12BUF3 DB'1',0AH,0DH,'$' DB'2',0AH,0DH,'$' DB'3',0AH,0DH,'$' DB'4',0AH,0DH,'$' DB'5',0AH,0DH,'$' DB'6',0AH,0DH,'$' DB'7',0AH,0DH,'$' DB'8',0AH,0DH,'$' DB'9',0AH,0DH,'$' DB'10',0AH,0DH,'$' DB'11',0AH,0DH,'$' DB'12',0AH,0DH,'$' DB'13',0AH,0DH,'$' DB'14',0AH,0DH,'$' DB'15',0AH,0DH,'$' DB'16',0AH,0DH,'$' DB'17',0AH,0DH,'$' DB'18',0AH,0DH,'$' DB'19',0AH,0DH,'$' DB'20',0AH,0DH,'$' DB'21',0AH,0DH,'$' DB'22',0AH,0DH,'$' DB'23',0AH,0DH,'$' DB'24',0AH,0DH,'$' DB'25',0AH,0DH,'$' DB'26',0AH,0DH,'$' DB'27',0AH,0DH,'$' DB'28',0AH,0DH,'$' DB'29',0AH,0DH,'$' DB'30',0AH,0DH,'$' DB'31',0AH,0DH,'$'DATASENDSSTACKSSEGMENTSTACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSSTART: MOVAX,DATAS MOVDS,AX MOVAH,0 ;設(shè)置顯示方式 MOVAL,3 ;80*25彩色文本方式 INT10H MOVAH,6 MOVAL,0 MOVCH,0 MOVCL,0 ;清整個屏幕 MOVDH,80 MOVDL,80 MOVBH,10110000B ;前四位定義背景色,后四位定義前景色 INT10H MOVDH,ROWMOVDL,2CALLGBIAOLEADX,A1CALLNINEADDROW,2MOVDH,ROWMOVDL,1CALLGBIAOLEADX,A2CALLNINEADDROW,2MOVDH,ROWMOVDL,8CALLGBIAOLEADX,A3CALLNINEADDROW,2MOVDH,ROWMOVDL,1CALLGBIAOLEADX,A5CALLNINEADDROW,2REINPUT:MOVAH,6 ;輸入日期顯示藍(lán)色 MOVAL,0 MOVCH,ROW MOVCL,23 MOVDH,ROW MOVDL,30 MOVBH,10110001B INT10HMOVDH,ROWMOVDL,1CALLGBIAOLEADX,A4CALLNINEMOVDH,ROWMOVDL,23CALLGBIAO LEADX,STR1;輸入日期,保存在緩沖區(qū)STR1中MOVAH,10INT21HADDROW,2LEADI,STR1+2;DI指向日期輸入串的首地址MOVCX,4MOVAX,0P1: MOVBL,[DI] ;取字符送到BL SUBBL,30H ;字符減去30H,轉(zhuǎn)化為真值 MOVBH,0 MOVP,10 MULP ADDAX,BX INCDI ;DI指向下一個字符 DECCX ;長度減一 JNZP1 MOVYEAR,AXCALLPR ;調(diào)用判斷平年還是閏年的程序 JCL1 ;有進(jìn)位,借位,跳轉(zhuǎn)到L1,輸出閏年,否則順序執(zhí)行,是平年 LEADI,BUF1MOV[DI+1],BYTEPTR28 ;平年把28送入BUF1中 JMPL2L1: LEADI,BUF1MOV[DI+1],BYTEPTR29 ;閏年把29送入BUF1中L2: LEADI,STR1+6MOVCL,2MOVAX,0P2: MOVBL,[DI] SUBBL,30H MOVBH,0 MOVP,10 MULP ADDAX,BX INCDI DECCX JNZP2 MOVMONTH,AX ;獲得月份值 LEADI,STR1+8 MOVCL,2 MOVAX,0P3: MOVBL,[DI] SUBBL,30H MOVBH,0 MOVP,10 MULP ADDAX,BX INCDI DECCX JNZP3 MOVDAY,AX ;獲得輸入的日數(shù) CMPMONTH,1 ;月份<1,報錯 JCERROR CMPMONTH,13 ;月份>12,報錯 JNCERROR CMPDAY,1 JCERROR CALLGETN ;顯示日歷,調(diào)用GETN子程序返回N的值,N為每月第一天是星期幾 MOVDI,OFFSETBUF1 DECMONTH DECMONTH ADDDI,MONTH ;取出每個月的天數(shù)--->G MOVCL,[DI] MOVG,CL CMPBYTEPTRDAY,CL ;輸入的天如果超過這個月的最大天數(shù),報錯 JAERROR MOVDH,ROW MOVDL,10 CALLGBIAO LEADX,A8 CALLNINE MOVDH,ROW MOVDL,16 CALLGBIAO LEADI,STR1+2MOVCL,8MOVAX,0DATE: MOVBL,[DI] MOVDL,BL MOVAH,2 INT21H INCDI DECCX JNZDATE ADDROW,1 MOVAH,6 MOVAL,0 MOVCH,ROW MOVCL,3 MOVDH,ROW MOVDL,0 MOVBH,10110100B INT10H ;SUNSAT設(shè)置紅色 MOVAH,6 MOVAL,0 MOVCH,ROW MOVCL,30 MOVDH,ROW MOVDL,33 MOVBH,10110100B INT10H MOVDH,ROW MOVDL,0 CALLGBIAO LEADX,WEEK CALLNINE ;顯示SUN*******************SAT INCROW MOVSI,OFFSETBUF3 MOVAL,5 MULN MOVB,AX CMPB,35;如果每個月一號是星期天,顯示一號的行號減2 JCPOS SUBROW,1 POS:MOVDH,ROW ;每個月的一號的光標(biāo)位置 MOVDL,BYTEPTRB CALLGBIAO MOVA7,31 CMPDL,A7 JBEPOS1 ;DL<31,跳轉(zhuǎn)到POS1,否則行加1,列從0開始 ADDROW,1 ;兩行日期間隔 MOVAX,0 MOVB,AX MOVAH,6 ;日歷周末設(shè)置紅色顯示 MOVAL,0 MOVCH,ROW MOVCL,3 MOVDH,ROW MOVDL,0 MOVBH,10110100B INT10H JMPPOSPOS1: CMPDL,30;周六的日歷顯示紅色JCNORED MOVAH,6 MOVAL,0 MOVCH,ROW MOVCL,30 MOVDH,ROW MOVDL,33 MOVBH,10110100B INT10HNORED: MOVDX,SI CALLNINE ;在當(dāng)前光標(biāo)位置顯示數(shù)字 ADDSI,5 ADDB,5 ;兩個日期的顯示距離 DECG JNZPOS JMPEXIT ERROR:DECROW MOVDH,ROW MOVDL,1 CALLGBIAO LEADX,WRONG CALLNINE INCROW JMPREINPUT EXIT: MOVAH,4CH INT21HGBIAOPROCPUSHAXPUSHBXMOVAH,2 ;2號功能調(diào)用MOVBH,0INT10H;定光標(biāo)POPBXPOPAXRETGBIAOENDPNINEPROCPUSHAXMOVAH,9 ;9號功能調(diào)用INT21HPOPAXRETNINEENDPPRPROC ;判斷是平年還是閏年 PUSHAX PUSHBX PUSHCX PUSHDX MOVAX,YEAR MOVCX,AX MOVDX,0 MOVBX,4 DIVBX CMPDX,0 ;DX中為余數(shù) JNZB1 MOVAX,CX MOVBX,100 DIVBX CMPDX,0 JNZB2 MOVAX,CX MOVBX,400 DIVBX CMPDX,0 JZB2B1: CLC ;CF=0 JMPB3B2: STC ;CF=1B3: POPDX POPCX POPBX POPAX RETPRENDPGETNPROC ;獲得這個月的一號是星期幾 PUSHAX PUSHBX PUSHCX PUSHDX MOVBL,100 MOVAX,YEAR DIVBL MOVC2,AL MOVY,AH MOVCL,2 MOVBL,C2 SHR BL,CL ;int(c/4) SHLC2,1 ;2*c SUBBL,C2 ADDBL,Y SHRY,CL ;int(y/4) ADDBL,Y ;int(c/4)-2*c+y+int(y/4) INCMONTH CMPMONTH,3 ;是一月,轉(zhuǎn)移 JCJ1 ;是二月,轉(zhuǎn)移 CMPMONTH,4 JCJ1 XORAH,AH MOVAX,MONTH MOVDX,13 MULDX MOVCX,5 DIVCX XCHGAX,BX CBW XCHGAX,BX ADDBX,AX ;int(c/4)-2*c+y+int(y/4)+int(13*(m+1)/5) MOVAX,BX MOVCL,7 IDIVCL CMPAH,0 JGSKIPADD ADDAH,7SKIPADD: MOVBL,AH MOVN,BL JMPJ3J1:MOVBL,100 MOVAX,YEAR DIVBL MOVC2,AL MOVY,AH CMPY,1 ;如果年份后兩位是00,則前一年是99 JNCJ2 ADDY,100J2:SUBY,1 MOVCL,2 MOVBL,C2 SHR BL,CL SHLC2,1 SUBBL,C2 ADDBL,Y SHRY,CL ADDBL,Y ADDMONTH,12 XORAH,AH MOVAX,MONTH MOVDX,13 MULDX MOVCX,5 DIVCX XCHGAX,BX CBW XCHGAX,BX ADDBX,AX MOVAX,BX MOVCL,7 IDIVCL CMPAH,0 JGSKIPADD1 ADDAH,7SKIPADD1: MOVBL,AH MOVN,BL SUBMONTH,12J3: POPDX POPCX POPBX POPAX RETGETNENDPCODESENDSENDSTART五、測試數(shù)據(jù)及其結(jié)果分析輸入模塊測試:錯誤輸入時見下圖根據(jù)圖所示,當(dāng)輸入的年月日不符合現(xiàn)實的情況時,程序報錯,并提醒重新輸入。正確輸入時,顯示日歷正確輸入時,按照課題的要求將這個月的日歷顯示出來了。六、調(diào)試過程中的問題 在實驗的過程中,在設(shè)置將輸入的年月日用藍(lán)色表示時,將其中的一句代碼MOVCX,4寫成了MOVCL,4后發(fā)現(xiàn)程序運(yùn)行出錯,如下圖:剛開始不知道是什么問題,后來再用編譯軟件,通過一步一步走的時候,觀察寄存器里面的數(shù)據(jù),如果按上面CL存4時,由于在前面用到CX寄存器,它里面的CH有值,執(zhí)行MOVCL,4后,CX的值并不為4,影響了后面的計數(shù)作用。后來將CL改成CX發(fā)現(xiàn),程序沒有報錯,而且正確的顯示了日歷。還有在正確輸入時顯示日歷前有一行將輸入的年月日顯示出來,剛開始將這代碼嵌在判斷日是否滿足要求的前面,導(dǎo)致在月輸入錯誤時不顯示DATE:的情況而日出現(xiàn)錯誤時將DATE:給顯示出來了,發(fā)現(xiàn)這個問題后就將這部分代碼寫到了后面。剛開始設(shè)計算每個月的第一天是星期幾,運(yùn)用蔡勒公式?jīng)]有考慮到1月和2月的情況,導(dǎo)致程序運(yùn)行時其他的月準(zhǔn)確,1月和2月出現(xiàn)錯誤,于是就在代碼里面進(jìn)行判斷,如果輸入的是1月和2月就按上一年的13月和14月進(jìn)行計算,但上一年里面也要考

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論