当前位置:文档之家› 简易文本编辑器的设计与实现

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

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

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

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测试结果

文本编辑器c++实验报告附源代码

四川大学软件学院 实验报告 课程名称数据结构实验课时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;jdata[i]=ch; //给temp指向的行赋值 ···· temp->length++;//行中字符长度加1 if(ch=='#') {NUM=j; break; //文章结束时,Num来记录整个文章的行数 }}} 在字符输入的过程中,如果在单行输入的字符超过了80个字符, 则需要以下操作: 输入字符数大于80,重新分配空间建立下一行 temp->next=(LinkList *)malloc(sizeof(LinkList)) ;

几种常用网页文本编辑器总结

文本编辑器应用总结 一.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文本编辑器