您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页微机原理课程设计-通讯录及文件管理系统

微机原理课程设计-通讯录及文件管理系统

来源:小侦探旅游网


《微机原理与接口技术》课程设计报告

——通讯录管理系统及简单文件管理

一、课程设计目的:

综合运用本课程知识,编写简单小型的应用程序,以复习巩固课堂所学的理论知识,提高程序设计的能力,了解程序设计及运行的机制,对微机系统有更好的认识,为实际应用奠定一定的基础。

二、课程设计时间安排:

第一天:教师布置设计任务,讲解设计要求,提示设计要点。 第二~四天:查阅资料(在图书馆或上网),提出设计方案(2~3个),

对提出的方法作比较以选出性价比最高的设计方法。

第三~七天:画出详细电路图,编写程序,调试程序,得出实验结果并写

出设计报告。

三、任务分析: 3.1 任务要求

 简单的信息管理能力,信息的存储采用文件的形式;  有添加、删除、查找和复制的功能,便于使用者使用;  具有简单的文件管理功能,如问价的复制和删除;  具有比较友好的使用界面;

3.2 方案介绍

对于本题的要求,我选取的一下的解决方案:

一、数据结构的选择:数据结构有线性表和链表两种选择,由于本题中采用文件的形式管理,采用链表程序复杂不好理解,线性表操作简单,但对内存的要求比较高,综合比较,此次设计采用线性表;二、文件的管理:DOS系统功能调用中有关于磁盘文件管理的一系列功能,在仔细阅读和学习之后,对文件的管理有了大致的了解。

以下是从网上查找到的BIOS和DOS部分功能调用:

表1:BIOS系统功能调INT 10H AH 0 2 功 能 设置显示模式 调用参数 AL=02H 返回参数 / 注释 显示模式:80×25 16色文本 用文本坐标下设置光标位置 BH = 页号 DH = 行 DL = 列 6 初始化屏幕或向上滚屏 AL=滚动行数(0—清窗 口)BH = 属性 CH = 左上角行号 CL = 左上角列号 DH = 右下角行号 DL = 右下角列号 BH = 显示页 AL = 字符 BL = 属性 CX = 字符重复次数 9 在光标位置显示字符及其属性

表2:DOS系统功能调INT 21H AH 01 02 07 09 3D 3E 3F 功能 键盘输入并回显 显示输出 键盘输入(无回显) 显示字符串 打开文件 关闭文件 读文件或设备 调用参数 DL=输出字符 DS:DX=串地址 '$'结束字符串 DS:DX=ASCIIZ串地址 AL=0 读 =1 写 =2 读/写 BX=文件代号 DS:DX=数据缓冲区地址 BX=文件代号 CX=读取的字节数 返回参数 AL=输入字符 AL=输入字符 成功:AX=文件代号 错误:AX=错误码 失败:AX=错误码 读成功: AX=实际读入的字节数 AX=0 已到文件尾 读出错:AX=错误码 4C 带返回码结束 AL=返回码

四、软件设计分析:

4.1、数据节点:

由于本题是对个人通讯信息的存取,一个人的通讯信息包括以下几个方面:姓名、电话号码、地址和公司等等,本题只采用这四样信息,若要添加可以直接在数据节点中做响应的修改。如图一所示:一个节点NODE为50字节,其中:Name属性为12字节,Tel属性为12字节,Address属性为12字节,Company属性为14字节,可用以下定义方式定义: STRUCTNODE EQU 32 ;{

Name EQU 0 Tel EQU 12 Address EQU 24 Company EQU 36 ;}

类似于C语言中的结构体类型。

0NODEName0RDATANODE112Tel24Address36Company4950NODE2100NODE3150NODE4 199 图一:节点示意图 图二:线性表示意图

4.2、线性表:

线性表为存储信息的内存空间,首地址为RDATA,最大存储节点数为MAX_RECORD,所以线性表的大小为MAX_RECORD *STRUCTNODE 个字节。按照一个节点、一个节点存取,类似C语言中对结构体的存取。

线性表结构如图二所示。

