📄 archive.asm
字号:
EchoString 1,0dh,0,VBirthday,DAYLEN
EchoString 1,0fh,0,buffer.Birthday,LENDAY
EnCRLF Crlf
EchoString 1,0dh,0,VNative,NATIVELEN
EchoString 1,0fh,0,buffer.Native,LENNATIVE
EnCRLF Crlf
EchoString 1,0dh,0,VID,IDLEN
EchoString 1,0fh,0,buffer.ID,LENID
EnCRLF Crlf
EchoString 1,0dh,0,VStatement,STATEMENTLEN
EchoString 1,0fh,0,buffer.Statement,LENSTA
EnCRLF Crlf
cmp count,2
jae escinput
jmp echoagain
escinput:
cmp EntryPort ,2;转移到调用者那里,下同。
je returnmodify
cmp EntryPort ,3
je returndelete
cmp EntryPort ,4
jae returnfind
EchoString 1,0dh,0,AnyKey,ANYKEYLEN
mov ah,0
int 16h
cmp al,ESCKEY
jz enddisexit
mov count,0
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
jmp echoagain
tail:
EchoString 1,04ah,0,Tailquest,FILETAILLEN;文件指针到尾。
mov ah,0
int 16h
enddisexit:
mov count,0;恢复初值,下同。
mov EntryPort ,0
FPMove 0,0,File;Move to head
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
mov eax,0;返回码。
ret
DisplayAll endp
Append proc near
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
cmp Filetemp,0ffh;空文件时,必须追加记录。
jnz accappend;文件不为空时,累积追加
push File
pop Filetemp;有记录内容时,恢复文件号。
mov ax,1;空文件时追加的第一条记录,记录号为1。
mov CurRecNo,ax
conapp:;继续追加或者删除、修改的子程序的入口。
ClearBuffer Buffer,RECORDERLEN
cmp EntryPort ,3;当删除调用这个子程序时,文件中的记录内容清全部0。
je del
cmp EntryPort, 5;查询时选择删除时同上。
je del
cld;以下是置Buffer缓冲区的内容,这些内容要写到文件中去。
lea bx,BtoDBuffer
mov ax,CurRecNo
call BtoD
mov al,'0'
lea di,BtoDBuffer
repz scasb
dec di
push di
EchoString 1,0dh,0,VRecNo,RECNOLEN
pop di
mov ah,9
mov dx,di
int 21h
mov ax,CurRecNo
mov buffer.RecNo,ax
EnCRLF Crlf
EchoString 1,0dh,0,VSurName,NAMELEN
lea dx,BSurName
mov ah,0ah
int 21h
xor cx,cx
mov cl,[BSurName+1]
lea di,buffer.SurName
lea si,BSurName
add si,2
rep movsb
EnCRLF Crlf
EchoString 1,0dh,0,VSex,SEXLEN
lea dx,BSex
mov ah,0ah
int 21h
cmp [BSex+2],'0'
jz shiftfemales
mov buffer.Sex,TRUE
jmp shiftsex
shiftfemales:性别转换为逻辑值。
mov buffer.Sex,FALSE
shiftsex:
EnCRLF Crlf
EchoString 1,0dh,0,VBirthday,DAYLEN
lea dx,BBirthday
mov ah,0ah
int 21h
xor cx,cx
mov cl,[BBirthday+1]
lea di,buffer.Birthday
lea si,BBirthday
add si,2
rep movsb
EnCRLF Crlf
EchoString 1,0dh,0,VNative,NATIVELEN
lea dx,BNative
mov ah,0ah
int 21h
xor cx,cx
mov cl,[BNative+1]
lea di,buffer.Native
lea si,BNative
add si,2
rep movsb
EnCRLF Crlf
EchoString 1,0dh,0,VID,IDLEN
lea dx,BID
mov ah,0ah
int 21h
xor cx,cx
mov cl,[BID+1]
lea di,buffer.ID
lea si,BID
add si,2
rep movsb
EnCRLF Crlf
EchoString 1,0dh,0,VStatement,STATEMENTLEN
lea dx,BStatement
mov ah,0ah
int 21h
xor cx,cx
mov cl,[BStatement+1]
lea di,buffer.Statement
lea si,BStatement
add si,2
rep movsb
EnCRLF Crlf
del:
cmp EntryPort,2
jb retcurrentpot
FPMove 1,-RECORDERLEN,File;如果是由修改、删除、查询子程序调用的话,恢复文件指针于当前记录上。
retcurrentpot:
mov bx,File
mov cx,RECORDERLEN
lea dx,buffer
mov ah,40h
int 21h
cmp EntryPort,2;返回到各调用点。
jz Modify
cmp EntryPort,3
jz Delete
cmp EntryPort,4
jae findagain;转移到查询子程序中。
EchoString 1,0dh,0,AppQuest,QUESTLEN
ReadCursor
mov CurCursor,dx
y&ninput:
SetCursor dh,dl
mov ah,1
int 21h
cmp al,'y'
jz another;接着追加记录。
cmp al,'Y'
jz another
cmp al,'n'
jz endappexit
cmp al,'N'
jz endappexit
mov dl,7
mov ah,6
int 21h
mov dx,CurCursor
jmp y&ninput
another:
mov dx,CurCursor
cmp dh,17
jae scroll
EnCRLF Crlf
jmp accappend
scroll:
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
accappend:;文件不为空时,累积追加的入口。
FPMove 2,-RECORDERLEN,File;文件指针指向最后一条记录。
FileRead RECORDERLEN,buffer,File
noeffect:
cmp buffer.recno,0
jnz effectrecno
FPMove 1,-RECORDERLEN,File
FileRead RECORDERLEN,buffer,File
cmp buffer.RecNo,0
jnz effectrecno
FPMove 1,-RECORDERLEN,File;最后一条记录如是逻辑删除,则必须要后退到正确的记录号上来。
jmp noeffect
effectrecno:
mov ax,buffer.RecNo
inc ax
mov CurRecNo,ax
jmp conapp
endappexit:
mov count,0
mov EntryPort ,0
FPMove 0,0,File;Move to head
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
mov eax,0
ret
Append endp
Modify proc near
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
mov EntryPort, 2
mov count ,1
jmp near ptr echoagain
returnmodify:
EchoString 1,0dh,0,ModifyQuest,MODIFYLEN
EnCRLF Crlf
mov ah,0
int 16h
cmp al,'y'
jz conapp
cmp al,'Y'
jz conapp
cmp al,ESCKEY
jz endmodifyexit
mov count,1
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
jmp echoagain
endmodifyexit:
mov count,0
mov EntryPort ,0
FPMove 0,0,File;Move to head
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
mov eax,0
ret
Modify endp
Delete proc near;逻辑删除。
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
mov EntryPort, 3
mov count ,1
jmp near ptr echoagain
returndelete:
EchoString 1,0dh,0,DeleteQuest,DELETELEN
EnCRLF Crlf
mov ah,0
int 16h
cmp al,'y'
jz conapp
cmp al,'Y'
jz conapp
cmp al,ESCKEY
jz enddeleteexit
mov count,1
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
jmp echoagain
enddeleteexit:
mov count,0
mov EntryPort ,0
FPMove 0,0,File;Move to head
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
mov eax,0
ret
Delete endp
Find proc near
FPMove 0,0,File;Move to head
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
mov count ,1
mov EntryPort, 4
EchoString 1,0dh,0,FindIdea,IDEALEN;查询方式提示。
EnCRLF Crlf
EchoString 1,0dh,0,VSurName,NAMELEN;查询内容。
lea dx,FindSurName
mov ah,0ah
int 21h
xor cx,cx
mov cl,[FindSurName+1]
mov bx,cx
mov byte ptr [FindSurName+2][bx],0;在输入的查询内容最后置0,以保证与buffer.SurName内容的绝对匹配。
inc cx
mov FinStrLen,cx;多比较一个0值。
findagain:;查询是否有相同的内容。
ClearBuffer Buffer,RECORDERLEN
ScrollUp 0,0Fh,5,0,24,79
SetCursor 5,0
mov count ,1
mov EntryPort, 4
FileRead RECORDERLEN,buffer,File
cmp ax,0
jz findtail
mov ax,buffer.RecNo
mov CurRecNo,ax
lea si,FindSurName+2
lea di,buffer.SurName
mov cx,FinStrLen
compare:
mov al,[si]
cmp al,[di]
jne findagain;不匹配时,立即转移,读一下条记录。
inc si
inc di
loop compare
FPMove 1,-RECORDERLEN,File;文件指针返回到查询命中的记录上。
jmp echoagain
returnfind:
EchoString 1,0dh,0,ModDelQuest,MDLEN
EnCRLF Crlf
mov ah,0
int 16h
cmp al,'m'
jz conapp;转移到追加记录子程序的相应入口处。
cmp al,'M'
jz conapp
cmp al,'d'
jz logicdel
cmp al,'D'
jz logicdel
cmp al,ESCKEY
jz endfindexit
mov count,1
ScrollUp 0,0Fh,5,0,24,79
SetCursor 5,0
jmp findagain;查询记录中是否有相同内容。
logicdel:
mov EntryPort,5;转移到追加记录子程序的相应入口处前,通知它逻辑删除当前记录。
jz conapp
findtail:
EchoString 1,04ah,0,FindTailquest,FINDTAILLEN
mov ah,0
int 16h
cmp al,'Y'
jz Find;文件指针已到达尾部,是否接着重新查询?
cmp al,'y'
jz find
endfindexit:
mov count,0
mov EntryPort ,0
FPMove 0,0,File;Move to head
ScrollUp 0,0Fh,3,0,24,79
SetCursor 3,0
mov eax,0
ret
Find endp
BtoD proc near;二进制转换为十进制
mov si,5
mov cx,10
store:
xor dx,dx
div cx
add dl,30h
dec si
mov [bx][si],dl
or si,si
jnz store
ret
BtoD endp
Seg_Code ends
End start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -