微机原理课设简易文本编辑器Word格式.docx
《微机原理课设简易文本编辑器Word格式.docx》由会员分享,可在线阅读,更多相关《微机原理课设简易文本编辑器Word格式.docx(41页珍藏版)》请在冰豆网上搜索。
3.设计要求
利用DOS系统功能调用和BIOS功能调用设计一个有菜单栏的编辑口。
可以利用“Del”键、“Backspace”键、“Home”键、“Eed”键、“↑”、
“↓”、“←”、“→”方向移动键实现对输入文本的全屏幕编辑。
使用彩色组和背景颜色设计界面颜色,利用DOS系统功能调用的磁盘文件存取技术实现文件的“信件”、“打开”、“保存”、“另存为”与“退出”功能。
4.设计思路
DOS提供了一组完成磁盘文件的建立、打开、关闭和读写等操作的功能调用。
利用DOS和BIOS功能调用,汇编语言可实现对磁盘文件的存取。
对磁盘文件的管理有文件代号方式下的管理和文件控制块方式下的管理两种方式。
利用BIOS系统功能调用中的10H中断类型,可以设置显示模式,设置窗口背景、字符颜色等。
利用DOS系统功能中的09号功能,可以实现显示菜单信息字符串。
调用BIOS中的键盘I/O中断调用(16H中断)中的0号功能,可以从键盘读取字符,通过对“↑”、“↓”、“←”、“→”方向移动键以及“Del”、“Ins”、“Backspace”键、“Eed”键、“Home”键的扫描码的判断,结合10H中断的02号、03号功能确定光标的相应移动,从而实现对输入文本的全屏幕编辑。
利用DOS系统功能调用中的文件管理功能,如建如建立文件(16H)、打开文件(0FH)、读文件(3FH)、写文件(40H)等,可以实现对文件的操作。
由于本案例功能复杂,因此在程序设计中综合运用了宏、子程序等多想手段,以便使程序简洁、易读持续的运行效率。
(1)宏的分析
由以上分析可知,本程序中要定义5个宏,分别是:
RED_CHR读取键盘输入。
这个宏采用了BIOS中断16的0号功能,读取输入的扫描码。
要注意的是,在实现键盘输入时没有使用DOS中断的1号功能来读取ASCII值。
因为本案例的全屏幕编辑中采用了很多功能和编辑键,如“↑”、“↓”、“←”、“→”方向移动键以及“HOME”、“End”、“BackSpace”、“Del”等编辑功能键,以及“F1”等功能键在ASCII码中并没有相应的表示,因此,必须使用键盘扫描表来表示。
·
STRING这个宏比较简单,用了显示指定地址的字符串。
WIN建立一个窗口。
这个宏是一个用了简化程序的典型列子。
这个宏的定义如下:
WINMACROOPR1,OPR2,OPR3,0PR4,OPR5,OPR6;
建立窗口
MOVAH,06H
MOVAL,OPR1
MOVBH,OPR2
MOVCH,OPR3
MOVCL,OPR4
MOVDH,OPR5
MOVDL,OPR6
INT1OH
ENDM
可以看到,本宏有6个参数,采用了BIOS中断10H的6号功能,用了使幕初始化,创建一个窗口。
如果不采用宏,那么每次要输入8条指令,而定义成宏后,只要用一条带6个参数的宏指令就可以了。
其中宏参数OPR1表示上卷行数,OPR2表示卷入行属性,OPR3表示窗口右下角列行数值,OPR4表示窗口左上角列行数值,OPR5表示窗口右下角列行数值,OPR6表示窗口右下角列数值。
POS_CURSE用了在指定位置显示光标。
在全屏幕编辑中,光标用来指明当前输入的位置。
这个宏是一个常用的指令,各种编辑功能键的操作都会对光标的位置有所影响,因而都会用到这个宏。
POS_GET获取当前光标所在的位置,通常和上一个宏配合使用。
(2)子程序分析
本例程序中采用了众多的子程序。
在子程序中,有的还有多层的嵌套,因此读懂这些子程序时了解这个设计的关键。
若一个子程序多次调用相同的下级子程序,只用一个表示主程序结构比较简单,主要由编辑处理子程序EDIT和创建窗口子程序WIND构成。
以下列出了本设计中的重要的子程序供学习分析。
EDIT:
编辑处理子程序。
WIND:
创建窗口子程序。
COM:
输入处理子程序。
FUC_KEY:
功能键处理子程序。
HELP:
帮助子程序。
MENU_SHOW:
显示菜单子程序。
NEW:
新建文件子程序。
SAVEAS:
另存文件子程序。
OPEN:
打开文件子程序。
SAVE:
保存文件子程序。
SAVEDISPLAY:
保存显示界面子程序。
BACKDISPLAY:
恢复显示界面子程序。
QUIT:
退出子程序。
WIN3:
显示日期子程序。
WIN4:
显示行列子程序。
分析时要注意这些子程序间的调用。
(1)EDIT子程序
子程序EDIT是非常重要的一个主要的子程序,它的作用是完成编辑器所有复杂的编辑操作。
其中包括上、下、左、右、回等编辑键的处理,以及没有对应ASCII码的功能键的处理,如Home、End、Del、BackSpace键等,由于这几个键处理方法与前面几个键的处理方法不同,因此将它们的处理方法集中在子程序FUC_KEY中。
(2)COM子程序
COM子程序是在EDIT子程序中被调用的一个下级子程序,它是本案例中一个十分重要的子程序,负责对键盘输入进行处理。
键盘输入的内容可以分为两类,一类是可在屏幕上显示的ASCII字母、数字和符号,另类是全屏幕编辑器键。
处理较复杂的是全屏幕编辑键,包括“↑”、“↓”、“←”、“→”方向移动键,回车键,“Home”、“End”、“BackSpace”“Del”等编辑功能键,以及“F1”等功能键等。
可显示字符的处理方式都是相同的,但全屏幕,编辑键由于功能不同,每一个键都有自己的程序段。
因此,首先要准确定义每一个功能键的处理方法。
“↑”的功能是将光标向上移一行。
其处理的方法比较简单,只要保持列号不变,将行号减1即可。
但要注意判断光标是否到达最上一行,如果光标已经到达最上一行则不再减1,而是保持不变。
“↓”的功能是将光标向下移一行。
处理的方法同上,只要保持列号不变,将行加1即可。
但要注意判断光标是否到达最后一行,如果光标已经到达最后一行则不再减1,而是保持赋值23(本案列的编辑区高度为23)。
“←”的功能是将光标向前移一个字符。
但要注意编辑中的特殊情况,即当光标已处于本行第一列时,要将行号减1,并将光标移到上行的最后一个字符。
同时还要判断是否是整个文本的第一个字符,如果是的话,则“←”键不改变光标的位置。
“→”的功能是将光标向后移一个字符。
但要注意编辑中的特殊情况,即当光标已处于本行最后一列时,要将行号加1,并将光标移到上行的第一个字符。
同时还要判断是否是整个文本的最后一个字符,如果是的话,则“→”键不改变光标的位置。
回车键的功能是使光标换行。
处理的方法是将光标的行号加1,列号置为0。
除了上面五个键外,程序将其他的功能键处理放在FUC_KEY子程序中。
程序流程图
(3)FUC_KEY子程序
FUC_KEY包括了对“Home”、“End”、“BackSpace”、“Del”等编辑功能键盘的处理。
“Home”键在全屏幕编辑中的功能是把光标移到本行的第一个字符处,因此它的处理很简单,保持其他值不变,将列号改为0,并同时改变状态栏中的坐标显示值即可。
“End”键在全屏幕编辑中的功能是把光标移到本行的最后一个字符处,它的处理也很简单,保持其他值不变,将列号改为9,并同时改变状态栏中的坐标显示值即可。
“BackSpace”键将光标左移并删除一个字符。
“Del”键删除一个字符。
“F10”键的作用是调出帮助说明。
(4)HELP子程序
HELP子程序用来显示帮助信息。
它的实现并不复杂,就是在屏幕的指定位置显示帮助内容的字符串。
在实现时,首先获取光标的位置,以便帮助结束时能返回原光标处。
然后使用前面定义的字符串宏椒帮助信息。
当再按F10时,返回编辑状态。
当显示帮助信息时,屏幕的显示内容被破坏。
因此,在显示帮助信息时,要首先保存当前屏幕显示的内容。
帮助结束返回时,再恢复原编辑状态时显示的内容。
(5)SAVEDISPLAY子程序
SAVEDISPLAY子程序用来保存屏幕上显示胡内容。
计算机屏幕上显示的内容是保存在显示缓冲存储器中的。
按照DOS的内存分配方法,显存是和系统内存统一编排地址的。
以黑白方式显示时,可的地址范围是B0000H~B0FFFFH,共4K字节。
以彩色方式显示时,地址范围是B80000H~B3FFFH,共16字节。
占用两个字节。
一个字节用于存放ASCII值,另一个字节用来存放该字符的属性,如颜色、背景、闪烁等。
屏幕上显示的内容和显示缓冲存储器的内容一一对应。
本例采用的保存屏幕显示的内容的方法是将显示缓冲存储器中的内容保存到内存中去。
恢复屏幕显示时将保存的内容恢复到显示缓冲储存器中,就实现了屏幕内容的恢复。
这个子程序中的主要程序段如下:
MOVBX,0D;
偏移地址
MOVCX,3840D;
循环次数
LOOP1:
MOVAX,0B800H;
显示段首址
MOVDS,AX
MOVDL,DS:
[BX]
MOVAX,DATA
MOVBAK[BX],DL;
将显存内容送到内存中
INCBX;
移到下一个单元
LOOPLOOP1
(6)BACKDISPLAY子程序
BACKDISPLAY子程序用来将保存在内存中的显示缓冲区中,从编程的角度看,BACKDISPLAY是SAVEDISPLAY子程序的逆过程。
可以将下面的BACKDISPLAY程序段与SAVEDISPLAY子程序作比较;
LOOP11:
MOVDL,BAK[BX]
MOVDS:
[BX],DL;
将内存内容送到显存中
移到下一个存储单元
LOOPLOOP11
(7)MENU_SHOW子程序
MENU_SHOW子程序的作用是显示菜单。
在本例中,实现的是文件菜单。
其中包括新建文件(New)、打开文件(Open)、保存文件(Save)、另存为(Saveas)、和退出(Exit)菜单项。
首先判断用户是否按下调用菜单F1键,如果是则先显示菜单。
由于显示菜单会破坏屏幕显示的内容,所以在显示菜单前要调用SAVEDIDPLAY子程序保存当前屏幕内容。
然后先显示菜单显示区域的背景色。
再调用显示字符串宏STARING显示菜单选项。
为了使界面美观,菜单显示区域还使用了背景阴影。
实现的方法是首先显示一个黑色的阴影窗口区域。
坐标是(2,1)~(7,11),然后再向上、向左各偏移一个位置,即从(1,0)~(6,10)再显示一个黄色窗口区域,二者迭加的结果就是显示一个带阴影的菜单。
这个结果用下面两个宏命令实现:
WIN0,06H,2,1,7,11
WIN0,65H,,1,0,6,10
下面的任务是确定具体选择了哪个菜单项。
出现菜单时,有响应的键分别是“↓”、“→”、“↑”回车键和“F1”。
出现菜单时,如果应用“↓”,则第一个选项出现深色背景,表示移到第一个选项NEW,如果是其他字符,则直接隐藏菜单,回复编辑状态的界面,重新等待新的输入。
如果应用“↑”,由于当前是第一个选项,因此保持不变。
如果应用回车,则进入NEW(新建文件)子程序。
如果应用“↓”则跳到下个选项。
如果这三者都不是,则隐藏菜单。
如果当前是OPEN项,也采用上面的方面的方法来判断。
如果应用“↑”,则保持不变。
如果应用回车,则进入OPEN(新建文件)子程序。
如果应用“↓”则跳到下个选项。
以下各选项都可以采用同样的方法进行操作,直到最后一项EXIT为止。
选中EXIT项时,如选“↓”则菜单循环跳回第一项NEW。
如果在EXIT项时按回车,则首先恢复被菜单破换的显示界面,然后用与菜单显示类似的方法,在屏幕中央显示一个退出兑换框确认是否保存,并将光标置于输入字母处。
如果选择了“y”,则调用保存并退出处理子程序quitt;
如果选择“n”,则不作保存处理,直接退出。
为使程序结构清晰明了,新建、打开、保存、另存为及保存退出等功能都使用子程序。
这一部分的子程序,主要处理有关磁盘的操作。
(8)NEW子程序
NEW子程序用来新建一个文件。
调用NEW后,用与退出编辑相同的方法,再屏幕上显示一个对话框:
Pleaseinputfilename:
(请输入文件名),然后等待输入,将输入的字符依次存入PATH所在的数据段内存单元,直到输入回车为止,这样就产生了文件名。
如果输入了回车,则恢复原来光标所在的位置。
用DOS中断21H的3c号动能建立文件,文件名使用的存储再PATH中的字符串,然后用建立文件时获得的句柄,关闭文件。
由于是新建一个文件,一个必要的操作时擦除原来屏幕上的内容,并将光标置于编辑区域的开始处。
最后进入编辑状态,等待使用者的输入。
(9)OPEN子程序
OPEN子程序里的功能是打开一个已经存在的文件。
首先恢复被菜单破坏的显示界面,用前面介绍的方法在屏幕上显示对话框:
Pleaseinputopenfilename:
(打开的文件名),并将光标置于适当的位置等待输入。
输入的字符串依次存入PATH所在的数据段内存单元,直到输入回车为止,这样既产生了文件名。
接受收到回车键后,首先创建编辑器窗口,使用DOS中断21H的3d号功能打开文件,产生文件句柄。
接着用DOS中断21H的3f号功能读取2000字节的内容放到数据段的缓冲区BUFFER中,再创建编辑区窗口,显示光标。
接下来将缓冲区BUFFER中的内容用DOS中断21H的2号功能显示到屏幕上,即送到显示缓冲存储器中。
内容显示完后关闭文件爱你,重新置光标于编辑区的开始处。
最后,清除PATH中的文件名。
(10)SAVEAS子程序
SAVEAS子程序的功能是在另一个文件中保存当前编辑的内容。
首先恢复编辑界面,还原被文件菜单所破坏的界面。
然后创建对话框,显示光标于适当位置,显示提示信息:
Pleaseinputsavefilename:
(请输入保存文件名)。
等待输入。
用户输入的文件名字符串放在数据段的PATH缓冲区,输入会车时结束。
接着怀复被文件名输入对话框破怀的编辑界面,还原光标原来在编辑文档中所处的位置。
用DOS中断21H的3C号功能建立文件,文件名是存储在PATH中的字符串。
用新建文件时获得的句槟从BUFFER缓冲区写入2000个字节,最后关闭文件。
还原编辑界面,回到编辑状态,等待新的键盘输入。
值得注意的是,本方法保存的并不是标准的文本文件,因为它保存的内容除了输入的字符外,还包含属性字节,这个文件只能用本编辑器打开。
如果想产生标准的文本文件,要在储存文件时将属性字节删除。
(11)SAVE子程序
SAVE子程序的功能是保存当前编辑的内容。
首先保存光标位置,调用BACKDISPLAY子程序怀复被菜单破坏的显示界面。
读入PATH中的第一个字符,如果不是可显示字符,则创建一个对话框,其中显示:
pleaseinputsavefilename:
(请输入保存文件名),并将光标设置于适当位置等待输入。
将输入的字符一次存入PATH所在的守护局端内存单元,知道输入回车为止,这样就产生了文件名。
如果读入的PATH中的第一个字符是可显示字符,说明文件名已存在,则可直接用保存在PATH中的文件名。
方法是先使用DOS中断21H的3D号功能打开文件,产生文件句槟。
接着用DOS中断21H的3F号功能读取2000字节的内容写入句槟指定的文件中。
最后关闭文件,用BACKDISPLAY子程序恢复编辑界面。
(12)QUITT子程序
QUITT子程序的作用是当选择EXIT退出时,选择保存文件。
其处理过程和SAVEAS(另存为)子程序基本相同。
先恢复编辑界面,还原被文件菜单破坏的界面。
然后创建对话框,在适当的位置显示光标,显示提示信息:
(请输入保存文件名),等待输入。
用户输入的文件名字符串放在数据段的PATH缓冲区,输入回车时结束。
接着恢复文件名输入对话框破坏的界面,还原光标在原来位置编辑文档中所处的位置。
用DOS中断21H的3c号功能建立文件,文件名是存储在PATH中的字符串。
用新建问价是获得的句柄从BUFFER缓冲区写入2000个字节,最后关闭文件。
与SAVEAS子程序不同的是,用QUITT子程序关闭文件后,不再返回编辑界面,而是直接用DOS中断21H的4c号功能回到DOS。
(13)WIN3程序
WIN3子程序的功能是在哦编辑器的标题框的右边显示日期。
这个功能是调用DOS中断的2a号功能实现的。
DOS中断的2a号功能从系统中读取日期,并以二进制的形式放在寄存器中,其中DH中是月份,DL是日。
由于月份和日期是可能为两位数,所以本程序采用了一个简单巧妙的方法。
首先将日期送到AL(AX)中,然后除以10,将商和余数个存储AH和AL中,而除10后,商为10位上的数,余数为个位上的数,从而实现了将一个一字节的两位数转化为个位各用一个字节表示的形式。
但是要注意,要在屏幕上显示日期,不能直接用寄存器的值,而要先转换数值对应的ASC11码。
根据ASC11表中数值和字符的关系,二者相差30H,因此只要在每个寄存器中加上30H就可完成转换。
实现的程序如下:
MOVAH,2AH;
获取月和日期值
INT21H
MOVBL,10D
MOV AX,0;
将月份放入AH中
MOVAL,DH;
将月的十位和各位分放在AH和AL中
DIVBL
ADDAX,3030H;
将寄存器中的二进制值转换成对应ASC11码
接着将日期存放在数据段的DATA缓冲区中,最后用DOS的字符串显示功能在标题栏上显示。
(14)WIN4子程序
WIN4子程序的功能是随着字符的输入或编辑键的按下实时显示当前光标所处的坐标。
先用BIOS中断10H的3号功能读取光标位置。
读出的光标坐标的行值在DH中,列值在DL中。
由于他们也是二进制,所以在显示时也要转换成可见的ASC11字符。
用和显示日期的相同方法,利用DOS中断在编译器下方的状态栏右侧显示坐标坐标字符串。
四、程序调试与运行
图1.打开菜单
图2.编辑文本
图3.保存文本
五、使用说明
运行可执行文件TEXTEDIT.EXE,输入文本,利用Del键·
BackSpace键·
Home键·
End键·
上下左右方向移动键对文本进行全屏幕编译。
编译完成后,按F1键激活菜单,下移光标,选择SAVE,输入文件名。
也可以选择File菜单的其他菜单项,它们的功能均可实现。
按F10键激活帮助,按Esc键退出帮助。
六、设计总结
通过本次课程设计,使我们对汇编语言的语法结构和基本语义有了较为清楚的了解;
同时通过我们大家合作共同努力都认真设计和编写代码,我们也将书上每章的知识大致的复习了一遍,加深了我们的印象,通过设计我们深刻认识到一个清晰明朗的流程图对程序的设计是十分重要的。
在设计中,我们在没有先画流程图的情况下就开始编写代码,结果是我们弄得一头雾水,实在是无法进行了,后来经过我们大家商议,我们各自分工,在弄清题意的情况下,画了程序流程图,并按此开始编写代码,结果受益匪浅。
是我们在最短的时间里完成了这次课程设计。
通过这次课设使我们知道了团队的力量是很强大的,我们以后不管在生活中还是在学习生活中都要学会发挥团队的力量
七、参考文献
【1】宋杰.微机原理与接口技术课程设计.机械工业出版社.2005.4
【2】周明德.微型计算机系统原理及应用习题集.清华大学出版社.2005.7
【3】张开成,微型计算机原理.西南师范大学出版社.2006.8
【4】沈美明.IBM-PC汇编语言程序设计第2版,清华大学出版社,2006.5
【5】戴梅萼.微型机原理与技术-习题.实验和综合训练题集.清华大学出版社.2009.4
致谢
感谢张作汉老师的辅导,感谢我和我的同学在这次课程设计中的合作,努力。
希望老师,批评、指正。
程序代码
red_chrmacro;
读取字符宏定义
movah,0
int16h
endm
stringmacrop1;
输入字符光标
movah,9
leadx,p1
int21h
winmacroopr1,opr2,opr3,opr4,opr5,opr6;
movah,06h
moval,opr1
movbh,opr2
movch,opr3
movcl,opr4
movdh,opr5
movdl,opr6
int10h
pos_cursemacroop1,op2,op3;
定义光标位置
movah,2
movbh,op1
movdh,op2
movdl,op3
pos_getmacro;
显示光标位置
movah,03h
movbh,0
datasegment;
定义数据段
menudb'
FileEditHelp$'
mass_1db'
F1ActivefileF10Activehelp'
'
$'
manu_1db'
New'
13,10,'
manu_2db'
Open'
manu_3db'
Save'
manu_4db'
Saveas'
manu_5db'
Exit'
handledw?
message1db'
Pleaseinputfilename:
'