简易文本编辑器的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

简单文本编辑器的设计与实现1. 需求说明
用汇编语言设计一个文本编辑器,可以在出现的界面中输入任意文本内容,利用DEL键、BACKSPACE键、HOME键、END键、上下左右光标键对文本进行全屏幕编辑。

按F1键激活菜单File,下移光标,选择New、Open、Save、Exit子菜单项实现文件的新建、打开、保存和退出功能。

按F10激活帮助,按Esc键退出帮助。

2. 设计说明
2.1简要分析
这个文本编辑器的设计采用了多个模块,有窗口模块、按键模块、光标模块、功能键模块等,而功能键模块中又是调用了按键模块。

为实现文本编辑,通过调用不同的模块达到预期的目的。

2.2概要设计
3. 详细的算法描述
3.1窗口模块
WIN MACRO OPR1,OPR2,OPR3,OPR4,OPR5,OPR6 ;建立窗口 MOV AH,06H
MOV AL,OPR1
MOV BH,OPR2
MOV CH,OPR3
MOV CL,OPR4
MOV DH,OPR5
MOV DL,OPR6
INT 10H
ENDM
3.2光标模块
POS_CURSE MACRO OP1,OP2,OP3 ;置光标位置
MOV AH,02H
MOV BH,OP1
MOV DH,OP2
MOV DL,OP3
INT 10H
ENDM
POS_GET MACRO ;读光标位置
MOV AH,03H
MOV BH,0
INT 10H
ENDM
3.3部分按键模块
HOME: ;Home键的功能
POS_GET
MOV ROW,DH
MOV LINE,0
JMP FIRST
_END: ;End键的功能
POS_GET
MOV ROW,DH
MOV LINE,79
JMP FIRST
BAK_SP: ;退格键的功能
POS_GET
MOV ROW,DH
MOV LINE,DL
CMP LINE,0
JE STOP
DEC LINE
3.4变量定义
DATA SEGMENT ;定义数据段
MENU DB ' File Help $'
MANU_1 DB ' New ',13,10,'$'
MANU_2 DB ' Open ',13,10,'$'
MANU_3 DB ' Save ',13,10,'$'
MANU_5 DB ' Exit ','$'
HANDLE DW ?
MESSAGE1 DB ' Please input new file name:','$'
MESSAGE2 DB ' Please input save file name:','$'
MESSAGE3 DB ' Please input open file name:','$'
MESSAGE4 DB ' Save Or Not? (Y/N): ','$'
PATH DB 50 DUP(0),'$'
BUFFER DB 2000 DUP(?)
BAK DB 3850 DUP(0)
LINE DB ?
ROW DB ?
CHAR DB ?
HELP_MAS5 DB 'Press F1 to active File. $' ;帮助内容
HELP_MAS6 DB 'You can use Downcursor key to choose the fuction. $' HELP_MAS7 DB 'Press F10 to show the help massage.Press Esc To Quit. $'
HANGLIE DB '???//???','$' ;行//列
DATA ENDS
3.5主函数
MAIN PROC FAR ;主程序
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
CALL WIND
CALL EDIT
RET
MAIN ENDP
4. 源程序和执行结果
4.1源程序
RED_CHR MACRO ;从键盘读字符
MOV AH,00H
INT 16H
ENDM
STRING MACRO P1 ;显示字符串
MOV AH,09H
LEA DX,P1
INT 21H
ENDM
WIN MACRO OPR1,OPR2,OPR3,OPR4,OPR5,OPR6 ;建立窗口 MOV AH,06H
MOV AL,OPR1
MOV BH,OPR2
MOV CH,OPR3
MOV CL,OPR4
MOV DH,OPR5
MOV DL,OPR6
INT 10H
ENDM
POS_CURSE MACRO OP1,OP2,OP3 ;置光标位置
MOV AH,02H
MOV BH,OP1
MOV DH,OP2
MOV DL,OP3
INT 10H
ENDM
POS_GET MACRO ;读光标位置
MOV AH,03H
MOV BH,0
INT 10H
ENDM
DATA SEGMENT ;定义数据段
MENU DB ' File Help $'
MANU_1 DB ' New ',13,10,'$'
MANU_2 DB ' Open ',13,10,'$'
MANU_3 DB ' Save ',13,10,'$'
MANU_5 DB ' Exit ','$'
HANDLE DW ?
MESSAGE1 DB ' Please input new file name:','$'
MESSAGE2 DB ' Please input save file name:','$'
MESSAGE3 DB ' Please input open file name:','$'
MESSAGE4 DB ' Save Or Not? (Y/N): ','$'
PATH DB 50 DUP(0),'$'
BUFFER DB 2000 DUP(?)
BAK DB 3850 DUP(0)
LINE DB ?
ROW DB ?
CHAR DB ?
HELP_MAS5 DB 'Press F1 to active File. $' ;帮助内容
HELP_MAS6 DB 'You can use Downcursor key to choose the fuction. $' HELP_MAS7 DB 'Press F10 to show the help massage.Press Esc To Quit. $'
HANGLIE DB '???//???','$' ;行//列
DATA ENDS
CODE SEGMENT
MAIN PROC FAR ;主程序
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
CALL WIND CALL EDIT
RET
MAIN ENDP
WIND PROC NEAR ;创建窗口子程序
WIN 0,3EH,1,0,24,79 ;定义窗口背景
WIN 1,1FH,0,0,0,79
WIN 0,1FH,24,0,24,79
SHOW: ;显示菜单位置及内容
POS_CURSE 0,0,1
MOV AH,09H
LEA DX,MENU
INT 21H
POS_CURSE 0,1,0
MOV ROW,DH
MOV LINE,DL
WIND ENDP
EDIT PROC NEAR
CHAR_GET: ;读字符
CALL COM
COM PROC NEAR ;定义功能鍵
POS_GET
MOV ROW,DH
MOV LINE,DL
FIRST:
POS_CURSE 0,ROW,LINE
J00: MOV AH,0
INT 16H ;从键盘读字符 ah=扫描码 al=字符码 PUSH AX
LEA DX,BUFFER
MOV BUFFER[BX],AL
INC BX
CMP AH,48H ;上
JZ UP_1
CMP AH,50H ;下
JZ DOWN_1
CMP AH,4BH ;左
JZ LEFT
CMP AH,4DH ;右
JZ RIGHT
CMP AH,1CH ;回车
JZ ENTER_1
CALL FUC_KEY
MOV AH,2
MOV DL,AL
INT 21H
POP AX
CALL MENU_SHOW
JMP J6
DOWN_1:
JMP DOWN
ENTER_1:
JMP ENTER_2
UP_1: JMP UP
LEFT: ;光标左移
POS_GET
MOV ROW,DH
MOV DL,LINE
CMP LINE,0
JNZ DIRECT
MOV LINE,79
DEC ROW
CMP ROW,0
JE STOP2
JMP FIRST
STOP2:
MOV ROW,1
JMP FIRST
DIRECT:
DEC LINE
JMP FIRST
RIGHT: ;光标右移 POS_GET
MOV ROW,DH
MOV DL,LINE
CMP LINE,79
JNZ DIRECT2
MOV LINE,0
INC ROW
CMP ROW,24
JE RETURNS1
JMP FIRST
DIRECT2:
INC LINE
JMP FIRST
ENTER_2:
JMP ENTER
UP: ;上移光标
POS_GET
MOV ROW,DH
MOV DL,LINE
DEC ROW
CMP ROW,0
JE STOP1
JMP FIRST
STOP1:
MOV ROW,1
JMP FIRST
DOWN: ;下移光标 POS_GET
MOV ROW,DH
MOV DL,LINE
INC ROW
CMP ROW,24
JE STOP3
JMP FIRST
STOP3:
MOV ROW,23
JMP FIRST
RETURNS1:
JMP RETURNS
ENTER: ;回车换行
POS_GET
MOV ROW,DH
MOV LINE,DL
INC ROW
CMP ROW,24
JE RETURNS
MOV LINE,0
JMP FIRST
RETURNS:
MOV ROW,24
MOV LINE,0
JMP FIRST
J6:
RET
COM ENDP
FUC_KEY PROC NEAR ;功能键子程序 NEXT:
CMP AH,47H ;Home键
JZ HOME
CMP AH,4FH ;End键
JZ _END
CMP AH,0EH ;Backspace键
JZ BAK_SP
CMP AH,53H
JZ DEL
CMP AH,44H ;F10键
JZ HELP_0
RET
HELP_0: CALL HELP
HOME: ;Home键的功能 POS_GET
MOV ROW,DH
MOV LINE,0
JMP FIRST
_END: ;End键的功能
POS_GET
MOV ROW,DH
MOV LINE,79
JMP FIRST
BAK_SP: ;退格键的功能 POS_GET
MOV ROW,DH
MOV LINE,DL
CMP LINE,0
JE STOP
DEC LINE
JMP AB
STOP:
MOV LINE,0
AB:
POS_GET 0,ROW,LINE
MOV AH,2
MOV DL,00
INT 21H
JMP FIRST
DEL: ;Del键
POS_GET
MOV ROW,DH
MOV LINE,DL
DEC LINE
POS_GET 0,ROW,LINE
MOV AH,2
MOV DL,00
INT 21H
INC LINE
JMP FIRST
CM:
CMP LINE,00
JZ POS_CM
POS_CM:
POS_CURSE 0,0,0
JMP FIRST
HELP PROC NEAR ;显示帮助信息
CALL SAVEDISPLAY ;显示帮助信息每行的位置 POS_GET
PUSH DX
WIN 0,57H,4,5,21,70
POS_CURSE 0,6,25
STRING HELP_MAS5
POS_CURSE 0,8,11
STRING HELP_MAS6
POS_CURSE 0,10,11
STRING HELP_MAS7
POP DX
POS_CURSE 0,DH,DL
MOV AH,0
INT 16H
CMP AH,36H ;F10 active help
JNZ CLS
CALL HELP
CLS:
WIN 0,1EH,9,10,13,70 ;清屏
CALL BACKDISPLAY
HELP ENDP
FUC_KEY ENDP
MENU_SHOW PROC NEAR ;显示菜单
CALL SAVEDISPLAY
PUSH CX
CMP AH,3BH ;F1功能
JZ MENU_SH
JMP CHAR_GET
MENU_SH: ;定义菜单的背景字体颜色 POS_GET
PUSH DX
WIN 0,06H,2,1,7,11
WIN 0,65H,1,0,6,10
POS_CURSE 0,1,0
STRING MANU_1
STRING MANU_2
STRING MANU_3
STRING MANU_5
POP DX
DEC DL
POS_CURSE 0,DH,DL
COPMAR:
RED_CHR
CMP AH,50H
JZ MANU_N
JMP MANU_HID
MANU_HID: ;菜单隐藏
WIN 0,1EH,1,1,7,11
CALL BACKDISPLAY
JMP CHAR_GET
MANU_N: ;开始定义各个菜单项
WIN 0,65H,5,1,5,8
POS_CURSE 0,5,0
STRING MANU_5
WIN 0,15H,1,1,1,8
POS_CURSE 0,1,0
STRING MANU_1
RED_CHR
CMP AH,48H
JE MANU_N
CMP AL,0DH
JZ NEW_1
CMP AH,50H
JE MANU_O
JMP MANU_HID MANU_N0:
JMP MANU_N
MANU_O:
WIN 0,65H,1,1,1,8 POS_CURSE 0,1,0 STRING MANU_1 WIN 0,15H,2,1,2,8 POS_CURSE 0,2,0 STRING MANU_2 RED_CHR
CMP AH,48H
JE MANU_O
CMP AL,0DH
JZ OPEN_1
CMP AH,50H
JE MANU_S
JMP MANU_HID NEW_1: JMP NEW_2 MANU_S:
WIN 0,65H,2,1,2,8 POS_CURSE 0,2,0 STRING MANU_2 WIN 0,15H,3,1,3,8 POS_CURSE 0,3,0 STRING MANU_3 RED_CHR
CMP AL,0DH
JZ SAVE_1
CMP AH,48H
JE MANU_S
CMP AH,50H
JE MANU_A
JMP MANU_HID OPEN_1: JMP OPEN_2
MANU_N1:
JMP MANU_N
MANU_A:
WIN 0,65H,3,1,3,8
POS_CURSE 0,3,0
STRING MANU_3
RED_CHR
CMP AH,48H
JE MANU_A
CMP AH,50H
JE MANU_E
JMP MANU_HID
MANU_N2:
JMP MANU_N1
NEW_2: JMP NEW
SAVE_1: CALL SAVE
MANU_E:
WIN 0,15H,5,1,5,8
POS_CURSE 0,5,0
STRING MANU_5
RED_CHR
CMP AH,50H
JE MANU_N2
CMP AH,1CH
JE EXIT
JMP MANU_HID
EXIT:
CALL BACKDISPLAY WIN 0,07H,15,10,17,61 WIN 0,24H,14,9,16,60 MOV DH,15
MOV DL,9
MOV BH,0
MOV AH,2
INT 10H
LEA DX,MESSAGE4 MOV AH,9
MOV AH,1
INT 21H
CMP AL,79H
JNZ Q
CALL QUITT
Q: CMP AL,6EH
JZ QUIT
QUIT: WIN 0,07H,0,0,24,79
POS_CURSE 0,0,0
MOV AH,4CH
INT 21H
RET
MENU_SHOW ENDP
NEW PROC NEAR ;新建文件 POS_GET
PUSH DX
CALL BACKDISPLAY
WIN 0,07H,15,10,17,61
WIN 0,24H,14,9,16,60,
MOV DH,15
MOV DL,9
MOV BH,0
MOV AH,02H
INT 10H
LEA DX,MESSAGE1
CMP AL,0DH
MOV AH,9
INT 21H
MOV BX,0
ALL:
MOV AH,01H
INT 21H
CMP AL,0DH
JE ALLL
MOV PATH[BX],AL
JMP ALL
ALLL:
WIN 0,3EH,15,9,17,61
POP DX
POS_CURSE 0,DH,DL
LEA DX,PATH
MOV AH,3CH
MOV CX,0
INT 21H
MOV HANDLE,AX
MOV BX,AX
MOV AH,3EH
INT 21H
WIN 0,3EH,1,0,23,79
MOV DH,1
MOV DL,0
MOV BH,0
MOV AH,2
INT 10H
JMP CHAR_GET
NEW ENDP
OPEN_2: JMP OPEN
OPEN PROC NEAR ;打开文件 CALL BACKDISPLAY
WIN 0,07H,15,10,17,61
WIN 0,24H,14,9,16,60
MOV DH,15
MOV DL,9
MOV BH,0
MOV AH,2
INT 10H
LEA DX,MESSAGE3
MOV AH,9
INT 21H
MOV BX,0
CLL:
MOV AH,1
INT 21H
CMP AL,13
JE CLLL
MOV PATH[BX],AL INC BX
JMP CLL
CLLL:
WIN 0,3EH,1,0,23,79 LEA DX,PATH
MOV AH,3DH
MOV AL,0
INT 21H
MOV HANDLE,AX
LEA DX,BUFFER
MOV BX,HANDLE
MOV CX,2000
MOV AH,3FH
INT 21H
WIN 0,3EH,1,23,1,79 MOV DH,1
MOV DL,0
MOV BH,0
MOV AH,2
INT 10H
MOV CX,1000
SUB BX,BX
REPLAY:
MOV DL,BUFFER[BX] INC BX
MOV AH,2
INT 21H
LOOP REPLAY
MOV BX,HANDLE
MOV AH,3EH
INT 21H
MOV DH,1
MOV DL,0
MOV BH,0
MOV AH,2
INT 10H
MOV CX,10
MOV BX,0
CLEAPATH_3:
MOV BL,0
MOV PATH[BX],BL
LOOP CLEAPATH_3
JMP CHAR_GET
OPEN ENDP
SAVE PROC NEAR ;保存文件 POS_GET
PUSH DX
WIN 0,3EH,1,0,6,10
CALL BACKDISPLAY
MOV AH,PATH
CMP AH,21H
JL J_3
JMP J_4
J_3:
WIN 0,07H,15,10,17,61
WIN 0,24H,14,9,16,60,
MOV DH,15
MOV DL,9
MOV BH,0
MOV AH,2
INT 10H
LEA DX,MESSAGE2
MOV AH,9
INT 21H
MOV BX,0
DLL:
MOV AH,1
INT 21H
CMP AL,0DH
JE DLLL
MOV PATH[BX],AL
INC BX
JMP DLL
DLLL:
WIN 0,3EH,1,0,23,79
POP DX
POS_CURSE 0,DH,DL J_4: LEA DX,PATH
MOV AH,3CH
MOV CX,0
INT 21H
MOV HANDLE,AX
LEA DX,BUFFER
MOV BX,HANDLE
MOV CX,2000
MOV AH,40H
INT 21H
MOV BX,HANDLE
MOV AH,3EH
INT 21H
CALL BACKDISPLAY JMP CHAR_GET
SAVE ENDP SAVEDISPLAY PROC NEAR PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DS
MOV AX,0002H
INT 33H
MOV BX,0D
MOV CX,3840D
LOOP1:
MOV AX,0B800H
MOV DS,AX
MOV DL,DS:[BX]
MOV AX,DATA
MOV DS,AX
MOV BAK[BX],DL
INC BX
LOOP LOOP1
MOV AX,0001H
INT 33H
POP DS
POP DX
POP CX
POP BX
POP AX
SAVEDISPLAY ENDP
BACKDISPLAY PROC NEAR PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH DS
MOV BX,0D
MOV CX,3840D
LOOP11:
MOV AX,DATA
MOV DS,AX
MOV DL,BAK[BX]
MOV AX,0B800H
MOV DS,AX
MOV DS:[BX],DL
INC BX
LOOP LOOP11
POP DS
POP DX
POP CX
POP BX
POP AX
RET
BACKDISPLAY ENDP
QUITT PROC NEAR ;退出 CALL BACKDISPLAY
WIN 0,07H,15,10,17,61
WIN 0,24H,14,9,16,60,
MOV DH,15
MOV DL,9
MOV BH,0
MOV AH,2
INT 10H
LEA DX,MESSAGE2
MOV AH,9
INT 21H
MOV BX,0
QLL:
MOV AH,1
INT 21H
CMP AL,0DH
JE QLLL
MOV PATH[BX],AL
INC BX
JMP QLL
QLLL:
WIN 0,07H,15,10,17,61
WIN 0,3EH,14,9,16,60
CALL BACKDISPLAY
LEA DX,PATH
MOV AH,3CH
MOV CX,00
INT 21H
MOV HANDLE,AX
LEA DX,BUFFER
MOV BX,HANDLE
MOV CX,2000
MOV AH,40H
INT 21H
MOV BX,HANDLE
MOV AH,3EH
INT 21H
CALL BACKDISPLAY
WIN 0,07H,0,0,24,79
MOV AH,4CH
INT 21H
RET
QUITT ENDP
EDIT ENDP
CODE ENDS
END START ;结束
4.2执行结果
4.2.1测试方法
在弹出的界面中第一行输入ABCDEFGHIJKLMN,在第二行输入abcdefghijklmn。

