资源描述
目录
1. 课程设计目的…………………………………2
2. 课程设计内容…………………………………2
2-1 设计要求……………………………………………2
2-2 设计题目……………………………………………2
3、设计思想………………………………………3
4、数据结构设计…………………………………3
4-1 数据段………………………………………………3
4-2 宏定义………………………………………………3
4-3 代码段………………………………………………3
5、详细的算法描述………………………………4
5-1 宏定义详细描述……………………………………4
5-2 实现流程图…………………………………………6
5-3 算法描述……………………………………………6
6、源程序…………………………………………7
7、程序运行结果…………………………………25
8、设计心得与程序不足…………………………29
9、参考文献………………………………………29
摘要
设计一个具有输入输出以及对文本进行编辑的简易文本编辑器,该编辑器具有可利用Del键、BackSpace键、Home键、End键 上下左右光标键对文本进行全屏编辑的功能,并且能够打开、新建、保存文件。
1、课程设计目的
本课程设计的目的和任务:
1. 巩固和加深学生对汇编语言课程的基本知识的理解和掌握。
2. 掌握汇编语言编程和程序调试的基本技能。
3. 利用汇编语言进行基本程序设计。
4. 提高运用汇编语言解决实际问题的能力。
2、课程设计的内容
2-1设计要求
1) 分析课程设计题目的要求
2) 写出详细设计说明
3) 编写程序代码,调试程序使其能正确运行
4) 设计完成的软件要便于操作和使用
5) 设计完成后提交课程设计报告
2-2设计题目
简单的文本编辑器
基本功能:
0 运行可执行文件wbbjq.exe,在出现的界面中输入任意文本内容,利用DEL键、BACKSPACE键、HOME键、END键、上下左右光标键对文本进行全屏幕编辑。
1 按F1键激活菜单file,下移光标,通过选择New;Open;Save As;Save;Exit子菜单实现文件的新建;打开;另存;保存和退出等功能。按F10激活帮助,给出帮助信息;按ESC键退出帮助。
3、设计思想
该程序主要是设计一个简易文本编辑器,达到可以可利用Del键、BackSpace键、Home键、End键 上下左右光标键对文本进行全屏编辑的目的。用BIOS功能调用中的10H中断类型,调用06号功能,设置窗口背景;调用DOS功能中的09号功能,实现显示菜单信息字符串;调用BIOS中的键盘I/O中断调用中的0号功能;从键盘读取字符,通过对上,下,左,右,光标间以及DEL,INS,BACKSPACE,END,HOME键的扫描码的判断,结合10H中中断的02号,03号功能确定光标的相应移动,从而实现对输入文本的全屏幕编辑;利用DOS系统功能调用中的文件管理功能,如建立文件,打开文件,读文件,写文件,实现对文件的操作。
4、数据结构设计
4-1 数据段
handle dw ? ;文件代号暂存区
path db 50 dup(0),'$' ;路径暂存区
buffer db 2000 dup(?) ;数据缓存区
bak db 3850 dup(0) ;保存文本中的内容
line db ? ;列号
row db ? ;行号
4-2 宏定义
red_chr macro ;读取字符
string macro p1 ; 显示字符串
win macro opr1,opr2,opr3,opr4,opr5,opr6 ;新建窗口,设置大小和颜色
pos_curse macro op1,op2,op3 ;设置光标位置
pos_get macro ;读取光标信息
4-3 代码段
main proc far ;主程序
window proc near ;创建窗口子程序
edit proc near ;编辑功能子程序
5、详细的算法描述
5-1 宏定义详细描述
1.字符宏定义
red_chr macro ;读取字符
mov ah,0
; 读键盘。出口AH=键盘的扫描码,AL=字符的ASCII码
int 16h
endm
2.输入字符串宏定义
string macro p1 ;输入字符光标
mov ah,9 ;显示字符串
lea dx,p1 ;DS:DX=串地址,'$'结束字符串
int 21h
endm
3.建立窗口宏定义
win macro opr1,opr2,opr3,opr4,opr5,opr6 ;建立窗口
mov ah,06h ;向上滚屏
mov al,opr1 ;AL=滚动行数(0——清窗口)
mov bh,opr2 ;BH=空白区域的缺省属性,
mov ch,opr3
;(CH,CL)=窗口的左上角位置(Y坐标,X坐标)
mov cl,opr4
mov dh,opr5
;(DH,DL)=窗口的右下角位置(Y坐标,X坐标)
mov dl,opr6
int 10h
endm
4.光标位置宏定义
pos_curse macro op1,op2,op3 ;定义光标位置
mov ah,2 ;用文本坐标下设置光标位置
mov bh,op1 ;BH=显示页码
mov dh,op2 ;DH=行(Y坐标)
mov dl,op3 ;DL=列(X坐标)
int 10h
endm
5.显示光标宏定义
pos_get macro ;显示光标位置
mov ah,03h ;读取光标信息。
;出口CH=光标的起始行,CL=光标的终止行,DH=行(Y坐标),DL=列(X坐标)
mov bh,0 ;BH=显示页码
int 10h
endm
5-2 程序结构图
5-3 实现流程图
是否为菜单功能键
键盘输入
开始
否
是
结束
显示帮助信息
Esc ?
显示帮助信息
帮助页面
文件操作
各项编辑功能
进入编辑
功能菜单
F1010
F1
F1orF10
否
是
第 28 页 共 29 页
6、源程序
red_chr macro ;读取字符宏定义
mov ah,0 ; 读键盘。出口AH=键盘的扫描码,AL=字符的ASCII码
int 16h
endm
string macro p1 ;输入字符光标
mov ah,9 ;显示字符串
lea dx,p1 ;DS:DX=串地址,'$'结束字符串
int 21h
endm
win macro opr1,opr2,opr3,opr4,opr5,opr6 ;建立窗口
mov ah,06h ;向上滚屏
mov al,opr1 ;AL=滚动行数(0——清窗口)
mov bh,opr2 ;BH=空白区域的缺省属性
mov ch,opr3 ;(CH,CL)=窗口的左上角位置(Y坐标,X坐标)
mov cl,opr4
mov dh,opr5 ;(DH,DL)=窗口的右下角位置(Y坐标,X坐标)
mov dl,opr6
int 10h
endm
pos_curse macro op1,op2,op3 ;定义光标位置
mov ah,2 ;用文本坐标下设置光标位置
mov bh,op1 ;BH=显示页码
mov dh,op2 ;DH=行(Y坐标)
mov dl,op3 ;DL=列(X坐标)
int 10h
endm
pos_get macro ;显示光标位置
mov ah,03h ;读取光标信息。出口CH=光标的起始行,CL=光标的终止行,DH=行(Y坐标),DL=列(X坐标)
mov bh,0 ;BH=显示页码
int 10h
endm
;--------------------------------------------------------------------
data segment ;定义数据段
menu db 'File Help $'
mass_1 db 'Press F1 To File Press F10 To Help','$'
manu_1 db ' New ',13,10,'$'
manu_2 db ' Open ',13,10,'$'
manu_3 db ' Save ',13,10,'$'
manu_4 db ' Save as ',13,10,'$'
manu_5 db ' Exit ','$'
handle dw ?
message1 db ' Enter The New File Name:','$'
message2 db ' Enter The Name To Be Saved:','$'
message3 db ' Enter The Name To Be Opened:','$'
message4 db ' <The file is not saved! Save it now?> (Y/N): ','$'
path db 50 dup(0),'$'
buffer db 2000 dup(?)
bak db 3850 dup(0)
line db ?
row db ?
char db ?
hanglie db '???//???','$' ;行//列
help_mas1 db ' Help Text $' ;帮助内容
help_mas2 db ' Welcome To Use Editor! $'
help_mas3 db '------------------------------------------- $'
help_mas4 db '1,Press F1 to begin a new file. $'
help_mas5 db '2,Press F10 to SHOW the HELP massage.$'
help_mas6 db '3,Use DOWN cursor key to choose the fuction $'
help_mas7 db '4,Press Esc To Quit .' ,0DH,0AH,0DH,0AH,'$'
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,9
lea dx,menu
int 21h
show_2: ;显示状态栏位置及内容
pos_curse 0,24,1 ;命令提示符共25行
mov ah,9
lea dx,mass_1 ;状态栏提示信息显示
int 21h
call win4
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 line,dl
cmp line,0 ;每行共80列。当line=0时,令line=79,row--,
jnz direct
mov line,79
dec row
cmp row,0 ;当行号减为0时,再令row=1
je stop2
jmp first
stop2:
mov row,1
jmp first
direct:
dec line
call win4 ;显示光标位置
jmp first
right: ;光标右移
pos_get
mov row,dh
mov line,dl
cmp line,79 ;当line=79时,令line=0,row++
jnz direct2
mov line,0
inc row
cmp row,24 ;当行号增到24时,再令row=23
je returns1
jmp first
direct2:
inc line
;call win4
jmp first
enter_2:
jmp enter
up: ;上移光标
pos_get
mov row,dh
mov line,dl
dec row
cmp row,0
je stop1
call win4
jmp first
stop1:
mov row,1
jmp first
down: ;下移光标
pos_get
mov row,dh
mov line,dl
inc row
cmp row,24
je stop3
call win4
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
call win4
jmp first
returns:
mov row,23
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 ;del
jz del
cmp ah,44h ;F10
jz help_0
ret
help_0: call help
home: ;HOME键的功能
pos_get
mov row,dh
mov line,0 ;置列为第0列
call win4
jmp first
_end: ;END键的功能
pos_get
mov row,dh
mov line,79 ;此处有错
call win4
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_curse 0,row,line
mov ah,2
mov dl,' '
int 21h
call win4
jmp first
del: ;DEL删除 此功能有问题
pos_get
mov row,dh
mov line,dl
dec line
pos_curse 0,row,line
mov ah,2
mov dl,' '
int 21h
inc line
call win4
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_mas1
pos_curse 0,8,11
string help_mas2
pos_curse 0,10,11
string help_mas3
pos_curse 0,12,11
string help_mas4
pos_curse 0,14,11
string help_mas5
pos_curse 0,16,11
string help_mas6
pos_curse 0,18,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_4
string manu_5
pop dx
dec dl ;列减1
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 ;EXIT项
string manu_5
win 0,15h,1,1,1,8
pos_curse 0,1,0 ;NEW项
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 ;OPEN项
win 0,15h,3,1,3,8
pos_curse 0,3,0
string manu_3 ;SAVE项
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
stri
展开阅读全文