4.3、整体功能框图:

通讯录管理系统保添打存加印记记记录录录文件

五、主要软件流程图:

5.1、主程序流程图:

打复删开查删制除记找除记记录记记录录文录录文文件件件开始打印主菜单从键盘输入一个数DL > 8YN跳到代码地址为JUMP[DX]处DX=0:退出DX=1:调用添加函数和保存函数DX=2:调用打印函数… …DX=7:调用删除文件函数输入一个字符N字符为Enter键Y

5.2、添加记录:

ADDRECORD保护现场BX指向现存信息的最后一个节点的下一节点COUNT++在RDATA[BX+PNAME]处写入新的名字在RDATA[BX+PTEL]处写入新的号码在RDATA[BX+PADDRESS]处写入新的地址在RDATA[BX+PCOMPANY]处写入新的公司名恢复现场SAVEFILE结束 5.3、保存信息文件: 保护现场3CH号系统功能打开文件40H号功能存储COUNT和RDATA区所有存储的信息3EH号系统功能关闭文件恢复现场结束

六、系统效果图: 6.1开始界面

6.2 添加记录

6.3 输入多个记录

6.4保存记录

6.5查找记录

6.6 删除记录

6.7文件复制

6.8删除文件

七、所有程序代码: 见附录。

八、课程设计心得体会

这次课程设计花了很多时间,本来是想做关于硬件的题目,但是由于各种原因,没有结果。于是决定换了个题目,做软件的题目。之前用C语言写过相似的程序,第一次用汇编语言写比较大的程序,关于文件的那一块没有一点点的了解,只有从网上找到响应的资料,所以花了很多的时间学习这些系统功能。在学习了这些功能后,开始着手写代码,写了很长时间,代码很长,不断调试,不断翻书找资料,将系统功能分解,最后将所有功能组合成一个应用程序,最终调试成功。

这次写程序的经历告诉我:不知道不明白的东西不可怕,可怕的是不去寻找途径去了解、去学习;只要自己付出了努力,就一定会收获成功的。代码长了不可怕,只要自己有信心成功,加上正确的方法,坚持不放弃,仔细分析,仔细调试,就一定会有结果的。

九、参考文献:

朱定华,微机原理、汇编与接口技术,清华大学出版社,2005

附录

所有源代码如下:

stack segment stack 'stack' dw 100 dup(0) stack ends

data segment

BUFFLEN EQU 50

INFOR1 DB 0DH,0AH,0DH,0AH,'Please input the path and the goal file(*:\\*.*):',0DH,0AH,0DH,0AH,'$' INFOR2 DB 0DH,0AH,0DH,0AH,'Please input the path and the source file(*:\\*.*):',0DH,0AH,0DH,0AH,'$' INFOR3 DB 0DH,0AH,0DH,0AH, 'Copysuccess!$',0DH,0AH ERROR1 DB 0DH,0AH,'Can not open the file!',07H,'$' ERROR2 DB 0DH,0AH,'Can not creat the file!',07H,'$' ERROR3 DB 0DH,0AH,'Reading error!',07H,'$'

ERROR4 DB 0DH,0AH,'Writing error!',07H,'$' ; 错误命令提示

HANDLE1 DW 0 HANDLE2 DW 0

BUFFER DB BUFFLEN DB ?

DB BUFFLEN DUP (0) ; 定义一个缓存区

PRINT_HEAD DB 'Name Tel Address Company',0DH,0AH DB

'*****************************************',0DH,0AH,'$' FILE_NAME DB 'D:\\llq\\TeleNote.txt',00H ;save the file path ERROR_CREATE DB 'failed create file...',0DH,0AH,'$' ERROR_WRITE DB 'failed write file...',0DH,0AH,'$' ERROR_OPEN DB 'failed open file...',0DH,0AH,'$' ERROR_READ DB 'failed read file...',0DH,0AH,'$' ERROR_FIND DB 'not found file...',0DH,0AH,'$' FILE_SAVE DB 'saving the file...',0DH,0AH,'$'

