版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、附錄C匯編語(yǔ)言課程設(shè)計(jì)文本閱讀器C.1 課程設(shè)計(jì)的目的本課程設(shè)計(jì)是80X86匯編語(yǔ)言程序設(shè)計(jì)課程的后繼教學(xué)環(huán)節(jié),其宗旨是使學(xué)生通過(guò)對(duì)一個(gè)較大型的、綜合性的應(yīng)用程序進(jìn)行閱讀、修改、添加功能等工作,對(duì)匯編語(yǔ)言程序設(shè)計(jì)有更進(jìn)一步的認(rèn)識(shí),提高編程技巧和閱讀理解復(fù)雜程序的能力。C.2 課程設(shè)計(jì)的任務(wù)根據(jù)所給的“Reader.asm”應(yīng)用程序框架,在此基礎(chǔ)上修改和添加功能?;救蝿?wù):Ø 認(rèn)真閱讀“Reader.asm”源程序,理解程序每一條指令在程序中的作用(回答質(zhì)疑);Ø 用、鍵在窗口內(nèi)左右移動(dòng)文本;Ø 用PgDn,PgUp鍵上下快速移動(dòng)文本(每次移半幀);Ø 設(shè)
2、計(jì)專用鍵放大、縮小窗口,改變窗口位置。擴(kuò)展任務(wù):Ø 對(duì)文本內(nèi)的Tab字符(ASCII碼09H)進(jìn)行處理:遇到Tab鍵,下一個(gè)字符顯示在下一個(gè)表站開(kāi)始處(每個(gè)6個(gè)字符一個(gè)表站);Ø 設(shè)置狀態(tài)行,顯示當(dāng)前文件名、文本位置(仿垂直滾動(dòng)條)。其他任務(wù):Ø 使用鼠標(biāo)對(duì)窗口位置進(jìn)行拖動(dòng);Ø 自行設(shè)計(jì)。C.3 課程設(shè)計(jì)報(bào)告要求與內(nèi)容(1) 分析原“Reader.asm”程序結(jié)構(gòu):每個(gè)模塊說(shuō)明,較大模塊程序流程圖;(2) 對(duì)你已經(jīng)實(shí)現(xiàn)的功能做詳細(xì)的說(shuō)明,并附上流程圖及程序清單;(3) 自己對(duì)該“文件閱讀器”的進(jìn)一步設(shè)想;(4) 對(duì)于有設(shè)想但最終未實(shí)現(xiàn)的功能的大致編程思路
3、的闡述;(5) 論述在設(shè)計(jì)過(guò)程中遇到的并且對(duì)你具有啟發(fā)性的問(wèn)題。C.4 文本閱讀器匯編語(yǔ)言源程序清單; 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í)際行數(shù)CURLINEDW 0; 當(dāng)前頁(yè)第一行行數(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!$' 打開(kāi)文件出錯(cuò)時(shí)提示MSG3DB 'File read error!$' 讀文件出錯(cuò)時(shí)提示FILENADB 80,?,80 DUP(?); 輸入文件名緩沖區(qū); 定義功能鍵和相應(yīng)的處理程序; 每個(gè)功能定義兩個(gè)數(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: 從鍵盤讀入一個(gè)字符KEYINMACROMOVAH,0; 讀鍵INT16H; AH中為掃描碼ENDM; = ; 代碼段開(kāi)始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)前頁(yè)NEXT:KEYIN; 進(jìn)入主程序: 讀鍵盤CALLCOMMAND; 命令分析與處理JNCNEXT; 非x鍵繼續(xù)循環(huán)DONE: CALLCLSCREEN; 清屏MOVAX, 4C00HINT21H; 退出; -; 子程序READFILE: 提示并讀入文件名,將文件讀入緩沖區(qū) READFILE PROCPROMPTMSG1;CALLSIN; 讀入文件名MOVAX, 3D00HMOVDX, OFFSET FILENA+2INT21H; 打開(kāi)文件(讀)JCGETERR1; 打開(kāi)文件出錯(cuò)轉(zhuǎn)GETERR1PUSHDSPUSHESPOPDS; 將DS指向文件緩沖區(qū)段MOVBX, A
8、X; BX=文件號(hào)MOVAH, 3FH; 讀文件MOVCX, 0FFFFH; 讀入最多64K-1MOVDX, 0; DS: DX指向文件緩沖區(qū)INT21HPOPDSJCGETERR2; 讀入文件出錯(cuò)轉(zhuǎn)GETERR2MOVCCOUNT, AX; 實(shí)際讀入字符數(shù)存入CCOUNT中CLCJMPGETFILEXITGETERR1: PROMPT MSG2; 讀入文件出錯(cuò)處理KEYINSTCJMPGETFILEXIT; GETERR2: PROMPT MSG3; 打開(kāi)文件出錯(cuò)處理KEYINSTCGETFILEXIT:RETREADFILE ENDP; -;輸入文件名子程序SINPROCMOVAH, 0A
9、HMOVDX, OFFSET FILENAINT21H; 輸入文件名XORCH, CHMOVCL, FILENA+1; 取文件名長(zhǎng)度LEABX, FILENA+2ADDBX, CX; 計(jì)算字符串結(jié)尾地址MOVBYTE PTR BX, 0; 在字符串尾部加0RETSINENDP; -; 索引行初始化子程序CLISTPROCMOVCX, CCOUNTJCXZCSTX; 文件為空結(jié)束MOVSI,0; 文件緩沖區(qū)字符指針MOVDI,0; 索引行指針MOVDX,0; 行數(shù)計(jì)數(shù)MOVINDEXDI, 0INCDX; 假設(shè)文件至少有一行CST1:CMPWORD PTR ES:SI, 0A0DH; 判斷是否為
10、回車換行符JNZCST2; 不是行結(jié)束,轉(zhuǎn)CST2INCDX; 行數(shù)加一ADDSI, 2; 跳過(guò)回車換行符ADDDI, 2; 索引行指針加一MOVINDEXDI, SI; 指向本行開(kāi)始地址CMPDX, MAXLENJNCCST4; 是否超過(guò)最大行,超過(guò)轉(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)前頁(yè)子程序SHOWCUR PROCMOVDH, 0; 窗口最頂行MOVSI, CURLINE; 取當(dāng)前頁(yè)第一行行數(shù)MOVCX, HS; 窗口的第一行和最后一行為邊框,SUBCX, 2; 所以能夠顯示內(nèi)容的高度為窗口高度減二SC1:CALLSHOWLINE; 顯示一行INCDH; 窗口下一行INCSI; 文件下一行MOVAX, LENCT;CMPSI, AX; 文件是否顯示完JNCSC2; 顯示完則轉(zhuǎn)SC2LOOPSC1JMPSC1XSC2:JCXZSC1X; 該頁(yè)顯示滿則結(jié)束;該頁(yè)沒(méi)有顯示滿,則用空行填滿該頁(yè)SC3:PUSHCXPU
12、SHDXCALLSHOWSPLINE; 顯示空行POPDXPOPCXINCDHLOOPSC3SC1X:RETSHOWCURENDP; -;顯示一行子程序;輸入:SI=顯示行行號(hào); DH=窗口中的行號(hào)SHOWLINEPROCPUSHCXPUSHSIPUSHDXPUSHAXADDDH, TOP;INCDH; 實(shí)際行數(shù)=窗口左上角行數(shù)+DI+1MOVDL, LEFT;INCDL; 實(shí)際列數(shù)=窗口左上角列數(shù)+1CALLVADD;MOVCX, WS; 窗口的第一列和最后一列是邊框,SUBCX, 2; 所以能夠顯示內(nèi)容的寬度為窗口寬度減二SHLSI, 1; 行索引為字類型,所以乘二MOVSI, INDEX
13、SI; 取該行第一個(gè)字符在文件緩沖區(qū)的地址PUSHDSMOVAX, 0B800HMOVDS, AX; DS指向顯示緩沖區(qū)段地址SL1:MOVAX, ES:SICMPAX, 0A0DHJZSL2; 如果是回車換行,則該行結(jié)束MOVDS: DI, AL; 顯示一個(gè)字符ADDDI, 2;INCSI; 取下一個(gè)字符LOOPSL1;JCXZSLX; 該行正好顯示完,則結(jié)束,否則用空格填滿SL2:MOVBYTE PTR DS:DI, ' ' 該行沒(méi)有顯示滿,則用空格填滿ADDDI, 2LOOPSL2SLX:POPDSPOPAXPOPDXPOPSIPOPCXRETSHOWLINEENDP;
14、-;顯示空行子程序;輸入:DI=窗口中的行號(hào)SHOWSPLINEPROC;MOVAX, HS;SUBAX, 2;CMPDH, AL; 顯示的空行是否超出最低行JNCSSLX; 如果是,則轉(zhuǎn)SSLXADDDH, TOP;INCDH; 實(shí)際行數(shù)=窗口左上角行數(shù)+DI+1MOVDL, LEFT;INCDL; 實(shí)際列數(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; 計(jì)算地址PUSHCX;MOVCX, WS; 窗口寬度(列數(shù))MOVAL, FG; 取屬性CW2:MOVBYTE PTR ES:DI, ' ' 送空白字符INCDI;MOVBYTE PTR ES:DI, AL; 送屬性INCDI;LOOPCW
16、2;POPCXPOPDXINCDH; 行數(shù)加一LOOPCW1CALLDRAWB; 畫(huà)邊框POPESRETCREWINENDP; -;畫(huà)邊框子程序DRAWBPROCPUSHDXPUSHCXPUSHBXPUSHAXMOVBL, FGB; 取邊框?qū)傩訫OVDH, TOPMOVDL, LEFT; 窗口左上角行列數(shù)CALLVADD; 計(jì)算地址;畫(huà)左上角角框MOVBYTE PTR ES:DI, 0C9H; 角框INCDIMOVBYTE PTR ES:DI, BLINCDI;畫(huà)第一行邊框MOVCX, WSSUBCX,2; 因?yàn)槿サ袅俗笥医强?,所以寬度減二DB1:MOVBYTE PTR ES:DI, 0CDH
17、; 上下邊框INCDIMOVBYTE PTR ES:DI, BLINCDILOOPDB1;畫(huà)右上角角框MOVBYTE PTR ES:DI, 0BBH; 角框INCDIMOVBYTE PTR ES:DI, BL;畫(huà)第二行到倒數(shù)二行左右邊框MOVDH, TOPMOVDL, LEFTINCDH; 從第二行開(kāi)始MOVCX, HS; 第一行和最后一行沒(méi)有左右邊框,SUBCX, 2; 所以高度減二DB2:PUSHDX;CALLVADD; 計(jì)算左邊框地址MOVBYTE PTR ES:DI, 0BAH; 左右邊框INCDIMOVBYTE PTR ES:DI, BLDECDIMOVAX, WS;DECAX;SH
18、LAX, 1;ADDDI, AX; 計(jì)算右邊框地址MOVBYTE PTR ES:DI, 0BAH;INCDIMOVBYTE PTR ES:DI, BLPOPDXINCDH;下一行LOOPDB2; 畫(huà)左下角角框MOVDH, TOP;MOVDL, LEFT;MOVAX, HS;DECAX;ADDDH, AL; 左下角行數(shù)=右上角行數(shù)+窗口高度-1CALLVADDMOVBYTE PTR ES:DI, 0C8H; 角框INCDIMOVBYTE PTR ES:DI, BLINCDI; 畫(huà)最低行邊框MOVCX, WS;SUBCX, 2; 因?yàn)槿サ袅俗笥医强?,所以寬度減二DB3:MOVBYTE PTR ES
19、:DI, 0CDH; 上下邊框INCDIMOVBYTE PTR ES:DI, BLINCDILOOPDB3; 畫(huà)右下角角框MOVBYTE PTR ES:DI, 0BCH; 角框INCDIMOVBYTE PTR ES:DI, BLPOPAXPOPBXPOPCXPOPDXRETDRAWBENDP; -; 計(jì)算窗口內(nèi)某行列位置對(duì)應(yīng)顯存地址; 輸入:DH=行 DL=列; 輸出:DI為顯存地址VADDPROCMOVAL, 80;MULDH;XORDH, DH;ADDAX, DX; 行數(shù)×80+列數(shù)SHLAX, 1; 乘2,因?yàn)槊總€(gè)字符占兩個(gè)字節(jié)MOVDI, AXRETVADDENDP; -;命令分析子程
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度門衛(wèi)人員服裝及裝備供應(yīng)合同4篇
- 陶藝課程設(shè)計(jì)思路
- 音樂(lè)與影視同步課程設(shè)計(jì)
- 二零二五版辦公大樓智能化會(huì)議系統(tǒng)建設(shè)與維護(hù)協(xié)議2篇
- 2024年心理咨詢師之心理咨詢師基礎(chǔ)知識(shí)題庫(kù)帶答案(輕巧奪冠)
- 2025年度個(gè)人增強(qiáng)現(xiàn)實(shí)技術(shù)入股協(xié)議3篇
- 造價(jià)課程設(shè)計(jì)江蘇版
- 年度玻璃用助劑市場(chǎng)分析及競(jìng)爭(zhēng)策略分析報(bào)告
- 年度自動(dòng)造型線產(chǎn)業(yè)分析報(bào)告
- 專項(xiàng)施工方案的審核人
- 2024-2030年中國(guó)海泡石產(chǎn)業(yè)運(yùn)行形勢(shì)及投資規(guī)模研究報(bào)告
- 動(dòng)物醫(yī)學(xué)類專業(yè)生涯發(fā)展展示
- 2024年同等學(xué)力申碩英語(yǔ)考試真題
- 消除“艾梅乙”醫(yī)療歧視-從我做起
- 非遺文化走進(jìn)數(shù)字展廳+大數(shù)據(jù)與互聯(lián)網(wǎng)系創(chuàng)業(yè)計(jì)劃書(shū)
- 科普知識(shí)進(jìn)社區(qū)活動(dòng)總結(jié)與反思
- 現(xiàn)金日記賬模板(帶公式)
- 消化內(nèi)科??票O(jiān)測(cè)指標(biāo)匯總分析
- 混凝土結(jié)構(gòu)工程施工質(zhì)量驗(yàn)收規(guī)范
- 肝性腦病患者的護(hù)理措施課件
- 三字經(jīng)全文帶拼音完整版可打印
評(píng)論
0/150
提交評(píng)論