汇编语言文本编辑器.docx
《汇编语言文本编辑器.docx》由会员分享,可在线阅读,更多相关《汇编语言文本编辑器.docx(64页珍藏版)》请在冰豆网上搜索。
汇编语言文本编辑器
;滚动窗体宏定义
winMACROlux,luy,rdx,rdy,attr
MOVAH,6
MOVAL,0
MOVBH,attr;前景背景属性
MOVCH,lux
MOVCL,luy
MOVDH,rdx
MOVDL,rdy
INT10h
ENDM
;滚动窗体宏定义2
saveEMACRO
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHDS
PUSHSI
ENDM
recoverMACRO
POPSI
POPDS
POPDX
POPCX
POPBX
POPAX
ENDM
fileIOMACROX,Y
LEADX,X
MOVAH,Y
INT21H
ENDM
showMMACROmessM
poscur24,0
LEADX,messM
MOVAH,09H
INT21H
ENDM
;------------------------------------
;字符串显示宏定义
showMACROmess
LEADX,mess
MOVAH,09h
INT21h
ENDM
;-------------------------------------
;光标定位宏定义
posgetMACRO;读光标位置
MOVAH,03h
MOVBH,0
INT10h
ENDM
posgetSMACRO
saveE
MOVAH,03h
MOVBH,0
INT10h
MOVrow,DH
MOVcolumn,DL
recover
ENDM
poscurMACROx,y
MOVAH,2
MOVDH,x
MOVDL,y
MOVBH,0
INT10h
ENDM
;-------------------------------------
;读取键盘
readCharMACRO
MOVBH,0
MOVAH,8h
INT10h
ENDM
putcharMACROx
MOVDL,x
MOVAH,02H
INT21H
ENDM
getcharMACRO
MOVAH,0
INT16h
ENDM
;********************************************************
;数据段定义
;.386
data_segSEGMENT
totalCharsDB0;字符总数,以此来控制数据缓冲区,
CHar1DB0b3h;常量,是一个竖线
tempcharDB?
;临时字节变量
musicIntDB0;文件数量
musicIndexDB30h;默认文件名的最后一个字符,随新建打开而增1,关闭减1
SaveAsFlagDB0;已调用过filesaveas函数
modifyFlagDB0;为0时已做修改
AsOrIfFlagDB0;为0时是saveas调用
saveActiveDB78h;根据musicInt来判断是否激活save,saveAs菜单
copyActiveDB78h;根据copyFlag来判断是否激活copy,cut菜单
pasteActiveDB78h;根据paste来判断是否激活paste菜单
CLearFlagDB0;clearFlag为0时表示不需要处理选择文本,如将反色显示还原
pasteFlagDB0;pasteFlag为0时为不能粘贴,
copyFlagDB0;copyFlag为0时为不能复制与剪切,
pasteNumDB0;粘贴缓冲区中字符个数.
PasteBufferDB25DUP(0)
DB'$'
;复制粘贴缓冲区
INsertNumDB1;insertNum为插入字符的个数
saveDB0;
pathDB30DUP(0);文件名存放缓冲区
DB'$'
bufferDB2000DUP(?
);buffer为数据缓冲区
bakDB3850DUP(0);视频缓冲区的备份
rowDB2;保存行号,
columnDB1;保存列号.
rowBakDB2
columnbakDB1
peakDB0Dah,78DUP(0C4h),0BFh,13,10,'$';顶端横线
errormess1DB'cannotcreatthefile,pathiswrong!
','$'
errormess2DB'cannotwritetothefile!
','$'
errormess3DB'thefilenameistoolong!
','$'
errormess4DB'cannotopenthefile,filenameiswrong','$'
errormess5DB'cannotreadthefile!
','$'
mess1DB'Pleaseinputsavefilename:
','$'
mess2DB'Pleaseinputopenfilename:
','$'
mess3DB'***Thefileisnotsave!
Saveitnow?
(Y/N)***:
','$'
mess4DB'pleaseinputthefilenameagain','$'
mess5DB'yourputiswrong!
pleaseinputY/Nagain','$'
mess6DB0b3H,'row:
column:
','$'
mess7DB'Creatanewfile','$'
mess8DB'loadsanexitingfilefromdisk','$'
mess9DB'savecurrentfile','$'
mess10DB'savecurrentfilewithnewname','$'
mess11DB'Exitstheeditor','$'
mess12DB'F1:
filemenuF4:
help','$'
mess21DB'Copyselectedtexttobuffer','$'
mess22DB'Deletesselectedtextandcopysit','$'
mess23DB'Insertsbuffercontentshere','$'
;mess13DB0b3H,'modified','$'
;mess14DB0b3h,'NoModified','$'
mess15DB'editing...pressEsccanescape','$'
mess16DB'IBMPCAssembleLanguageCourseDesign',13,10,'$'
mess17DB'Edit1.0',13,10,'$'
mess18DB'Madebyhaozhiqiangmatenglixiaopengcaipengchenetc.',13,10,'$'
mess19DB'Dec,20,2013',13,10,'$'
mess20DB'Pressanykeystoreturn','$'
wennameDB'd:
\wenjian',0,13,10,'$'
;文件相关数据定义
handlerDW0
;菜单数据定义
str_menuDB'File(F1)Edit(F3)Help(F4)',13,10,'$'
file_0DB0dah,11DUP(0C4H),0BFH,13,10,'$'
file_1DB0B3H,'New',0B3H,13,10,'$'
file_2DB0B3H,'Open',0B3H,13,10,'$'
file_3DB0B3H,'Save',0B3H,13,10,'$'
file_4DB0B3H,'Saveas',0B3H,13,10,'$'
file_5DB0B3H,'Exit',0B3H,13,10,'$'
file_6DB0c0H,11DUP(0c4h),0d9H,13,10,'$'
edit_0DB0dah,10DUP(0C4H),0BFH,13,10,'$'
edit_1DB0B3H,'Copy',0B3H,13,10,'$'
edit_2DB0B3H,'cut',0B3H,13,10,'$'
edit_3DB0B3H,'Paste',0B3H,13,10,'$'
edit_4DB0c0H,10DUP(0c4h),0d9H,13,10,'$'
error0DB'OpenFilefailed',13,10,'$'
error1DB'thefilehaveillegalcharacter',13,10,'$'
error2DB'thefilehaveillegalcharacter2',13,10,'$'
datedb0B3H,'2013','$'
data_segENDS
;*********************代码段*************8
code_segSEGMENT
ASSUMECS:
code_seg,DS:
data_seg
;************主过程开始**************
start:
MOVAX,data_seg
MOVDS,AX
CALLwelcome
INit:
CALLINitwin
callwin3
GEtchar;读键盘
CMPAH,3bh;F1
JZshowFile
;CMPAH,3ch;F2
;JZshowPlay
CMPAH,3dh;F3
JZshowE
CMPAH,3Eh;F4
JZshowh
CMPAH,01h
JZexitf
JMPINit
showFile:
CALLshowmenuF
JMPINit
;showPlay:
CALLshowMenuP
;JMPINit
showE:
CALLshowMenuE
JMPINit
showh:
CALLshowmenuh
JMPINit
exitf:
MOVAH,4ch
INT21h
;主执行代码结束,下面都是要调用的函数定义.
;***********************************
;**********欢迎模块*****************
welcomePROC
saveE
recover
RET
welcomeENDP
;----------------------------
;***********初始化模块*******
;功能:
初始化屏幕,显示菜单,提示信息,设置工作模式为3号字符模式
;****************************
INitwinPROC
saveE
MOVAH,01h
MOVCH,03h
INT10h;设置为字符模式03
win0,0,24,79,70h;清屏
win1,0,23,79,07h
win2,1,23,78,27H
poscur0,0
showstr_menu
poscur1,0
showpeak;显示上面的横线
;两个循环是画左右两条线的.
MOVCL,23
LOOPf:
poscurCL,0
putcharCHar1
DECCL
CMPCL,1
JNZLOOPf
LOOPf2:
INCCL
poscurCL,79
putcharCHar1
CMPCL,23
JNZLOOPf2
poscur2,1
posgets
CALLshowRC
poscur24,1
showmess12
poscur2,1
recover
RET
INitwinENDP
;*************************************
;蔡鹏程
;************************************
;********文件菜单模块*****************
;功能:
当在主过程或编辑状态检测到F1而被激活的.根据用户的选择来
;执行相应的菜单命令
;入口参数有musicInt:
文件数量,以此来判断是激活save,saveas菜单
;先保存视频缓冲区的内容,再获取键盘输入,按照输入跳到不同的分支,
;每个分支都调用相应的函数来处理.
;to*为当前选中项*的处理分支
;to*&,其中&是数字,为了解决汇编中的一些跳转指令分几次跳的问题,
showmenuFPROC
saveE
CALLsavedisplay
CMPmusicInt,0
JZNOTactive
MOVsaveActive,79h
JMPactiveOK
notactive:
MOVsaveActive,78h
activeOK:
win0,3,0,11,07h
poscur0,0
showstr_menu
win2,3,8,15,saveActive;菜单不选中的颜色(白底黑字)
win9,4,9,16,07h;菜单的阴影
win3,16,9,16,07h;菜单的阴影
;显示各个菜单,并设置第一个菜单为默认项,
poscur2,3
showfile_0
poscur3,3
showfile_1
poscur4,3
showfile_2
poscur5,3
showfile_3
poscur6,3
showfile_4
poscur7,3
showfile_5
poscur8,3
showfile_6
;to*为当前选中项*的处理分支
tonew:
win7,4,7,14,79h;
poscur7,3
showfile_5
win4,4,4,14,79h
poscur4,3
showfile_2
win3,4,3,14,67h
poscur3,3
showfile_1
showMmess7
GEtchar
CMPAH,50h;若按下键下方向键
JZtoOpen
CMPAH,48H
JZtoexit1
CMPAH,1ch;若按了Enter键
JZNEwfile1
JMPexitfile;其他就返回
toexit1:
JMPtoexit
NEwfile1:
JMPNEwfile
toOpen:
win3,4,3,14,79h
poscur3,3
showfile_1
win5,4,5,14,saveActive
poscur5,3
showfile_3
win4,4,4,14,67h
poscur4,3
showfile_2
showMmess8
GEtchar
CMPAH,50h
JZtoSave
CMPAH,48H
JZtonew1
JMPtonew3
tonew1:
JMPtonew
tonew3:
CMPAH,1ch
JZopenfile1
JMPexitfile
openfile1:
JMPopenfile
toSave:
win4,4,4,14,79h
poscur4,3
showfile_2
win6,4,6,14,saveActive
poscur6,3
showfile_4
win5,4,5,14,67h
poscur5,3
showfile_3
showMmess9
GEtchar
CMPAH,50h
JZtoSaveas
CMPAH,48H
JZtoOpen1
JMPtoopen3
toopen1:
JMPtoopen
toopen3:
CMPAH,1ch
JZsavefile1
JMPexitfile
savefile1:
JMPsavefile
toSaveas:
win5,4,5,14,saveActive
poscur5,3
showfile_3
win7,4,7,14,79h
poscur7,3
showfile_5
win6,4,6,14,67h
poscur6,3
showfile_4
showMmess10
GEtchar
CMPAH,50h
JZtoExit
CMPAH,48h
JZtosave1
JMPtosave3
tosave1:
JMPtosave
tosave3:
CMPAH,1ch
JZsaveasfile1
JMPexitfile
saveasfile1:
JMPsaveasfile
tosaveas1:
JMPtosaveas
toExit:
win6,4,6,14,saveActive
poscur6,3
showfile_4
win3,4,3,14,79h
poscur3,3
showfile_1
win7,4,7,14,67h
poscur7,3
showfile_5
showMmess11
GEtchar
CMPAH,50h
JZtonew2
JMPtonew4
tonew2:
JMPtonew
tonew4:
CMPAH,48h
JZtosaveas3
CMPAH,1ch
JZEXITMusic
JMPexitfile
tosaveas3:
JMPtosaveas1
;****处理不同的分支所调用的不同的函数.****/
NEwfile:
CALLfilenew
JMPexitfile
;播放完毕跳到初始位置
openfile:
CALLfileopen
JMPexitfile
savefile:
CALLfilesave
JMPexitfile
saveasfile:
CALLfilesaveas
JMPexitfile
EXITMusic:
CMPmodifyFlag,0
JNZexitfile20
CALLIFsave
JMPexitMusic
exitfile20:
MOVAX,4C00h
INT21h
exitfile:
CALLmenuHide
CALLBackDisplay
recover
poscurrow,column
RET
showmenuFENDP
;*********按下新建菜单时的处理函数******
;入口参数有:
musicInt:
文件数量,一进入即增加1
;先隐藏菜单,并用默认名创建文件,文件名根据musicInt来自动判断并更改
;最后调用函数:
editFile进入编辑状态.
filenewPROC
saveE
MOVmodifyFlag,0
CALLmenuHide
win1,28,1,56,70h;写文件名
MOVSI,8
INCmusicInt
INCwenname[SI]
poscur1,35
showwenname
win2,1,23,78,017h;工作区为蓝底白字
MOVrow,2
MOVcolumn,1
poscurrow,column
CALLEDItfile
recover
RET
filenewENDP
;************文件打开函数*********
;文件操作:
有打开,读取调用
;先提示用户正确输入文件名称,错误时要特殊处理
;
fileopenPROC
saveE
MOVmodifyFlag,1
CALLmenuHide
CALLBackDisplay
CALLsavedisplay
win10,15,12,73,00h
win9,14,11,72,0A4H
poscur10,15
showmess2
CALLCLspath