FILE_WRITE DB 'write successfully...',0DH,0AH,'$' FILE_OPEN DB 'opening the file...',0DH,0AH,'$' FILE_READ DB 'read successfully...',0DH,0AH,'$' HANDLE DW 0 ;file handle

BACK_MENU DB 'press Enter to main_menu...','$'

MAIN_MENU DB

0dh,0ah,'*************************************************' DB 0dH,0aH,'**************Communication System***************',0dH,0aH,0dH,0aH DB ' (1)ADD (2)PRINT', 0dH, 0aH, 0dH, 0aH DB ' (3)SAVE (4)OPEN', 0dH, 0aH, 0dH, 0aH DB ' (5)FIND (6)DELETE', 0dH, 0aH, 0dH, 0aH DB ' (7)COPY FILE (8)DELETE FILE', 0dH, 0aH, 0dH, 0aH DB ' (0)EXIT ',0dH, 0aH DB

0dh,0ah,'*************************************************',0dh,0ah,0dh,0ah DB 'Please Enter a Number:$' JUMP DW JUMP_EXIT DW JUMP_ADD DW JUMP_PRINT DW JUMP_SAVE DW JUMP_OPEN DW JUMP_FIND DW JUMP_DELETE DW JUMP_COPY DW JUMP_DEL_FILE

NUM_GET DB 0 ;get an integer

NUM_STRING DB 32,0,32 DUP(0) ;get a string

STRUCTNODE EQU 50 ;保存记录节点 PNAME EQU 0 ;姓名区域 PTEL EQU 12 ;号码区域 PADDRESS EQU 24 ;地址区域 PCOMPANY EQU 36

BUF_STRING DB 12,0, 12 DUP(0) ;输入字符串存储区

INPUT_NAME DB 'Name:$' INPUT_TEL DB 'Tel:$'

INPUT_ADDRESS DB 'Address:$'

INPUT_COMPANY DB 'Company:$'

MAX_RECORD EQU 10 ;保存最大记录量

RDATA DB (STRUCTNODE*MAX_RECORD) DUP(0) ;记录存储区域 COUNT DB 0 ;已经保存的记录数 data ends

code segment start proc far

assume ss:stack,cs:code,ds:data push ds sub ax,ax push ax mov ax,data mov ds,ax

;........................................... ;打印菜单

PRINT_MENU: ;打印主菜单 MOV DX,OFFSET MAIN_MENU MOV AH,09H INT 21H CALL GET_NUMBER ;输入一个整数,存入DL中 CALL HUANHANG ;回车换行 CMP DL,8 JA PRINT_MENU ;如果输入的数大于6,继续回到主菜单 MOV DH,0 MOV DI,DX ;DHDL值给DI SHL DI,1 ;DI乘以2 JMP JUMP[DI] ;跳转到相应的目录 JMP PRINT_MENU

JUMP_EXIT: ;退出 RET JUMP_ADD: CALL ADDRECORD ;添加记录

CALL SAVERECORD ;保存记录 JMP FINISH JUMP_PRINT: CALL PRINTRECORD ;打印记录 JMP FINISH JUMP_SAVE: CALL SAVERECORD ;保存记录 JMP FINISH JUMP_OPEN: CALL READRECORD ;从文件读记录 CALL PRINTRECORD ;打印记录 JMP FINISH JUMP_FIND: CALL FINDRECORD ;通过名字查找记录 JMP FINISH JUMP_DELETE: CALL DELECTRECORD ;通过名字删除记录 CALL PRINTRECORD ;打印记录 CALL SAVERECORD ;保存记录 JMP FINISH JUMP_COPY: CALL COPYFILE JUMP_DEL_FILE: FINISH: ;处理完一项功能后的统一的出口 CALL HUANHANG ;回车换行 MOV DX,OFFSET BACK_MENU ;打印是否回到主菜单 MOV AH,9 INT 21H MOV AH,8 ;8号功能,输入一个字符 INT 21H CMP AL,0DH ;比较该字符是否是回车符 JE PRINT_MENU ;是回车符则打印主菜单 JMP FINISH ;不是则继续打印返回信息 ret start endp

