汇编写的基于DOS窗口的记事本
来源:互联网 发布:定制棕垫 知乎 编辑:程序博客网 时间:2024/05/17 06:47
好久没更blog了,微机原理要一个汇编大作业。经过两天的预习。写了一个记事本。其中有很多漏洞,不过勉强能用。
环境:Masm for Windows 2012.5【64位】
实现功能:
1、创建文件
2、编辑文件
3、读文件
4、删除文件
主要思想:
太简单了,没有什么思想orz。
Talk is cheap , show me your code.【代码不是一般的丑,改改应该可以改成2、300行的代码,但是还有好几门要预习的课,就不修改了【扑哧】】
DATAS SEGMENT STR1 DB '成功创建文件$' SYMBOL DB 20H, 08H,0AH,24H BUFFER DB 300 DUP(?) FILENAME DB 300 DUP(?) CREATE DB 'create$' DELETE DB 'delete$' READ DB 'read$' EDIT DB 'edit$' SUCCESS DB 'success$' FAIL DB 'fail$' STEP DB 'STEP1$' NOSTEP DB 'NOSTEP$' FILESUCCESSMESSAGE DB 'create file successfully!$' FILEFAILMESSAGE DB 'create file failly!$' ERRORFAILMESSAGE DB 'cant find this command!$' READSUCCESSMESSAGE DB 'read file successfully$' READFAILMESSAGE DB 'read file failly$' DELETESUCCESSMESSAGE DB 'delete file successfully$' FLAG DB ? COMMAND DB ? HANDLE DW ? COUNT DW ? TOKENFLAG DW ?DATAS ENDSSTACKS SEGMENT DB 100 DUP(?)STACKS ENDS ESGE SEGMENT ESGE ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS, ES:ESGESTART: MOV AX,DATAS MOV DS,AX MOV SI, 0;SI置零 MOV COUNT, 0;COUNT置零LOP: MOV AH, 01H INT 21H;回显输入单个字符 ;---------------------------------------------------------------- CMP AL, [SYMBOL] JZ TOKEN;判断是否是空格,如果是空格则跳转到TOKEN ;---------------------------------------------------------------- CMP AL, [SYMBOL+1];判断是否是DEl键,如果是则将SI减1,并重新输出 MOV FLAG, 00H;将FLAG置零,DELETECALL可以返回到LOP JZ DELETECALL ;---------------------------------------------------------------- MOV [BUFFER+SI], AL;如果不是空格和退格将字符存入缓冲区 ADD SI, 1 ADD COUNT, 1 LOOP LOP;循环LOP2: MOV AH, 01H INT 21H;回显输入单个字符 ;---------------------------------------------------------------- CMP AL, [SYMBOL+1];判断是否是DEl键,如果是则将SI减1,并重新输出 MOV FLAG, 03H;将FLAG置零,DELETECALL可以返回到LOP JZ DELETECALL ;---------------------------------------------------------------- CMP AL, [SYMBOL+3];判断是否是退出编辑键 JZ KEEPFILE ;---------------------------------------------------------------- MOV [BUFFER+SI], AL;如果不是空格和退格将字符存入缓冲区 ADD SI, 1 ADD COUNT, 1 LOOP LOP2;循环TOKEN: SUB COUNT, 1 SUB SI, 1;0-SI是字符串内容 ;识别单个词法单元【命令】,然后继续识别 ;MOV [BUFFER+SI], 24H ;LEA DX, BUFFER ;MOV AH, 09H ;INT 21H ;显示指令 ;---------------------------------------------------------------- ;识别是否是'create'指令TOKENCREATE: CMP SI, 05H ;判断长度,如果不是6则跳转到TOKENEDIT JNZ TOKENREAD MOV CX, SI MOV AX, DATAS MOV DS, AX MOV ES, AX LEA SI, BUFFER LEA DI, CREATE REPZ CMPSB MOV COMMAND,00H JZ INPUTFILENAME;如果是'create'则跳转 JNZ TOKENDELETE;如果不是则跳转到'TOKENDELETE' ;---------------------------------------------------------------TOKENREAD: CMP SI, 03H JNZ ERRORCALL MOV CX, SI MOV AX, DATAS MOV DS, AX MOV ES, AX LEA SI, BUFFER LEA DI, READ REPZ CMPSB MOV COMMAND,01H JZ INPUTFILENAME;是读命令则跳转到输入“文件名字” JNZ TOKENEDIT;不是则跳转到"TOKENEDIT"TOKENEDIT: MOV AX, 03H MOV SI, AX CMP SI, 03H JNZ ERRORCALL MOV CX, SI MOV AX, DATAS MOV DS, AX MOV ES, AX LEA SI, BUFFER LEA DI, EDIT REPZ CMPSB MOV COMMAND, 02H JZ INPUTFILENAME;是编辑命令则跳转到输入“文件名字” JNZ ERRORCALL;如果不是则跳转到'ERRORCALL'TOKENDELETE: MOV SI, 05H MOV CX, SI MOV AX, DATAS MOV DS, AX MOV ES, AX LEA SI, BUFFER LEA DI, DELETE REPZ CMPSB MOV COMMAND,03H JZ INPUTFILENAME;如果是'create'则跳转 JNZ ERRORCALL;如果不是则跳转到'ERROECALL'DELETECALL: CMP COUNT, 00H JZ S0 CMP COUNT, 01H SUB SI, 1 SUB COUNT, 1 JZ S1 JNZ S2 ;----------------------------------------------------------------S0: MOV BH, 00H MOV AH, 03H INT 10H ;得到光标的位置 ;---------------------------------------------------------------- JZ NEXT1S1: MOV [BUFFER+SI], 24H;将光标前一个位置设为终结符 ;---------------------------------------------------------------- MOV DL, 20H MOV AH, 02H INT 21H MOV BH, 00H MOV AH, 03H INT 10H ;得到光标的位置 ;---------------------------------------------------------------- SUB DL, 1 MOV AH, 02H INT 10H JZ NEXT1S2: MOV [BUFFER+SI], 24H;将光标前一个位置设为终结符 ;---------------------------------------------------------------- MOV DL, 20H MOV AH, 02H INT 21H ;输出空格覆盖删掉的字符 ;---------------------------------------------------------------- MOV BH, 00H MOV AH, 03H INT 10H ;得到光标的位置 ;---------------------------------------------------------------- MOV AX, DX MOV AH, 00H SUB AX, 1 MOV DL, 4FH DIV DL ;判断光标位置是否是4F的倍数 ;获得当前光标位置,调用参数BH=页号 ;返回参数CH = 光标开始行,C L= 光标结束行 ;返回参数DH = 行, DL = 列 ;---------------------------------------------------------------- CMP AH, 00H JZ STEP1 JNZ STEP2STEP1: MOV BH, 00H MOV AH, 03H INT 10H ;得到光标的位置 ;---------------------------------------------------------------- SUB DH, 01H ADD DL, 4EH MOV AH, 02H INT 10H MOV DL, 20H MOV AH, 02H INT 21H ;回到上一行的末尾 MOV BH, 00H MOV AH, 03H INT 10H ;得到光标的位置 ;---------------------------------------------------------------- SUB DH, 01H ADD DL, 4FH MOV AH, 02H INT 10H JMP NEXT1 ;光标位置已经为0,退行,列为终点 ;----------------------------------------------------------------STEP2: MOV BH, 00H MOV AH, 03H INT 10H ;得到光标的位置 ;---------------------------------------------------------------- SUB DL, 01H MOV AH, 02H INT 10H ;列减一 ;----------------------------------------------------------------NEXT1: CMP FLAG, 00H JZ LOP CMP FLAG, 01H JZ LOP1 CMP FLAG, 03H JZ LOP2 MOV AH, 4CH INT 21H ;回到循环位置 ;----------------------------------------------------------------INPUTFILENAME: MOV CX, SI MOV SI, 00HZERO: MOV [BUFFER+SI], 00H ADD SI, 1 SUB CX, 1 CMP CX, 00H JNZ ZERO MOV SI, 0 MOV COUNT, 0 ;缓冲区清零LOP1: MOV AH, 01H INT 21H ;回显输入单个字符 CMP AL, 0DH JNZ SWITCH2SWITCH1: CMP COMMAND, 00H JZ CREATEFILE CMP COMMAND,01H JZ READFILE CMP COMMAND, 02H JZ EDITFILE CMP COMMAND, 03H JZ DELETEFILE MOV AH, 4CH INT 21HSWITCH2: CMP AL, [SYMBOL+1];判断是否是DEl键,如果是则将SI减1,并重新输出 MOV FLAG,01H;将FLAG置01H,使DELETECALL可以返回到LOP1 JZ DELETECALL ;---------------------------------------------------------------- MOV [BUFFER+SI], AL;将字符存入缓冲区 ADD SI, 1 ADD COUNT, 1 LOOP LOP1;循环 MOV AH, 4CH INT 21HCREATEFILE: MOV [BUFFER+SI], 24H LEA DX, BUFFER MOV CX, 00H MOV AH, 3CH INT 21H ;根据字符串内容创建文件 MOV HANDLE, AX JC FAILCREATEFILE JNC SUCCESSCREATEFILE ;如果成功创建则输出成功信息 ;-----------------------------------------------------------------READFILE: MOV [BUFFER+SI], 24H LEA DX, BUFFER MOV AL, 02H MOV AH, 3DH INT 21H ;获得文件句柄,打开文件 ;----------------------------------------------------------------- MOV HANDLE, AX MOV BX, AX LEA DX, BUFFER MOV CX, 100 MOV AH, 3FH INT 21H ;读文件 MOV BX, AX MOV BUFFER[BX], 24H LEA DX, BUFFER MOV AH, 09H INT 21H MOV DL, 0AH MOV AH, 02H INT 21H ;显示文件 ;----------------------------------------------------------------- MOV BX, HANDLE MOV AH, 3EH INT 21H ;关闭文件 ;----------------------------------------------------------------- JMP SUCCESSREADFILE MOV AH, 4CH INT 21HEDITFILE: MOV [BUFFER+SI], 24H MOV CX, SI MOV AX, DATAS MOV DS, AX MOV ES, AX LEA SI, BUFFER LEA DI, FILENAME REP MOVSB ;保留文件名字 LEA DX, BUFFER MOV AL, 02H MOV AH, 3DH INT 21H ;获得文件句柄,打开文件 ;----------------------------------------------------------------- MOV CX, SI MOV SI, 0ZERO0: MOV [BUFFER+SI], 00H SUB CX, 1 ADD SI, 1 CMP CX, 00H JNZ ZERO0 ;缓冲区清零 MOV SI, 0 MOV COUNT, 0 MOV HANDLE, AX MOV BX, AX LEA DX, BUFFER MOV CX, 100 MOV AH, 3FH INT 21H ;读文件MAKESUREBYTES: MOV SI, 0LOP4: CMP [BUFFER+SI], 24H JZ NEXT3 CMP [BUFFER+SI], 00H JZ NEXT3 ADD SI, 1 LOOP LOP4NEXT3: MOV [BUFFER+SI], 24H LEA DX, BUFFER MOV AH, 09H INT 21H MOV [BUFFER+SI], 00H MOV COUNT, SI JMP LOP2 MOV AH, 4CH INT 21HKEEPFILE: MOV [BUFFER+SI], 24H LEA DX, FILENAME MOV CX, 02H MOV AH, 3CH INT 21H MOV HANDLE, AX MOV BX, AX LEA DX, BUFFER MOV AH, 40H MOV CX, 100 INT 21H MOV DL, 0AH MOV AH, 02H INT 21H MOV CX, SI MOV SI, 00HZERO6: MOV [BUFFER+SI], 00H SUB CX, 1 ADD SI, 1 CMP CX, 00H JNZ ZERO6 ;缓冲区清零 MOV COUNT, 0 MOV SI, 0 MOV BX, HANDLE MOV AH, 3EH INT 21H ;关闭文件 ;----------------------------------------------------------------- JMP LOP MOV AH, 4CH INT 21HDELETEFILE: MOV [BUFFER+SI], 24H LEA DX, BUFFER MOV AH, 41H INT 21H LEA DX, DELETESUCCESSMESSAGE MOV AH, 09H INT 21H MOV DL, 0AH MOV AH, 02H INT 21H MOV CX, SI MOV SI, 00HZERO5: MOV [BUFFER+SI], 00H SUB CX, 1 ADD SI, 1 CMP CX, 00H JNZ ZERO5 ;缓冲区清零 MOV SI, 0 MOV COUNT,0 JMP LOPSUCCESSCREATEFILE: MOV BX, HANDLE MOV AH, 3EH INT 21H LEA DX, FILESUCCESSMESSAGE MOV AH, 09H INT 21H MOV DL, 0AH MOV AH, 02H INT 21H MOV CX, COUNT MOV SI, 0ZERO3: MOV [BUFFER+SI], 00H SUB CX, 1 ADD SI, 1 CMP CX, 00H JNZ ZERO3 ;缓冲区清零 MOV SI, 0 MOV COUNT, 0 JMP LOP MOV AH, 4CH INT 21H ;输出成功创建文件提示 ;-----------------------------------------------------------------FAILCREATEFILE: LEA DX, FILEFAILMESSAGE MOV AH, 09H INT 21H MOV AH, 4CH INT 21H ;输出失败创建文件提示 ;-----------------------------------------------------------------SUCCESSREADFILE: MOV BX, HANDLE MOV AH, 3EH INT 21H MOV CX, COUNT MOV SI, 0ZERO4: MOV [BUFFER+SI], 00H SUB CX, 1 ADD SI, 1 CMP CX, 00H JNZ ZERO4 ;缓冲区清零 MOV COUNT, 0 MOV SI, 0 JMP LOP MOV AH, 4CH INT 21H ;输出成功读取文件提示 ;-----------------------------------------------------------------FAILREADFILE: LEA DX, READFAILMESSAGE MOV AH, 09H INT 21H MOV AH, 4CH INT 21H ;输出失败读取文件提示 ;-----------------------------------------------------------------ERRORCALL: LEA DX, ERRORFAILMESSAGE MOV AH, 09H INT 21H MOV AH, 4CH INT 21HCODES ENDS END START
3 1
- 汇编写的基于DOS窗口的记事本
- 汇编写的记事本源码
- java写的记事本
- swing写的记事本
- swing写的记事本
- java写的记事本
- 自己写的记事本
- .bat文件打开没出现dos命令窗口,而是变成记事本,或者其他界面的解决办法
- 自己写的JAVA记事本
- MinGW写的简易记事本
- C#写记事本的问题
- java写的记事本程序
- 自己写的javaGUI记事本
- 基于C#的记事本程序
- 基于SQLiteDatabase的记事本例子
- 利用纯汇编写一个WIN32的窗口程序
- 用C++写的三子棋代码(基于DOS界面)
- 用C++写的五子棋代码(基于DOS界面)
- Oracle数据库(七)处理数据
- WM_QUIT消息
- c#——list中元素转化(ConvertAll select foreach)
- 创建单例
- C++中野指针和空指针和无类型指针
- 汇编写的基于DOS窗口的记事本
- Linux命令查看以及编程获取CPU核数
- .html 、.htm 、 .shtml 以及 .shtm 四种扩展名的文件区别
- PCB设计中内层孤岛是什么意思?
- PeekMessage
- android 下载速度Kb/s和Kbps的转换
- MySQL order by的一个优化思路
- iOS 警告消除(收集)
- SendMessage和PostMessage的区别