附录C汇编语言课程设计_第1页
附录C汇编语言课程设计_第2页
附录C汇编语言课程设计_第3页
附录C汇编语言课程设计_第4页
附录C汇编语言课程设计_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、附录C汇编语言课程设计文本阅读器C.1 课程设计的目的本课程设计是80X86汇编语言程序设计课程的后继教学环节,其宗旨是使学生通过对一个较大型的、综合性的应用程序进行阅读、修改、添加功能等工作,对汇编语言程序设计有更进一步的认识,提高编程技巧和阅读理解复杂程序的能力。C.2 课程设计的任务根据所给的“Reader.asm”应用程序框架,在此基础上修改和添加功能。基本任务:Ø 认真阅读“Reader.asm”源程序,理解程序每一条指令在程序中的作用(回答质疑);Ø 用、键在窗口内左右移动文本;Ø 用PgDn,PgUp键上下快速移动文本(每次移半帧);Ø 设

2、计专用键放大、缩小窗口,改变窗口位置。扩展任务:Ø 对文本内的Tab字符(ASCII码09H)进行处理:遇到Tab键,下一个字符显示在下一个表站开始处(每个6个字符一个表站);Ø 设置状态行,显示当前文件名、文本位置(仿垂直滚动条)。其他任务:Ø 使用鼠标对窗口位置进行拖动;Ø 自行设计。C.3 课程设计报告要求与内容(1) 分析原“Reader.asm”程序结构:每个模块说明,较大模块程序流程图;(2) 对你已经实现的功能做详细的说明,并附上流程图及程序清单;(3) 自己对该“文件阅读器”的进一步设想;(4) 对于有设想但最终未实现的功能的大致编程思路

3、的阐述;(5) 论述在设计过程中遇到的并且对你具有启发性的问题。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; 最大行数INDEXDW 1000 DUP(?); 行索引LENCTDW 0; 实际行数CURLINEDW 0; 当前页第一行行数CCOUNTDW ?;

4、文件总字符数TOPDB 5; 窗口左上角行数LEFTDB 5; 窗口左上角列数WSDW 60; 窗口宽度HSDW 15; 窗口高度FGDB 17H; 文字属性FGBDB 1FH; 窗口边框属性MSG1DB 'File:$' 输入文件名提示MSG2DB 'File open error!$' 打开文件出错时提示MSG3DB 'File read error!$' 读文件出错时提示FILENADB 80,?,80 DUP(?); 输入文件名缓冲区; 定义功能键和相应的处理程序; 每个功能定义两个数据:扫描码,处理程序入口地址; 该数据由DOSUB子程

5、序使用KEYSUBDW 48H, SUB1 , 50H, SUB2, 0MYDATENDS; = BUFFERSEGMENT PARADB 65535 DUP(?); 文件缓冲区,文件最大为64KBUFFERENDS; = SSEGSEGMENT STACK STACK; 堆栈段DW100 DUP(?)SSEGENDS; = ; 宏定义 DISPINIT: 设置显示器显示方式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; 创建窗口CALLSH

7、OWCUR; 显示当前页NEXT:KEYIN; 进入主程序: 读键盘CALLCOMMAND; 命令分析与处理JNCNEXT; 非x键继续循环DONE: CALLCLSCREEN; 清屏MOVAX, 4C00HINT21H; 退出; -; 子程序READFILE: 提示并读入文件名,将文件读入缓冲区 READFILE PROCPROMPTMSG1;CALLSIN; 读入文件名MOVAX, 3D00HMOVDX, OFFSET FILENA+2INT21H; 打开文件(读)JCGETERR1; 打开文件出错转GETERR1PUSHDSPUSHESPOPDS; 将DS指向文件缓冲区段MOVBX, A

8、X; BX=文件号MOVAH, 3FH; 读文件MOVCX, 0FFFFH; 读入最多64K-1MOVDX, 0; DS: DX指向文件缓冲区INT21HPOPDSJCGETERR2; 读入文件出错转GETERR2MOVCCOUNT, AX; 实际读入字符数存入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; 计算字符串结尾地址MOVBYTE PTR BX, 0; 在字符串尾部加0RETSINENDP; -; 索引行初始化子程序CLISTPROCMOVCX, CCOUNTJCXZCSTX; 文件为空结束MOVSI,0; 文件缓冲区字符指针MOVDI,0; 索引行指针MOVDX,0; 行数计数MOVINDEXDI, 0INCDX; 假设文件至少有一行CST1:CMPWORD PTR ES:SI, 0A0DH; 判断是否为