;sub procedure

;======================================================= ;子程序:回车换行

;======================================================= HUANHANG PROC PUSH DX PUSH AX

MOV DL,0DH ;打印回车字符 MOV AH,2 INT 21H

MOV DL,0AH ;打印换行字符 MOV AH,2 INT 21H

POP AX POP DX RET

HUANHANG ENDP

;======================================================= ;输入一个整数,用来选择菜单 ;输入参数:无

;输出参数:输入值的十六进制数放入DL中

;======================================================= GET_NUMBER PROC PUSH AX PUSH BX PUSH CX PUSH DI

;读入一串字符

MOV DX,OFFSET NUM_STRING MOV AH,10 INT 21H

MOV DI,1 MOV CH,0

MOV CL,NUM_STRING[DI] ;字符串长度存入CX中 MOV AL,0 MOV BL,10 AGAIN:

MUL BL INC DI

MOV AH,NUM_STRING[DI] AND AH,0FH ADD AL,AH LOOP AGAIN ;循环得到输入字符串对应的十六进制数的值

MOV DL,AL

MOV NUM_GET,AL

POP DI POP CX POP BX POP AX RET

GET_NUMBER ENDP

;======================================================= COPYFILE PROC PUSH AX ;保护现场 PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI

MOV DX,OFFSET INFOR2

CALL DMESS ; 调用DMESS子程序

MOV DX,OFFSET BUFFER

MOV AH,0AH ; 输入字符串 INT 21H

CALL NEWLINE ; 调用 NEWLINE子程序

LEA SI,BUFFER ; 将BUFFER的有效地址传个SI MOV AL,[SI+1]

XOR AH,AH ; AH清零 ADD SI,2 ; 调整指针 ADD SI,AX

MOV BYTE PTR [SI],0

MOV DX,OFFSET BUFFER+2 ; 将BUFFER+2的有效地址传给DX

MOV AX,3D00H INT 21H

JNC OPENOK ; 进位标志被清转移到OPENOK

MOV DX,OFFSET ERROR1 CALL DMESS JMP OVER

OPENOK: MOV HANDLE1,AX MOV DX,OFFSET INFOR1 CALL DMESS

MOV DX,OFFSET BUFFER MOV AH,0AH INT 21H

CALL NEWLINE

LEA SI,BUFFER ; 将BUFFER的有效地址传给SI MOV AL,[SI+1] XOR AH,AH ADD SI,2 ADD SI,AX

MOV BYTE PTR [SI],0

MOV DX,OFFSET BUFFER+2 MOV CX,0

MOV AH,3CH INT 21H

JNC CREAOK

MOV BX,HANDLE1

MOV AH,3EH ; 关闭 文件 INT 21H

MOV DX,OFFSET ERROR2 CALL DMESS JMP OVER CREAOK: MOV HANDLE2,AX

CONT: MOV DX,OFFSET BUFFER MOV CX,BUFFLEN MOV BX,HANDLE1

MOV AH,3FH ; 读文件 INT 21H

JC READERR

OR AX,AX ; 进位标志CF清0 JZ COPY_OK MOV CX,AX

MOV BX,HANDLE2

MOV AH,40H ; 写文件 INT 21H

JC WRITERR JMP CONT

READERR:MOV SI,OFFSET ERROR3 CALL DMESS JMP COPY_OK

WRITERR:MOV SI,OFFSET ERROR4 CALL DMESS

COPY_OK:MOV BX,HANDLE1 MOV AH,3EH INT 21H

MOV BX,HANDLE2

MOV AH,3EH ; 关闭文件 INT 21H

MOV DX,OFFSET INFOR3 CALL DMESS

OVER: MOV AH,4CH INT 21H POP DI POP SI POP DX POP CX POP BX POP AX RET

COPYFILE ENDP

;=======================================================

ADDRECORD PROC

PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI

MOV BX,0 MOV CH,0

MOV CL,COUNT CMP CX,0 JE NOLOOP ADDLOOP:

