大二下汇编综合性实验:编写一个简单的文本编辑器(EDIT)

;***************文本编辑器(简单的EDIT**********

;输出字符串功能宏定义

DISP_STRING MACRO STRING_PARAM

LEA DX, STRING_PARAM

MOV AH, 09H

INT 21H

ENDM

;**********************************

;创建窗口功能宏定义

CREATE_WIN MACRO AL_PARAM, BH_PARAM, CH_PARAM, CL_PARAM, DH_PARAM, DL_PARAM

MOV AL, AL_PARAM ;上卷行数, 为0时,整个窗口空白

MOV BH, BH_PARAM ;卷入行属性

MOV CH, CH_PARAM ;左上角行号

MOV CL, CL_PARAM ;左上角列号

MOV DH, DH_PARAM ;右下角行号

MOV DL, DL_PARAM ;右下角列号

MOV AH, 06H ;功能号,窗口上卷

INT 10H

ENDM

;**********************************

;设置光标位置

SET_CURSE MACRO BH_PARAM, DH_PARAM, DL_PARAM

MOV BH, BH_PARAM ;显示页号

MOV DH, DH_PARAM ;

MOV DL, DL_PARAM ;

MOV AH, 02H ;功能号

INT 10H

ENDM

;**********************************

;获取光标位置

GET_CURSE MACRO

MOV BH, 0 ;显示页号

MOV AH, 03H ;功能号,返回参数:CH=光标起始位置, DH:DL=:

INT 10H

ENDM

;*******************************************************************

;定义数据段

DATAS SEGMENT

;*********************功能键定义***********************

KEY_UP EQU 48H ;上移,功能键数值均为扫描码

KEY_DOWN EQU 50H ;下移

KEY_LEFT EQU 4BH ;左移

KEY_RIGHT EQU 4DH ;右移

KEY_BACKSPACE EQU 0EH ;退格键

KEY_ENTER EQU 1CH ;回车键

KEY_HOME EQU 47H

KEY_END EQU 4FH

KEY_F1 EQU 3BH ;F1,查看菜单目录

KEY_F2 EQU 3CH ;F2,查看帮助快捷键

KEY_CTRL_N EQU 31H ;新建文件快捷键

KEY_CTRL_O EQU 18H ;打开文件快捷键

KEY_CTRL_S EQU 1FH ;保存文件快捷键

KEY_CTRL_X EQU 2DH ;退出程序快捷键

;*******************菜单项相关提示内容******************

MENU_ITEM DB 'FILE(F1) HELP(F2)$' ;菜单标题栏

MENU_TIPS1 DB 'NEW  (CTRL+N)', 0DH, 0AH, '$'

MENU_TIPS2 DB 'OPEN (CTRL+O)', 0DH, 0AH, '$'

MENU_TIPS3 DB 'SAVE (CTRL+S)', 0DH, 0AH, '$'

MENU_TIPS4 DB 'EXIT (CTRL+X)', '$'

;******************程序提示内容***************************

HELP_TIPS0 DB 'TIPS FOR USEING THE EDIT', 0DH, 0AH, '$'

HELP_TIPS1 DB '1.Click F1 to view the menu list.', 0DH, 0AH, '$'

HELP_TIPS2 DB '2.New file shortcut is Ctrl n.', 0DH, 0AH, '$'

HELP_TIPS3 DB '3.Open file shortcut as Ctrl o.', 0DH, 0AH, '$'

HELP_TIPS4 DB '4.Save file shortcut as Ctrl s.', 0DH, 0AH, '$'

HELP_TIPS5 DB '5.Exit program shortcut is Ctrl x.', 0DH, 0AH, '$'

HELP_TIPS6 DB '6.View help shortcut as F2.', 0DH, 0AH, '$'

HELP_TIPS7 DB 'PRESS ANY KEY TO CLOSE THE HELP BAR!!!', 0DH, 0AH, '$'

;******************文件相关提示内容************************

FILE_TIPS1 DB 'PLEASE INPUT FILE NAME: $'

FILE_TIPS2 DB 'PLEASE INPUT OPEN FILE NAME: $'

FILE_TIPS3 DB 'PLEASE INPUT SAVE FILE NAME: $'

FILE_TIPS4 DB 'THE FILE HAS NOE BEEN SAVED! SAVE IT NOR NOT?(Y/N): $'

FILE_TIPS5 DB 'FILE NAME CANNOT BE EMPTY, PLEASE RE_ENTER: $'

INPUT_ERROR0 DB 'PLEASE INPUT Y OR N: $'

EXIT_TIPS DB 'THANK YOU FOR USING!$'

;******************定义相关变量******************************

PATH DB 50 DUP(0) ;文件路径

HANDLE DW ? ;文件句柄

DATA_BUFFER DB 2000 DUP(?)

;文件数据缓冲区,单色屏幕有2000个字符显示位置,每个字符需要两个字节表示

;单色显示存储器安排在段地址为B000H的区域,偏移地址从00F9FH.

BAK DB 3850 DUP(0) ;保存当前显示的内容,以便切换窗口后重新返回开始界面

COL DB ? ;光标当前所在列

ROW DB ? ;光标当前所在行

INPUT_CHAR DW ? ;输入的字符

INDEX DW 0 ;缓冲区字符下标,创建新文件时要置零

DATE DB 'DATE:0000/00/00$' ;日期

ROW_COL DB 'ROW:000, COL:000$' ;显示编辑文件内容的行列

DATAS ENDS

;******************************************************************

;定义堆栈段

STACKS SEGMENT STACK

DW 30H DUP(?)

TOP LABEL WORD

STACKS ENDS

;******************************************************************

;定义代码段

CODES SEGMENT

ASSUME CS:CODES, DS:DATAS, SS:STACKS

MAIN PROC FAR

PUSH DS

SUB AX, AX

PUSH AX

MOV AX, DATAS

MOV DS, AX

MOV AX, STACKS

MOV SS, AX

LEA SP, TOP

CALL MAIN_INTERFACE ;调用主界面函数

CALL HELP_WIN ;默认进入程序显示提示内容

CALL CONTROLLER ;调用控制器

RET

MAIN ENDP

;******************************************************************

;******************************************************************

;子程序:创建主界面

MAIN_INTERFACE PROC NEAR

CREATE_WIN 0, 70H, 1, 0, 24, 79 ;文件编辑区域,白底黑字。单色显示屏的大小为24行,79

CREATE_WIN 0, 1FH, 0, 0, 0, 79 ;菜单栏区域, 蓝底白字

CREATE_WIN 0, 1FH, 24, 0, 24, 79;提示栏区域

;显示菜单项

SHOW_MENU:

SET_CURSE 0, 0, 0

DISP_STRING MENU_ITEM

;显示状态信息

SHOW_STATE:

SET_CURSE 0, 24, 0

CALL DATE_WIN ;显示时间

CALL ROW_COL_WIN ;显示行列

SET_CURSE 0, 1, 0 ;设置光标为编辑区域首位

RET

MAIN_INTERFACE ENDP

;******************************************************************

;******************************************************************

;创建提示内容

HELP_WIN PROC NEAR

CALL SAVEDISPLAY ;保存当前界面的显示信息

GET_CURSE

PUSH DX

CREATE_WIN 0, 30H, 2, 15, 18, 65 ;青底黑字

;输出内容

SET_CURSE 0, 3, 28

DISP_STRING HELP_TIPS0

SET_CURSE 0, 5, 20

DISP_STRING HELP_TIPS1

SET_CURSE 0, 7, 20

DISP_STRING HELP_TIPS2

SET_CURSE 0, 9, 20

DISP_STRING HELP_TIPS3

SET_CURSE 0, 11, 20

DISP_STRING HELP_TIPS4

SET_CURSE 0, 13, 20

DISP_STRING HELP_TIPS5

SET_CURSE 0, 15, 20

DISP_STRING HELP_TIPS6

SET_CURSE 0, 17, 20

DISP_STRING HELP_TIPS7

POP DX

SET_CURSE 0, DH, DL

MOV AH, 00H ;用户按任意键退出提示界面

INT 16H

CREATE_WIN 0, 70H, 2, 15, 18, 65 ;覆盖帮助栏的提示内容

CALL BACKDISPLAY

RET

HELP_WIN ENDP

;******************************************************************

;******************************************************************

;子程序:逻辑控制

CONTROLLER PROC NEAR

CONTROLLER_STEP0:

CALL GET_CHAR ;接受用户输入字符

CALL FUNCTION_KEY ;判断字符是否为功能键

JMP CONTROLLER_STEP0

RET

CONTROLLER ENDP

;******************************************************************

;******************************************************************

;子程序:读取字符

GET_CHAR PROC NEAR

GET_CURSE ;获取当前光标位置

MOV ROW, DH

MOV COL, DL

 

SET_CURSE 0, ROW, COL ;设置光标位置

MOV AH, 0H

INT 16H

MOV INPUT_CHAR, AX ;从键盘读字符,AH=扫描码 AL=ASCII

RET

GET_CHAR ENDP

;******************************************************************

;******************************************************************

;对读取的字符进行处理,主要针对功能键

FUNCTION_KEY PROC NEAR

MOV AX, INPUT_CHAR

CMP AH, KEY_UP ;是否上移

JE UP

CMP AH, KEY_DOWN ;是否下移

JE DOWN

CMP AH, KEY_LEFT ;是否左移

JE LEFT

CMP AH, KEY_RIGHT ;是否右移

JE RIGHT

CMP AH, KEY_ENTER ;是否回车

JE ENTER_0

CMP AH, KEY_HOME ;是否HOME

JE HOME

CMP AH, KEY_END ;是否END

JE END_0

CMP AH, KEY_BACKSPACE ;是否退格键

JE BACKSPACE

CMP AH, KEY_F1 ;是否功能键F1

JE F1

CMP AH, KEY_F2 ;是否为查看帮助快捷键

JE F2

CMP AH, KEY_CTRL_N ;是否为新建文件快捷键

JE CTRL_N

CMP AH, KEY_CTRL_O ;是否为打开文件快捷键

JE CTRL_O

CMP AH, KEY_CTRL_S ;是否为保存文件快捷键

JE CTRL_S

CMP AH, KEY_CTRL_X ;是否为退出快捷键

JE CTRL_X

;不是功能键,则存入数据缓冲区,同时显示在屏幕上

MOV BX, INDEX

MOV [DATA_BUFFER + BX], AL

INC INDEX

MOV DL, AL ;显示输入的内容

MOV AH, 02H

INT 21H

CALL ROW_COL_WIN ;相应调整光标所在行列信息

JMP FUNCTION_KEY_END

UP:

CALL UP_FUNC

JMP FUNCTION_KEY_END

DOWN:

CALL DOWN_FUNC

JMP FUNCTION_KEY_END

LEFT:

CALL LEFT_FUNC

JMP FUNCTION_KEY_END

RIGHT:

CALL RIGHT_FUNC

JMP FUNCTION_KEY_END

ENTER_0:

CALL ENTER_FUNC

JMP FUNCTION_KEY_END

HOME:

CALL HOME_FUNC

JMP FUNCTION_KEY_END

END_0:

CALL END_FUNC

JMP FUNCTION_KEY_END

BACKSPACE:

CALL BACKSPACE_FUNC

JMP FUNCTION_KEY_END

F1:

CALL F1_FUNC

JMP FUNCTION_KEY_END

F2:

CALL HELP_WIN

JMP FUNCTION_KEY_END

CTRL_N:

CALL NEW_FILE

JMP FUNCTION_KEY_END

CTRL_O:

CALL OPEN_FILE

JMP FUNCTION_KEY_END

CTRL_S:

CALL SAVE_FILE

JMP FUNCTION_KEY_END

;关闭程序,输出提示

CTRL_X:

        CALL QUIT_FUNC

JMP FUNCTION_KEY_END

FUNCTION_KEY_END: RET

FUNCTION_KEY ENDP

;******************************************************************

;各方向键的功能实现思想都差不多,主要考虑边界(可自己设置)情况,

;******************************************************************

;子程序:光标上移

UP_FUNC PROC NEAR

GET_CURSE ;获取光标位置

MOV ROW, DH

MOV COL, DL

DEC ROW

CMP ROW, 0 ;判断是否到顶行

JE UP_STEP0

JMP UP_FUNC_END

UP_STEP0:

MOV ROW, 1 ;如果是第一行,则保持不变,因为第零行为菜单栏

UP_FUNC_END:

SET_CURSE 0, ROW, COL

CALL ROW_COL_WIN

RET

UP_FUNC ENDP

;******************************************************************

;******************************************************************

;子程序:光标下移

DOWN_FUNC PROC NEAR

GET_CURSE ;获取光标位置

MOV ROW, DH

MOV COL, DL

INC ROW

CMP ROW, 24

JE DOWN_STEP0

JMP DOWN_FUNC_END

DOWN_STEP0:

MOV ROW, 23

DOWN_FUNC_END:

SET_CURSE 0, ROW, COL

CALL ROW_COL_WIN

RET

DOWN_FUNC ENDP

;*****************************************************************

;*****************************************************************

;子程序:光标左移

LEFT_FUNC PROC NEAR

GET_CURSE

MOV ROW, DH

MOV COL, DL

CMP COL, 0 ;判断是否为首列位置,不是首列则直接左移

JNZ LEFT_STEP0

MOV COL, 79

DEC ROW

CMP ROW, 0 ;判断是否为首行首列,不是首行则行数减一,是首行首列则行数置为1

JE LEFT_STEP1

JMP LEFT_FUNC_END

LEFT_STEP0:

DEC COL

JMP LEFT_FUNC_END

;左上角左移跳到右下角

LEFT_STEP1:

MOV ROW, 23

LEFT_FUNC_END:

SET_CURSE 0, ROW, COL

CALL ROW_COL_WIN

RET

LEFT_FUNC ENDP

;*******************************************************************

;*******************************************************************

;子程序:光标右移

RIGHT_FUNC PROC NEAR

GET_CURSE

MOV ROW, DH

MOV COL, DL

CMP COL, 79 ;判断是否为末列,如果不是则直接右移

JNZ RIGHT_STEP0

MOV COL, 0

INC ROW

CMP ROW, 24

JE RIGHT_STEP1

JMP RIGHT_FUNC_END

RIGHT_STEP0:

INC COL

JMP RIGHT_FUNC_END

;右下角右移,跳到左上角

RIGHT_STEP1:

MOV ROW, 1

MOV COL, 0

JMP RIGHT_FUNC_END

RIGHT_FUNC_END:

SET_CURSE 0, ROW, COL

CALL ROW_COL_WIN

RET

RIGHT_FUNC ENDP

;******************************************************************

;******************************************************************

;子程序:回车换行

ENTER_FUNC PROC NEAR

GET_CURSE

MOV ROW, DH

MOV COL, DL

INC ROW

CMP ROW, 24

JE ENTER_STEP0

MOV COL, 0

JMP ENTER_FUNC_END

ENTER_STEP0:

MOV ROW, 23

MOV COL, 0

ENTER_FUNC_END:

SET_CURSE 0, ROW, COL

CALL ROW_COL_WIN

RET

ENTER_FUNC ENDP

;******************************************************************

;******************************************************************

;子程序:HOME回到当前光标所在行的行首位置

HOME_FUNC PROC NEAR

GET_CURSE

MOV ROW, DH

MOV COL, 0

HOME_FUNC_END:

SET_CURSE 0, ROW, COL

CALL ROW_COL_WIN

RET

HOME_FUNC ENDP

;******************************************************************

;******************************************************************

;子程序:END回到当前光标所在行的行尾位置

END_FUNC PROC NEAR

GET_CURSE

MOV ROW, DH

MOV COL, 79

 

END_FUNC_END:

SET_CURSE 0, ROW, COL

CALL ROW_COL_WIN

RET

END_FUNC ENDP

;******************************************************************

;通过输出空格的方式达到删除光标所在位的字符信息

;******************************************************************

;子程序:退格键功能

BACKSPACE_FUNC PROC NEAR

GET_CURSE

MOV ROW, DH

MOV COL, DL

CMP COL, 0 ;判断是否是首列

JE BACKSPACE_STEP0

DEC COL

JMP BACKSPACE_STEP1

;处理首列,如果不是首行

BACKSPACE_STEP0:

MOV COL, 79

DEC ROW

CMP ROW, 0

JNE BACKSPACE_STEP1

INC ROW

MOV COL, 0

BACKSPACE_STEP1:

SET_CURSE 0, ROW, COL

MOV DL, 0 ;输出空格, 替换当前的数据,达到删除的功能

MOV AH, 2H

INT 21H

 

BACKSPACE_FUNC_END:

SET_CURSE 0, ROW, COL

CALL ROW_COL_WIN

RET

BACKSPACE_FUNC ENDP

;******************************************************************

;******************************************************************

;子程序:F1文件操作功能

F1_FUNC PROC NEAR

CALL MENU_OPERATION

RET

F1_FUNC ENDP

;******************************************************************

;******************************************************************

;子程序:退出程序

QUIT_FUNC PROC NEAR

CREATE_WIN 0, 30H, 10, 10, 12, 70 ;青底黑字

SET_CURSE 0, 11, 10

DISP_STRING FILE_TIPS4 ;提示是否保存当前文件

;用户输入选择

INPUT_CHOOSE:

MOV AH, 01H

INT 21H

CMP AL, 59H ;判断是否输入“Y”

JNE  JUDGE_N ;判断是否输入“N”

CALL SAVE_FILE ;保存当前文件

JUDGE_N:

CMP AL, 4EH

JNE CONTINUE_INPUT ;输入不规范

JMP QUIT

CONTINUE_INPUT:

CREATE_WIN 0, 30H, 10, 10, 12, 70 ;青底黑字

SET_CURSE 0, 11, 10

DISP_STRING INPUT_ERROR0;提示用户输入不规范,重新输入

JMP INPUT_CHOOSE

QUIT:

CREATE_WIN 0, 0FH, 0, 0, 24, 79 ;输出结束语

SET_CURSE 0, 1, 13

DISP_STRING EXIT_TIPS

MOV AH, 4CH

INT 21H

RET

QUIT_FUNC ENDP

;*******************************************************************

;*******************************************************************

;子程序:菜单操作

MENU_OPERATION PROC NEAR

CALL SAVEDISPLAY

PUSH CX

;定义菜单显示

GET_CURSE

PUSH DX

;CREATE_WIN 0, 06H, 2, 1, 7, 11

CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字

SET_CURSE 0, 1, 0

DISP_STRING MENU_TIPS1 ;NEW

DISP_STRING MENU_TIPS2 ;OPEN

DISP_STRING MENU_TIPS3 ;SAVE

DISP_STRING MENU_TIPS4 ;EXIT

POP DX

MOV ROW, DH

MOV COL, DL

DEC COL

SET_CURSE 0, 24, 79 ;初始光标置于右下角

;判断键盘输入

MENU_OPERATION_JUDGE:

MOV AH, 00H

INT 16H

CMP AH, KEY_DOWN ;判断是否进行操作,向下选择菜单项

JZ MENU_ITEM_NEW ;定义菜单项

CMP AH, KEY_UP

JZ MENU_ITEM_NEW

;否则,隐藏菜单显示

MENU_HID:

CREATE_WIN 0, 70H, 1, 0, 4, 12

SET_CURSE 0, 1, 0

CALL BACKDISPLAY

JMP MENU_OPERATION_END

;定义菜单项

MENU_ITEM_NEW:

CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字

SET_CURSE 0, 1, 0

DISP_STRING MENU_TIPS1 ;NEW

DISP_STRING MENU_TIPS2 ;OPEN

DISP_STRING MENU_TIPS3 ;SAVE

DISP_STRING MENU_TIPS4 ;EXIT

CREATE_WIN 0, 24H, 1, 0, 1, 12 ;选中NEW,绿底红字

SET_CURSE 0, 1, 0

DISP_STRING MENU_TIPS1

SET_CURSE 0, 1, 0 ;光标置于当前选中项

;继续读取下一个键盘动作

MOV AH, 00H

INT 16H

CMP AH, KEY_UP ;上移

JE MENU_ITEM_EXIT

CMP AL, 0DH ;选择了当前的选项

JE NEW_F ;当前菜单项为NEW

CMP AH, KEY_DOWN ;下移

JE MENU_ITEM_OPEN

JMP MENU_HID ;非上下键,非回车键,则隐藏菜单项。

MENU_ITEM_OPEN:

CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字

SET_CURSE 0, 1, 0

DISP_STRING MENU_TIPS1 ;NEW

DISP_STRING MENU_TIPS2 ;OPEN

DISP_STRING MENU_TIPS3 ;SAVE

DISP_STRING MENU_TIPS4 ;EXIT

CREATE_WIN 0, 24H, 2, 0, 2, 12 ;选中NEW,绿底红字

SET_CURSE 0, 2, 0

DISP_STRING MENU_TIPS2

SET_CURSE 0, 2, 0 ;光标置于当前选中项

;继续读取下一个键盘动作

MOV AH, 00H

INT 16H

CMP AH, KEY_UP ;上移

JE MENU_ITEM_NEW

CMP AL, 0DH ;选择了当前的选项

JE OPEN_F ;当前菜单项为OPEN

CMP AH, KEY_DOWN ;下移

JE MENU_ITEM_SAVE

JMP MENU_HID ;非上下键,非回车键,则隐藏菜单项。

MENU_ITEM_SAVE:

CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字

SET_CURSE 0, 1, 0

DISP_STRING MENU_TIPS1 ;NEW

DISP_STRING MENU_TIPS2 ;OPEN

DISP_STRING MENU_TIPS3 ;SAVE

DISP_STRING MENU_TIPS4 ;EXIT

CREATE_WIN 0, 24H, 3, 0, 3, 12 ;选中NEW,绿底红字

SET_CURSE 0, 3, 0

DISP_STRING MENU_TIPS3

SET_CURSE 0, 3, 0 ;光标置于当前选中项

;继续读取下一个键盘动作

MOV AH, 00H

INT 16H

CMP AH, KEY_UP ;上移

JE MENU_ITEM_OPEN

CMP AL, 0DH ;选择了当前的选项

JE SAVE_F ;当前菜单项为SAVE

CMP AH, KEY_DOWN ;下移

JE MENU_ITEM_EXIT

JMP MENU_HID ;非上下键,非回车键,则隐藏菜单项。

MENU_ITEM_EXIT:

CREATE_WIN 0, 30H, 1, 0, 4, 12 ;蓝底黑字

SET_CURSE 0, 1, 0

DISP_STRING MENU_TIPS1 ;NEW

DISP_STRING MENU_TIPS2 ;OPEN

DISP_STRING MENU_TIPS3 ;SAVE

DISP_STRING MENU_TIPS4 ;EXIT

CREATE_WIN 0, 24H, 4, 0, 4, 12 ;选中NEW,绿底红字

SET_CURSE 0, 4, 0

DISP_STRING MENU_TIPS4

SET_CURSE 0, 4, 0 ;光标置于当前选中项

;继续读取下一个键盘动作

MOV AH, 00H

INT 16H

CMP AH, KEY_UP ;上移

JE MENU_ITEM_SAVE

CMP AL, 0DH ;选择了当前的选项

JE EXIT_F ;当前菜单项为EXIT

CMP AH, KEY_DOWN ;下移

JE MENU_ITEM_NEW

JMP MENU_HID ;非上下键,非回车键,则隐藏菜单项。

NEW_F:

CALL MAIN_INTERFACE

CALL NEW_FILE

JMP MENU_OPERATION_END

OPEN_F:

CALL MAIN_INTERFACE

CALL OPEN_FILE

JMP MENU_OPERATION_END

SAVE_F:

CALL SAVE_FILE

JMP MENU_OPERATION_END

EXIT_F:

CALL BACKDISPLAY

CALL QUIT_FUNC

MENU_OPERATION_END:

POP CX

RET

MENU_OPERATION ENDP

;*******************************************************************

;*******************************************************************

;子程序:新建文件

NEW_FILE PROC NEAR

GET_CURSE

PUSH DX

CALL BACKDISPLAY

CREATE_WIN 0, 30H, 10, 20, 12, 60 ;青底黑字

SET_CURSE 0, 11, 20

DISP_STRING FILE_TIPS1 ;提示用户输入文件名

MOV BX, 0

;开始输入文件名

NEW_FILE_STEP0:

MOV AH, 01H

INT 21H

CMP AL, 0DH ;判断是否为回车键

JE NEW_FILE_STEP1

MOV PATH[BX], AL

INC BX

JMP NEW_FILE_STEP0

;创建文件

NEW_FILE_STEP1:

POP DX

SET_CURSE 0, DH, DL

LEA DX, PATH ;DS:DX=ASCII Z串首地址

MOV AH, 3CH ;功能号, 建立文件,成功:AX=文件句柄,失败:AX=错误码

MOV CX, 00 ;文件属性,以写的方式创建一个文件

INT 21H

 

MOV HANDLE, AX ;保存文件句柄

MOV BX, AX ;BX=文件句柄

MOV AH, 3EH ;功能号, 关闭文件

INT 21H

 

CALL MAIN_INTERFACE ;返回编辑界面

MOV INDEX, 0 ;缓冲区下标置零

SET_CURSE 0, 1, 0

NEW_FILE_END:

RET

NEW_FILE ENDP

;*******************************************************************

;*******************************************************************

;子程序:打开文件

OPEN_FILE PROC NEAR

CALL BACKDISPLAY

CREATE_WIN 0, 30H, 10, 20, 12, 60 ;青底黑字

SET_CURSE 0, 11, 20

DISP_STRING FILE_TIPS2 ;提示输入打开的文件名

MOV BX, 0

OPEN_FILE_STEP0:

MOV AH, 01H

INT 21H

CMP AL, 0DH ;判断是否为回车键

JE OPEN_FILE_STEP1

MOV PATH[BX], AL

INC BX

JMP OPEN_FILE_STEP0

OPEN_FILE_STEP1:

LEA DX, PATH ;DS:DX=ASCII Z串首地址

MOV AH, 3DH ;功能号, 打开文件,成功:AX=文件句柄, 失败:AX=错误码

INT 21H

MOV HANDLE, AX ;保存文件句柄

LEA DX, DATA_BUFFER ;DS:DX=缓冲区首址

MOV BX, HANDLE ;文件句柄

MOV CX, 2000 ;缓冲区大小,也是单色显示屏显示字符的最大值

MOV AH, 3FH ;功能号, 读文件或设备, 成功:AX=实际读入缓冲区的字符数,失败:AX=错误码

INT 21H

 

CALL MAIN_INTERFACE ;返回编辑界面

SET_CURSE 0, 1, 0

 

MOV CX, 1000

MOV BX, 0

;输出文件内容

OPEN_FILE_LOOP0:

MOV DL, DATA_BUFFER[BX]

MOV AH, 02H

INT 21H

INC BX

LOOP OPEN_FILE_LOOP0

 

;关闭文件

MOV BX, HANDLE

MOV AH, 3EH

INT 21H

SET_CURSE 0, 1, 0

;清除文件路径

MOV CX, 50 ;文件路径默认大小

MOV BX, 0

OPEN_FILE_LOOP1:

MOV DL, 0

MOV PATH[BX], DL

INC BX

LOOP OPEN_FILE_LOOP1

 

OPEN_FILE_END:

RET

OPEN_FILE ENDP

;*******************************************************************

;*******************************************************************

;子程序:保存文件

SAVE_FILE PROC NEAR

GET_CURSE

PUSH DX

CALL BACKDISPLAY

MOV AH, PATH

CMP AH, 21H ;判断文件路径是否为空

JL SAVE_FILE_STEP0

JMP SAVE_FILE_STEP2 ;文件路劲不为空,直接以当前路径保存文件

;开始输入文件名

SAVE_FILE_STEP0:

CREATE_WIN 0, 30H, 10, 20, 12, 60 ;青底黑字

SET_CURSE 0, 11, 20

DISP_STRING FILE_TIPS3

MOV BX, 0

SAVE_FILE_STEP1:

MOV AH, 01H

INT 21H

CMP AL, 0DH ;判断是否为回车键

JE SAVE_FILE_STEP2

MOV PATH[BX], AL

INC BX

JMP SAVE_FILE_STEP1

SAVE_FILE_STEP2:

MOV AH, PATH

CMP AH, 21H

JNL NEXT

CREATE_WIN 0, 30H, 10, 10, 12, 70 ;输出提示文件名不能为空,重新输入文件名

SET_CURSE 0, 11, 10

DISP_STRING FILE_TIPS5

JMP SAVE_FILE_STEP1

NEXT:

CREATE_WIN 0, 70H, 10, 10, 12, 70

POP DX

SET_CURSE 0, DH, DL

;创建文件

SAVE_FILE_STEP3:

LEA DX, PATH ;DS:DX=ASCII Z串首地址

MOV AH, 3CH ;功能号, 建立文件,成功:AX=文件句柄,失败:AX=错误码

MOV CX, 00 ;文件属性,以写的方式创建一个文件

INT 21H

 

MOV HANDLE, AX ;保存文件句柄

LEA DX, DATA_BUFFER

MOV BX, AX ;BX=文件句柄

MOV CX, 2000

MOV AH, 40H ;写入文件

INT 21H

 

MOV BX, HANDLE

MOV AH, 3EH ;功能号, 关闭文件

INT 21H

CALL BACKDISPLAY

SAVE_FILE_END:

RET

SAVE_FILE 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 ;0F00H

SAVEDISPLAY_LOOP0:

MOV AX, 0B000H

MOV DS, AX

MOV DL, DS:[BX]

MOV AX, DATAS

MOV DS, AX

MOV BAK[BX], DL

INC BX

LOOP SAVEDISPLAY_LOOP0

 

MOV AX, 0001H ;显示鼠标指针,通常在鼠标初始化后,用此功能显示其指针

INT 33H

 

POP DS

POP DX

POP CX

POP BX

POP AX

RET

SAVEDISPLAY ENDP

;*******************************************************************

;*******************************************************************

;子程序:返回显示界面

BACKDISPLAY PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH DS

MOV BX, 0D

MOV CX, 3840D

BACKDISPLAY_LOOP0:

MOV AX, DATAS

MOV DS, AX

MOV DL, BAK[BX]

MOV AX, 0B000H

MOV DS, AX

MOV DS:[BX], DL

INC BX

LOOP BACKDISPLAY_LOOP0

 

POP DS

POP DX

POP CX

POP BX

POP AX

RET

BACKDISPLAY ENDP

;*********************************************************************

;*********************************************************************

;子程序:显示日期

DATE_WIN PROC NEAR

MOV AH, 2AH ;功能号,取日期, CX=,DH:DL=:日(均为二进制)

INT 21H

MOV BL, 10D

;处理年

MOV AX, 0

MOV AX, CX

DIV BL

ADD AH, 30H ;输出数值,+'0'

MOV [DATE + 8], AH

MOV AH, 0

DIV BL

ADD AH, 30H

MOV [DATE + 7], AH

MOV AH, 0

DIV BL

ADD AH, 30H

MOV [DATE + 6], AH

MOV AH, 0

DIV BL

ADD AH, 30H

MOV [DATE + 5], AH

;处理月份

MOV AX, 0

MOV AL, DH

DIV BL

ADD AX, 3030H ;输出数值,+'0'

MOV [DATE + 10], AL

MOV [DATE + 11], AH

;处理日

MOV AX, 0

MOV AL, DL

DIV BL

ADD AX, 3030H

MOV [DATE + 13], AL

MOV [DATE + 14], AH

;创建窗口,显示内容

CREATE_WIN 0, 1FH, 0, 65, 0, 79 ;蓝底白字

SET_CURSE 0, 0, 65

DISP_STRING DATE

 

RET

DATE_WIN ENDP

;*******************************************************

;*******************************************************

;子程序:显示行和列

ROW_COL_WIN PROC NEAR

GET_CURSE ;获取光标位置

PUSH DX

MOV BL, 100D

MOV BH, 10D

;处理行

MOV AX, 0

MOV AL, DH

DIV BL

ADD AL, 30H

MOV [ROW_COL + 4], AL

MOV AL, AH

MOV AH, 0

DIV BH

ADD AX, 3030H

MOV [ROW_COL + 5], AL

MOV [ROW_COL + 6], AH

;处理列

MOV AX, 0

MOV AL, DL

DIV BL

ADD AL, 30H

MOV [ROW_COL + 13], AL

MOV AL, AH

MOV AH, 0

DIV BH

ADD AX, 3030H

MOV [ROW_COL + 14], AL

MOV [ROW_COL + 15], AH

;创建窗口,显示内容

CREATE_WIN 0, 1FH, 24, 60, 24, 79;蓝底白字

SET_CURSE 0, 24, 61

DISP_STRING ROW_COL

POP DX

SET_CURSE 0, DH, DL

RET

ROW_COL_WIN ENDP

CODES ENDS

END MAIN

posted @ 2020-06-28 17:05  技术扫地生—楼上老刘  阅读(693)  评论(0编辑  收藏  举报