利用DEL键、BACKSPACE键、HOME键、END键、上下左右光标键对文本编辑,检查按键是否有用,按键的功能与测试结果是否一致。

编辑完成后保存文件名为abc,退出系统。

再次打开界面,然后打开刚刚保存的文件abc,观察刚刚的保存是否成功。

4.2.2测试结果
5. 使用说明
在记事本中写好该程序后保存为.asm文件,然后用masm程序产生OBJ 文件,接着用link程序产生EXE文件,然后执行程序。

程序执行的结果
是一个窗口,与windows下的窗口差不多,只是功能少一些。

在界面中输入任意的内容并对其进行编辑,编辑完后保存文件。

下次可以打开这个文件可以继续进行编辑。

6. 总结
6.1设计心得
6.1.1设计的特点
这个文本编辑器虽然小,但是基本的功能都有。

尤其是界面化的设计,使之更贴近用户。

这个文本编辑器最大的特点是使用了模块化的思想,将一个个的功能模块化,这样使程序的健壮性更好,以后若要添加功能,只需要将功能的模块添加进去就可以了,而不需要重新写程序,也不用修改很多的代码,方便了维护。

这个文本编辑器还有一个重要的功能就是保存文件,可以将用户输入界面的内容进行保存。

6.1.2不足之处
该文本编辑器也存在一些不足之处,它只能进行简单的文本编辑,而不能进行字体操作、段落操作等word中实现的操作,因此它很具有局限性。