ADD BX,STRUCTNODE LOOP ADDLOOP

NOLOOP: ;无记录存在,BX=0

INC COUNT ;COUNT加一 ;----------------------------------------

MOV DX,OFFSET INPUT_NAME MOV AH,9 INT 21H

MOV DX,OFFSET BUF_STRING MOV AH,0AH

INT 21H MOV SI,1 MOV CH,0

MOV CL,BUF_STRING[SI] INC SI MOV DI,0 COPYNAME:

MOV AL,BUF_STRING[SI]

MOV RDATA[BX+DI+PNAME],AL INC SI INC DI

LOOP COPYNAME

MOV RDATA[BX+11],'$'

CALL HUANHANG

;-----------------------------------------

MOV DX,OFFSET INPUT_TEL MOV AH,9 INT 21H

MOV DX,OFFSET BUF_STRING MOV AH,0AH INT 21H MOV SI,1 MOV CH,0

MOV CL,BUF_STRING[SI] INC SI MOV DI,0 COPYTEL:

MOV AL,BUF_STRING[SI]

MOV RDATA[BX+DI+PTEL],AL INC SI INC DI

LOOP COPYTEL

MOV RDATA[BX+23],'$'

CALL HUANHANG

;-------------------------------------------

MOV DX,OFFSET INPUT_ADDRESS MOV AH,9 INT 21H

MOV DX,OFFSET BUF_STRING MOV AH,0AH INT 21H MOV SI,1 MOV CH,0

MOV CL,BUF_STRING[SI] INC SI

MOV DI,0 COPYADDRESS:

MOV AL,BUF_STRING[SI]

MOV RDATA[BX+DI+PADDRESS],AL INC SI INC DI

LOOP COPYADDRESS

MOV RDATA[BX+35],'$'

CALL HUANHANG

;------------------------------------------------- MOV DX,OFFSET INPUT_COMPANY MOV AH,9 INT 21H

MOV DX,OFFSET BUF_STRING MOV AH,0AH INT 21H MOV SI,1 MOV CH,0

MOV CL,BUF_STRING[SI] INC SI MOV DI,0 COPYCOMPANY:

MOV AL,BUF_STRING[SI]

MOV RDATA[BX+DI+PCOMPANY],AL INC SI INC DI

LOOP COPYCOMPANY

MOV RDATA[BX+49],'$'

CALL HUANHANG POP DI POP SI POP DX POP CX POP BX POP AX

RET

ADDRECORD ENDP

;======================================================= ;打印所有记录函数 ;入:RDATA,COUNT ;出:无

;======================================================= PRINTRECORD PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI

PUSH DI

CALL HUANHANG

MOV DX,OFFSET PRINT_HEAD ;打印表头 MOV AH,09H INT 21H

MOV BX,0 MOV DI,0 MOV CH,0

MOV CL,COUNT ;循环COUNT次 PRINT_LOOP:

MOV DX,OFFSET RDATA ADD DX,BX

ADD DX,PNAME ;姓名 MOV AH,09H INT 21H

MOV DX,OFFSET RDATA ADD DX,BX ADD DX,PTEL ;号码 MOV AH,09H INT 21H

MOV DX,OFFSET RDATA ADD DX,BX

ADD DX,PADDRESS ;地址

MOV AH,09H INT 21H

MOV DX,OFFSET RDATA ADD DX,BX

ADD DX,PCOMPANY ;地址 MOV AH,09H INT 21H

CALL HUANHANG

ADD BX,STRUCTNODE ;BX指向下一个节点位置 LOOP PRINT_LOOP ;返回继续打印

POP DI POP SI POP DX POP CX POP BX POP AX RET

PRINTRECORD ENDP

;======================================================= ;保存记录函数

;入:RDATA,COUNT

;出:记录保存在文件FILE_NAME中

;======================================================= SAVERECORD PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH DI PUSH SI ;CREATE FILE

MOV DX,OFFSET FILE_NAME MOV CX,00H MOV AH,3CH INT 21H

JC SAVE_RECORD_ERROR1

