简单文本编辑器的设计与实现
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: ;退格键的功能
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
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: ;光标左移
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: ;下移光标
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键的功能
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 SA VEDISPLAY ;显示帮助信息每行的位置
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 SA VEDISPLAY
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 SA VE_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
SA VE_1: CALL SA VE
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
INT 21H
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
INC BX
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
SA VE PROC NEAR ;保存文件
POS_GET
PUSH DX
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
SA VE ENDP
SA VEDISPLAY 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
SA VEDISPLAY 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:[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 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测试结果
四川大学软件学院 实验报告 课程名称数据结构实验课时8 实验项目文本编辑器实验时间12到14周实验目的了解c++类的封装和KMP算法。 实验环境 Windows平台 VC6.0++ 实验内容(算法、程序、步骤和方法) 部分函数创建思想: 创建过程如下: a、定义LinkList指针变量*temp: LinkList *temp; b、定义文本输入变量ch,记录文本行数变量j,记录每行字符数变量i; c、申请动态存储空间:head->next=(LinkList *)malloc(sizeof(LinkList)); d、首行头指针的前驱指针为空:head->pre=NULL; 首行指针:temp=head->next; 首行指针的前驱指针也为空:temp->pre=NULL; 定义没输入字符时文章长度为0:temp->length=0; 初始化为字符串结束标志,防止出现乱码:for(i=0;i<80;i++) temp->data[i]='\0'; e、利用循环进行文本输入 for(j=0;j
文本编辑器应用总结 一.lhgeditor文本编辑器 lhgeditor组件文件结构: 1. lhgeditor.js:组件的核心JS文件 2. lhgeditor.css:组件的样式表文件 3. images:组件所需的图片都在此文件夹中 以上三个文件为组件所必须的三个文件,组件包中其它以“_”开头的文件为示例的演示文件,实际使用中不需要这些文件。当然框架核心文件lhgcore.js是每个组件都必须用到的文件,记得加载组件前先要加载此文件。 lhgeditor组件使用说明: 1. 在调用组件的页面加载lhgcore.j s和lhgeditor.js两个文件。 2. 在window.onload函数里加入J.editor.add(编辑器的id).init(); 例:
二.nicEdit文本编辑器