另外,该编辑器只能输入字母、数字,不能输入汉字。

实现的功能比较少,只有新建、打开、保存、退出。

功能键帮助也只有输出帮助内容,没有具体的帮助措施。

6.1.3收获与体会
本次课程设计让我对汇编语言的几个重要知识点:寄存器问题、基
本命令、汇编中断程序的功能、汇编程序的基本格式以及函数的定
义和调用有了一个比较清楚的了解。

另外一般在编写程序时,首先
应该写出程序的主体框架,然后再进行修饰、完善。

在查错时,我
们一定要一条语句一条语句的推敲,绝不能疏忽大意,因为错误的
程序往往都是形似而神非,往往错误就在那一两条语句,所以必须
仔细。

现在我们习惯了拿高级语言来编写程序,因此对汇编语言有点生
疏。

而且汇编语言比较繁琐,没有高级语言那么抽象。

在平时的汇
编语言课上觉得自己学的不好,通过这次课程设计把自己不同的地
方温故了一边,像宏定义、有些特殊寄存器的使用。

写汇编可以自
己去控制寄存器,自己去控制程序而不是计算机已经分配好的。


正是要自己去控制,所以经常会碰到比高级语言更多的麻烦,有时
候寄存器自己用的都晕了,不知道该用哪个。

而且汇编语言里面跳
转特别多,一不小心就会出错。

指令也很多,不仅需要背下来,还
要知道每条指令的用法。

虽然现在已经几乎没有拿汇编来写程序
的,但是我们学习还是有用处的,在嵌入式方面,就要很好的汇编
基础。

这次汇编课程设计让我自己更清楚的了解了汇编,也知道了
自己还有好多要学的,不仅仅是汇编,还有好多的东西。

学到现
在,感觉写程序倒不是最难的,最难的还是调试程序,有时候一个
小错误可能是要调试很久,调试成功的感觉的真的很棒。

6.2展望
该文本编辑器的汇编程序还是有很多的地方可以改进和拓展的。

第一,可以增添一些功能,如查找,字体操作,段落操作等。

第二,界面可以做的更美观一点,符合用户的需求。

第三,本实验中设计的界面是固定大小的,改进的话大小可以改变,这样用户输入就没有限制了。

第四,本实验中和用户交互的地方比较少,可以考虑多一点与用户交互的地方。

相关文档
最新文档