10、回车换行符JNZCST2; 不是行结束,转CST2INCDX; 行数加一ADDSI, 2; 跳过回车换行符ADDDI, 2; 索引行指针加一MOVINDEXDI, SI; 指向本行开始地址CMPDX, MAXLENJNCCST4; 是否超过最大行,超过转CST4,结束JMPCST3;CST2:INCSI; 文件缓冲区字符指针指向下一字符CST3:LOOPCST1;CST4:MOVLENCT, DX; 保存行数到LENCT中CSTX:RETCLISTENDP; -;清屏子程序CLSCREENPROCMOVAX, 0600H; 清屏MOVCX, 0MOVDH, 50MOVDL, 79MOVBH,

11、07HINT10HRETCLSCREENENDP; -;显示当前页子程序SHOWCUR PROCMOVDH, 0; 窗口最顶行MOVSI, CURLINE; 取当前页第一行行数MOVCX, HS; 窗口的第一行和最后一行为边框,SUBCX, 2; 所以能够显示内容的高度为窗口高度减二SC1:CALLSHOWLINE; 显示一行INCDH; 窗口下一行INCSI; 文件下一行MOVAX, LENCT;CMPSI, AX; 文件是否显示完JNCSC2; 显示完则转SC2LOOPSC1JMPSC1XSC2:JCXZSC1X; 该页显示满则结束;该页没有显示满,则用空行填满该页SC3:PUSHCXPU

12、SHDXCALLSHOWSPLINE; 显示空行POPDXPOPCXINCDHLOOPSC3SC1X:RETSHOWCURENDP; -;显示一行子程序;输入:SI=显示行行号; DH=窗口中的行号SHOWLINEPROCPUSHCXPUSHSIPUSHDXPUSHAXADDDH, TOP;INCDH; 实际行数=窗口左上角行数+DI+1MOVDL, LEFT;INCDL; 实际列数=窗口左上角列数+1CALLVADD;MOVCX, WS; 窗口的第一列和最后一列是边框,SUBCX, 2; 所以能够显示内容的宽度为窗口宽度减二SHLSI, 1; 行索引为字类型,所以乘二MOVSI, INDEX

13、SI; 取该行第一个字符在文件缓冲区的地址PUSHDSMOVAX, 0B800HMOVDS, AX; DS指向显示缓冲区段地址SL1:MOVAX, ES:SICMPAX, 0A0DHJZSL2; 如果是回车换行,则该行结束MOVDS: DI, AL; 显示一个字符ADDDI, 2;INCSI; 取下一个字符LOOPSL1;JCXZSLX; 该行正好显示完,则结束,否则用空格填满SL2:MOVBYTE PTR DS:DI, ' ' 该行没有显示满,则用空格填满ADDDI, 2LOOPSL2SLX:POPDSPOPAXPOPDXPOPSIPOPCXRETSHOWLINEENDP;

14、-;显示空行子程序;输入:DI=窗口中的行号SHOWSPLINEPROC;MOVAX, HS;SUBAX, 2;CMPDH, AL; 显示的空行是否超出最低行JNCSSLX; 如果是,则转SSLXADDDH, TOP;INCDH; 实际行数=窗口左上角行数+DI+1MOVDL, LEFT;INCDL; 实际列数=窗口左上角列数+1CALLVADD;MOVCX, WS; 窗口的第一列和最后一列是边框,SUBCX, 2; 所以能够显示内容的宽度为窗口宽度减二PUSHDSMOVAX, 0B800HMOVDS, AXSSL1:MOVBYTE PTR DS:DI, ' 'ADDDI, 2

15、LOOPSSL1POPDSSSLX:RETSHOWSPLINEENDP; -;创建窗口子程序CREWINPROCPUSHESMOVAX, 0B800H; 显示缓冲区地址为B800:0MOVES, AX;MOVDH, TOPMOVDL, LEFT; 窗口左上角行列数MOVCX, HS; 窗口高度(行数)CW1:PUSHDX;CALLVADD; 计算地址PUSHCX;MOVCX, WS; 窗口宽度(列数)MOVAL, FG; 取属性CW2:MOVBYTE PTR ES:DI, ' ' 送空白字符INCDI;MOVBYTE PTR ES:DI, AL; 送属性INCDI;LOOPCW

16、2;POPCXPOPDXINCDH; 行数加一LOOPCW1CALLDRAWB; 画边框POPESRETCREWINENDP; -;画边框子程序DRAWBPROCPUSHDXPUSHCXPUSHBXPUSHAXMOVBL, FGB; 取边框属性MOVDH, TOPMOVDL, LEFT; 窗口左上角行列数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;画第二行到倒数二行左右边框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; 左下角行数=右上角行数+窗口高度-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; -; 计算窗口内某行列位置对应显存地址; 输入:DH=行 DL=列; 输出:DI为显存地址VADDPROCMOVAL, 80;MULDH;XORDH, DH;ADDAX, DX; 行数×80+列数SHLAX, 1; 乘2,因为每个字符占两个字节MOVDI, AXRETVADDENDP; -;命令分析子程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论