MOV HANDLE,AX ;SAVE COUNT MOV BX,HANDLE MOV CX,1

MOV DX,OFFSET COUNT MOV AH,40H INT 21H

JC SAVE_RECORD_ERROR2 ;SAVING...

MOV DX,OFFSET FILE_SAVE MOV AH,9 INT 21H

;SAVING RECORD... MOV CH,0

MOV CL,COUNT

MOV DX,OFFSET RDATA SAVELOOP: PUSH CX

;写入文件,40H号功能,一次写入32个字节,DX指向保存起始偏移地址

MOV BX,HANDLE

MOV CX,STRUCTNODE MOV AH,40H

INT 21H

JC SAVE_RECORD_ERROR2 ;出错跳转

ADD DX,STRUCTNODE POP CX

LOOP SAVELOOP

SAVE_RECORD_OK: ;保存成功 MOV DX,OFFSET FILE_WRITE MOV AH,9 INT 21H

JMP SAVE_RECORD_CLOSE_FILE SAVE_RECORD_ERROR1: ;出错信息 MOV DX,OFFSET ERROR_CREATE MOV AH,9 INT 21H

JMP EXIT_SAVE_RECORD

SAVE_RECORD_ERROR2: ;出错信息 MOV DX,OFFSET ERROR_WRITE MOV AH,9 INT 21H

JMP EXIT_SAVE_RECORD SAVE_RECORD_CLOSE_FILE: ;关闭文件 MOV AH,3EH

MOV BX,HANDLE INT 21H

EXIT_SAVE_RECORD:

POP SI POP DI POP DX POP CX POP BX POP AX RET

SAVERECORD ENDP

;======================================================= ;从文件读记录函数 ;入:文件FILE_NAME ;出:RDATA,COUNT

;======================================================= READRECORD PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI

PUSH DI ;OPEN FILE.....

MOV DX,OFFSET FILE_NAME MOV AL,0 MOV AH,3DH INT 21H

JC READ_RECORD_ERROR1 MOV HANDLE,AX ;READ COUNT..... MOV AH,3FH

MOV BX,HANDLE MOV CX,1

MOV DX,OFFSET COUNT INT 21H

JC READ_RECORD_ERROR2 ;OPENING...

MOV DX,OFFSET FILE_OPEN MOV AH,9 INT 21H

;READ RECORD... MOV CH,0

MOV CL,COUNT

MOV DX,OFFSET RDATA READLOOP: PUSH CX

;从文件读记录,一次32个字节,DX指向读出后存储的区域 MOV BX,HANDLE

MOV CX,STRUCTNODE MOV AH,3FH INT 21H

JC READ_RECORD_ERROR2 ;出错跳转

ADD DX,STRUCTNODE POP CX

LOOP READLOOP

READ_RECORD_OK: ;读出成功 MOV DX,OFFSET FILE_READ MOV AH,9 INT 21H

JMP READ_RECORD_CLOSE_FILE READ_RECORD_ERROR1: ;读出错误 MOV DX,OFFSET ERROR_OPEN MOV AH,9 INT 21H

JMP EXIT_READ_RECORD READ_RECORD_ERROR2: ;读出错误 MOV DX,OFFSET ERROR_READ MOV AH,9

INT 21H

JMP EXIT_READ_RECORD READ_RECORD_CLOSE_FILE: ;关闭文件 MOV AH,3EH

MOV BX,HANDLE INT 21H

EXIT_READ_RECORD:

POP DI POP SI POP DX POP CX POP BX POP AX RET

READRECORD ENDP

;======================================================= ;查找函数

;入口参数:BUF_STRING,RDATA,COUNT ;出口参数:与BUF_STRING相同名字的记录

;======================================================= FINDRECORD PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ;输入姓名...

MOV DX,OFFSET INPUT_NAME MOV AH,9 INT 21H

MOV DX,OFFSET BUF_STRING MOV AH,0AH INT 21H

MOV BX,0 MOV CH,0

MOV CL,COUNT

FIND_LOOP:

