⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 archive.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        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 + -