版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、附錄C匯編語言課程設(shè)計文本閱讀器C.1 課程設(shè)計的目的本課程設(shè)計是80X86匯編語言程序設(shè)計課程的后繼教學(xué)環(huán)節(jié),其宗旨是使學(xué)生通過對一個較大型的、綜合性的應(yīng)用程序進行閱讀、修改、添加功能等工作,對匯編語言程序設(shè)計有更進一步的認(rèn)識,提高編程技巧和閱讀理解復(fù)雜程序的能力。C.2 課程設(shè)計的任務(wù)根據(jù)所給的“Reader.asm”應(yīng)用程序框架,在此基礎(chǔ)上修改和添加功能?;救蝿?wù):Ø 認(rèn)真閱讀“Reader.asm”源程序,理解程序每一條指令在程序中的作用(回答質(zhì)疑);Ø 用、鍵在窗口內(nèi)左右移動文本;Ø 用PgDn,PgUp鍵上下快速移動文本(每次移半幀);Ø 設(shè)
2、計專用鍵放大、縮小窗口,改變窗口位置。擴展任務(wù):Ø 對文本內(nèi)的Tab字符(ASCII碼09H)進行處理:遇到Tab鍵,下一個字符顯示在下一個表站開始處(每個6個字符一個表站);Ø 設(shè)置狀態(tài)行,顯示當(dāng)前文件名、文本位置(仿垂直滾動條)。其他任務(wù):Ø 使用鼠標(biāo)對窗口位置進行拖動;Ø 自行設(shè)計。C.3 課程設(shè)計報告要求與內(nèi)容(1) 分析原“Reader.asm”程序結(jié)構(gòu):每個模塊說明,較大模塊程序流程圖;(2) 對你已經(jīng)實現(xiàn)的功能做詳細(xì)的說明,并附上流程圖及程序清單;(3) 自己對該“文件閱讀器”的進一步設(shè)想;(4) 對于有設(shè)想但最終未實現(xiàn)的功能的大致編程思路
3、的闡述;(5) 論述在設(shè)計過程中遇到的并且對你具有啟發(fā)性的問題。C.4 文本閱讀器匯編語言源程序清單; Title: Assemble Program “Reader.asm”; Read a file from disk, display its contents on screen; Move the content on screen by up/down arrow keys; = MYDATSEGMENTMAXLENDW 1000; 最大行數(shù)INDEXDW 1000 DUP(?); 行索引LENCTDW 0; 實際行數(shù)CURLINEDW 0; 當(dāng)前頁第一行行數(shù)CCOUNTDW ?;
4、文件總字符數(shù)TOPDB 5; 窗口左上角行數(shù)LEFTDB 5; 窗口左上角列數(shù)WSDW 60; 窗口寬度HSDW 15; 窗口高度FGDB 17H; 文字屬性FGBDB 1FH; 窗口邊框?qū)傩訫SG1DB 'File:$' 輸入文件名提示MSG2DB 'File open error!$' 打開文件出錯時提示MSG3DB 'File read error!$' 讀文件出錯時提示FILENADB 80,?,80 DUP(?); 輸入文件名緩沖區(qū); 定義功能鍵和相應(yīng)的處理程序; 每個功能定義兩個數(shù)據(jù):掃描碼,處理程序入口地址; 該數(shù)據(jù)由DOSUB子程
5、序使用KEYSUBDW 48H, SUB1 , 50H, SUB2, 0MYDATENDS; = BUFFERSEGMENT PARADB 65535 DUP(?); 文件緩沖區(qū),文件最大為64KBUFFERENDS; = SSEGSEGMENT STACK STACK; 堆棧段DW100 DUP(?)SSEGENDS; = ; 宏定義 DISPINIT: 設(shè)置顯示器顯示方式DISPINIT MACROMOVAX,0003H; 文本方式 25x80INT10HENDM; -; 宏定義 PROMPT: 顯示字符串PROMPTMACRO OUTMSGLEADX, OUTMSGMOVAH, 09H;
6、INT21H;ENDM ; -; 宏定義KRYIN: 從鍵盤讀入一個字符KEYINMACROMOVAH,0; 讀鍵INT16H; AH中為掃描碼ENDM; = ; 代碼段開始CODESEGMENTASSUME CS: CODE, DS: MYDAT, ES: BUFFER, SS: SSEGSTART:MOVAX, MYDAT; 裝載DS,ESMOVDS, AXMOVAX, BUFFERMOVES, AXDISPINIT; 顯示方式初始化CALLREADFILE; 讀入文件JCDONECALLCLIST; 初始化索引行CALLCLSCREEN; 清屏CALLCREWIN; 創(chuàng)建窗口CALLSH
7、OWCUR; 顯示當(dāng)前頁NEXT:KEYIN; 進入主程序: 讀鍵盤CALLCOMMAND; 命令分析與處理JNCNEXT; 非x鍵繼續(xù)循環(huán)DONE: CALLCLSCREEN; 清屏MOVAX, 4C00HINT21H; 退出; -; 子程序READFILE: 提示并讀入文件名,將文件讀入緩沖區(qū) READFILE PROCPROMPTMSG1;CALLSIN; 讀入文件名MOVAX, 3D00HMOVDX, OFFSET FILENA+2INT21H; 打開文件(讀)JCGETERR1; 打開文件出錯轉(zhuǎn)GETERR1PUSHDSPUSHESPOPDS; 將DS指向文件緩沖區(qū)段MOVBX, A
8、X; BX=文件號MOVAH, 3FH; 讀文件MOVCX, 0FFFFH; 讀入最多64K-1MOVDX, 0; DS: DX指向文件緩沖區(qū)INT21HPOPDSJCGETERR2; 讀入文件出錯轉(zhuǎn)GETERR2MOVCCOUNT, AX; 實際讀入字符數(shù)存入CCOUNT中CLCJMPGETFILEXITGETERR1: PROMPT MSG2; 讀入文件出錯處理KEYINSTCJMPGETFILEXIT; GETERR2: PROMPT MSG3; 打開文件出錯處理KEYINSTCGETFILEXIT:RETREADFILE ENDP; -;輸入文件名子程序SINPROCMOVAH, 0A
9、HMOVDX, OFFSET FILENAINT21H; 輸入文件名XORCH, CHMOVCL, FILENA+1; 取文件名長度LEABX, FILENA+2ADDBX, CX; 計算字符串結(jié)尾地址MOVBYTE PTR BX, 0; 在字符串尾部加0RETSINENDP; -; 索引行初始化子程序CLISTPROCMOVCX, CCOUNTJCXZCSTX; 文件為空結(jié)束MOVSI,0; 文件緩沖區(qū)字符指針MOVDI,0; 索引行指針MOVDX,0; 行數(shù)計數(shù)MOVINDEXDI, 0INCDX; 假設(shè)文件至少有一行CST1:CMPWORD PTR ES:SI, 0A0DH; 判斷是否為
10、回車換行符JNZCST2; 不是行結(jié)束,轉(zhuǎn)CST2INCDX; 行數(shù)加一ADDSI, 2; 跳過回車換行符ADDDI, 2; 索引行指針加一MOVINDEXDI, SI; 指向本行開始地址CMPDX, MAXLENJNCCST4; 是否超過最大行,超過轉(zhuǎn)CST4,結(jié)束JMPCST3;CST2:INCSI; 文件緩沖區(qū)字符指針指向下一字符CST3:LOOPCST1;CST4:MOVLENCT, DX; 保存行數(shù)到LENCT中CSTX:RETCLISTENDP; -;清屏子程序CLSCREENPROCMOVAX, 0600H; 清屏MOVCX, 0MOVDH, 50MOVDL, 79MOVBH,
11、07HINT10HRETCLSCREENENDP; -;顯示當(dāng)前頁子程序SHOWCUR PROCMOVDH, 0; 窗口最頂行MOVSI, CURLINE; 取當(dāng)前頁第一行行數(shù)MOVCX, HS; 窗口的第一行和最后一行為邊框,SUBCX, 2; 所以能夠顯示內(nèi)容的高度為窗口高度減二SC1:CALLSHOWLINE; 顯示一行INCDH; 窗口下一行INCSI; 文件下一行MOVAX, LENCT;CMPSI, AX; 文件是否顯示完JNCSC2; 顯示完則轉(zhuǎn)SC2LOOPSC1JMPSC1XSC2:JCXZSC1X; 該頁顯示滿則結(jié)束;該頁沒有顯示滿,則用空行填滿該頁SC3:PUSHCXPU
12、SHDXCALLSHOWSPLINE; 顯示空行POPDXPOPCXINCDHLOOPSC3SC1X:RETSHOWCURENDP; -;顯示一行子程序;輸入:SI=顯示行行號; DH=窗口中的行號SHOWLINEPROCPUSHCXPUSHSIPUSHDXPUSHAXADDDH, TOP;INCDH; 實際行數(shù)=窗口左上角行數(shù)+DI+1MOVDL, LEFT;INCDL; 實際列數(shù)=窗口左上角列數(shù)+1CALLVADD;MOVCX, WS; 窗口的第一列和最后一列是邊框,SUBCX, 2; 所以能夠顯示內(nèi)容的寬度為窗口寬度減二SHLSI, 1; 行索引為字類型,所以乘二MOVSI, INDEX
13、SI; 取該行第一個字符在文件緩沖區(qū)的地址PUSHDSMOVAX, 0B800HMOVDS, AX; DS指向顯示緩沖區(qū)段地址SL1:MOVAX, ES:SICMPAX, 0A0DHJZSL2; 如果是回車換行,則該行結(jié)束MOVDS: DI, AL; 顯示一個字符ADDDI, 2;INCSI; 取下一個字符LOOPSL1;JCXZSLX; 該行正好顯示完,則結(jié)束,否則用空格填滿SL2:MOVBYTE PTR DS:DI, ' ' 該行沒有顯示滿,則用空格填滿ADDDI, 2LOOPSL2SLX:POPDSPOPAXPOPDXPOPSIPOPCXRETSHOWLINEENDP;
14、-;顯示空行子程序;輸入:DI=窗口中的行號SHOWSPLINEPROC;MOVAX, HS;SUBAX, 2;CMPDH, AL; 顯示的空行是否超出最低行JNCSSLX; 如果是,則轉(zhuǎn)SSLXADDDH, TOP;INCDH; 實際行數(shù)=窗口左上角行數(shù)+DI+1MOVDL, LEFT;INCDL; 實際列數(shù)=窗口左上角列數(shù)+1CALLVADD;MOVCX, WS; 窗口的第一列和最后一列是邊框,SUBCX, 2; 所以能夠顯示內(nèi)容的寬度為窗口寬度減二PUSHDSMOVAX, 0B800HMOVDS, AXSSL1:MOVBYTE PTR DS:DI, ' 'ADDDI, 2
15、LOOPSSL1POPDSSSLX:RETSHOWSPLINEENDP; -;創(chuàng)建窗口子程序CREWINPROCPUSHESMOVAX, 0B800H; 顯示緩沖區(qū)地址為B800:0MOVES, AX;MOVDH, TOPMOVDL, LEFT; 窗口左上角行列數(shù)MOVCX, HS; 窗口高度(行數(shù))CW1:PUSHDX;CALLVADD; 計算地址PUSHCX;MOVCX, WS; 窗口寬度(列數(shù))MOVAL, FG; 取屬性CW2:MOVBYTE PTR ES:DI, ' ' 送空白字符INCDI;MOVBYTE PTR ES:DI, AL; 送屬性INCDI;LOOPCW
16、2;POPCXPOPDXINCDH; 行數(shù)加一LOOPCW1CALLDRAWB; 畫邊框POPESRETCREWINENDP; -;畫邊框子程序DRAWBPROCPUSHDXPUSHCXPUSHBXPUSHAXMOVBL, FGB; 取邊框?qū)傩訫OVDH, TOPMOVDL, LEFT; 窗口左上角行列數(shù)CALLVADD; 計算地址;畫左上角角框MOVBYTE PTR ES:DI, 0C9H; 角框INCDIMOVBYTE PTR ES:DI, BLINCDI;畫第一行邊框MOVCX, WSSUBCX,2; 因為去掉了左右角框,所以寬度減二DB1:MOVBYTE PTR ES:DI, 0CDH
17、; 上下邊框INCDIMOVBYTE PTR ES:DI, BLINCDILOOPDB1;畫右上角角框MOVBYTE PTR ES:DI, 0BBH; 角框INCDIMOVBYTE PTR ES:DI, BL;畫第二行到倒數(shù)二行左右邊框MOVDH, TOPMOVDL, LEFTINCDH; 從第二行開始MOVCX, HS; 第一行和最后一行沒有左右邊框,SUBCX, 2; 所以高度減二DB2:PUSHDX;CALLVADD; 計算左邊框地址MOVBYTE PTR ES:DI, 0BAH; 左右邊框INCDIMOVBYTE PTR ES:DI, BLDECDIMOVAX, WS;DECAX;SH
18、LAX, 1;ADDDI, AX; 計算右邊框地址MOVBYTE PTR ES:DI, 0BAH;INCDIMOVBYTE PTR ES:DI, BLPOPDXINCDH;下一行LOOPDB2; 畫左下角角框MOVDH, TOP;MOVDL, LEFT;MOVAX, HS;DECAX;ADDDH, AL; 左下角行數(shù)=右上角行數(shù)+窗口高度-1CALLVADDMOVBYTE PTR ES:DI, 0C8H; 角框INCDIMOVBYTE PTR ES:DI, BLINCDI; 畫最低行邊框MOVCX, WS;SUBCX, 2; 因為去掉了左右角框,所以寬度減二DB3:MOVBYTE PTR ES
19、:DI, 0CDH; 上下邊框INCDIMOVBYTE PTR ES:DI, BLINCDILOOPDB3; 畫右下角角框MOVBYTE PTR ES:DI, 0BCH; 角框INCDIMOVBYTE PTR ES:DI, BLPOPAXPOPBXPOPCXPOPDXRETDRAWBENDP; -; 計算窗口內(nèi)某行列位置對應(yīng)顯存地址; 輸入:DH=行 DL=列; 輸出:DI為顯存地址VADDPROCMOVAL, 80;MULDH;XORDH, DH;ADDAX, DX; 行數(shù)×80+列數(shù)SHLAX, 1; 乘2,因為每個字符占兩個字節(jié)MOVDI, AXRETVADDENDP; -;命令分析子程
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 模具保養(yǎng)與加工協(xié)議模板
- 家庭裝飾工程保修合同
- 國際勞動合同樣本
- 施工單位工程保證金協(xié)議書
- 住宅小區(qū)物業(yè)管理合同
- 寫字樓下停車場租賃協(xié)議
- 房屋租賃合同書2024年2
- 2024年合資企業(yè)合作協(xié)議書
- 老年人租房免責(zé)協(xié)議書
- 店鋪合作經(jīng)營協(xié)議書范本
- 珍愛生命主題班會
- 陳皮倉儲合同模板例子
- 2024年安全生產(chǎn)月全國安全生產(chǎn)知識競賽題庫及答案(共六套)
- 2024-2025學(xué)年滬教版小學(xué)四年級上學(xué)期期中英語試卷及解答參考
- DB23T 3844-2024煤礦地區(qū)地震(礦震)監(jiān)測臺網(wǎng)技術(shù)要求
- 《阿凡達》電影賞析
- DB42-T 2286-2024 地鐵冷卻塔衛(wèi)生管理規(guī)范
- 合作伙伴合同協(xié)議書范文5份
- 小學(xué)生主題班會《追夢奧運+做大家少年》(課件)
- 公安機關(guān)人民警察高級執(zhí)法資格考題及解析
- 浙教版信息科技四年級上冊全冊教學(xué)設(shè)計
評論
0/150
提交評論