CALL TEST_SAME ;调用检测是否相同 的函数 CMP AL,1 JE FOUND ;找到跳出

ADD BX,STRUCTNODE ;没有找到继续找 LOOP FIND_LOOP JMP NOTFOUNT FOUND: ;找到后打印 CALL HUANHANG

MOV DX,OFFSET RDATA ADD DX,BX

ADD DX,PNAME MOV AH,09H INT 21H

MOV DX,OFFSET RDATA ADD DX,BX ADD DX,PTEL MOV AH,09H INT 21H

MOV DX,OFFSET RDATA ADD DX,BX

ADD DX,PADDRESS MOV AH,09H INT 21H

MOV DX,OFFSET RDATA ADD DX,BX

ADD DX,PCOMPANY MOV AH,09H INT 21H

CALL HUANHANG JMP EXIT_FIND NOTFOUNT: ;没有找到,打印NOT FOUNT... CALL HUANHANG

MOV DX,OFFSET ERROR_FIND MOV AH,9 INT 21H

EXIT_FIND:

POP DI POP SI POP DX POP CX POP BX POP AX RET

FINDRECORD ENDP

;================================ ;检测两字符串是否相同,

;入口参数:BUF_STRING,RDATA,COUNT ;出口参数:AL=1,相同,AL=0,不相同 ;================================ TEST_SAME PROC PUSH CX

MOV SI,1 MOV DI,0 MOV CH,0

MOV CL,BUF_STRING[SI] INC SI SAME_LOOP:

MOV DL,BUF_STRING[SI]

CMP DL,RDATA[BX+DI+PNAME] JNE NOT_SAME INC SI INC DI

LOOP SAME_LOOP IS_SAME: MOV AL,1

JMP EXIT_TEST NOT_SAME: MOV AL,0 EXIT_TEST:

POP CX RET

TEST_SAME ENDP

;======================================================= ;从文件删除记录

;入口参数:BUF_STRING,RdATA,COUNT

;出口参数:文件中删除与BUF_STRING相同名字的记录

;======================================================= DELECTRECORD PROC PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI

MOV DX,OFFSET INPUT_NAME MOV AH,9 INT 21H

MOV DX,OFFSET BUF_STRING MOV AH,0AH INT 21H

MOV AH,0 MOV BX,0 MOV CH,0

MOV CL,COUNT FIND_LOOPX:

CALL TEST_SAME ;调用检测是否相同函数 CMP AL,1

JE FOUNDX ;相同则找到 ADD BX,STRUCTNODE LOOP FIND_LOOPX INC AH

JMP NOTFOUNTX ;没有找到 FOUNDX: ;找到,删除记录 DEC COUNT MOV CL,COUNT SUB CL,AH MOV CH,0

MOV DX,0 TOTAL_LEFT: ;剩余的所有字节数 ADD DX,STRUCTNODE LOOP TOTAL_LEFT MOV CX,DX

MOV SI,BX MOV DI,BX

ADD DI,STRUCTNODE SHIFT_RDATA: ;将找到节点后的所有字节前移32字节,覆盖找到的节点

MOV AL,RDATA[DI] MOV RDATA[SI],AL INC SI INC DI

LOOP SHIFT_RDATA

MOV CX,STRUCTNODE CLEAR_LAST: ;将最后一字节点清零 MOV RDATA[SI],0 INC SI

LOOP CLEAR_LAST

JMP EXIT_FINDX NOTFOUNTX: ;没有找到,打印信息 CALL HUANHANG

MOV DX,OFFSET ERROR_FIND MOV AH,9 INT 21H EXIT_FINDX:

POP DI POP SI POP DX POP CX POP BX POP AX RET

DELECTRECORD ENDP

;======================================================= DMESS PROC

MOV AH,9 INT 21H

RET DMESS ENDP

NEWLINE PROC

PUSH AX PUSH DX MOV DL,0DH

MOV AH,2 INT 21H

MOV DL,0AH MOV AH,2 INT 21H POP DX POP AX RET NEWLINE ENDP

;........................................... code ends end start

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务