📄 func.asm
字号:
;func.asm文件包括排序、查找和删除(指定行)功能
include macro.asm
extrn res:byte,tot:byte,tota:word,pag:byte,findf:byte,frow:byte,fstart:byte
public del,sort,find ;删除模块del,排序模块sort,查找模块find
result struc
nam db 11,?,11 dup('$')
num db 7,?,7 dup('$')
asm db 4,?,4 dup('$')
ct db 4,?,4 dup('$')
os db 4,?,4 dup('$')
total db 4 dup('$')
result ends
stacksg segment stack 's'
dw 32 dup('s')
stacksg ends
data segment public
f db 'Enter Student Name:' ;查找提示信息
fl equ $-f
fn db 7,?,7 dup('$') ;查找名字缓冲区
d db 'Enter Deleting Line Number:' ;删除提示信息
dlo equ $-d
dn db 4,?,4 dup('$') ;删除序号缓冲区
temp result <>
t dw ?
i db ?
j db ?
p db ?
data ends
code segment
sort proc far ;排序
assume cs:code,ds:data,es:data,ss:stacksg
mov ax,data
mov ds,ax
mov es,ax
mov i,0 ;选择排序法排序
lop1: mov al,tot
sub al,2
cmp i,al
jnb squ
mov al,i
mov p,al
add al,1
mov j,al
lop2: mov al,tot
sub al,1
cmp j,al
jnb l11
lea si,tota
lea di,tota
xor bh,bh
mov bl,p
add si,bx
add si,bx
mov bl,j
add di,bx
add di,bx
mov ax,[di]
cmp [si],ax
jb sas1
l2: inc j
jmp lop2
l11: mov al,p
cmp i,al
jnz sas2
l1: inc i
jmp lop1
sas1: mov al,j
mov p,al
jmp l2
sas2: lea si,tota ;交换总分数组tota中的相应元素
lea di,tota
xor bh,bh
mov bl,p
add si,bx
add si,bx
mov bl,i
add di,bx
add di,bx
mov ax,[si]
mov t,ax
mov ax,[di]
mov [si],ax
mov ax,t
mov [di],ax
ptt: lea bp,res ;交换结构res中的相应数据条目
mov al,p
mov bl,44
mul bl
add bp,ax
lea si,[bp].nam
lea di,temp.nam
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
ptt1: mov byte ptr [di],' '
inc di
loop ptt1
lea di,temp.nam
ass
lea si,[bp].num
lea di,temp.num
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
ptt2: mov byte ptr [di],' '
inc di
loop ptt2
lea di,temp.num
ass
lea si,[bp].asm
lea di,temp.asm
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
ptt3: mov byte ptr [di],' '
inc di
loop ptt3
lea di,temp.asm
ass
lea si,[bp].ct
lea di,temp.ct
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
ptt4: mov byte ptr [di],' '
inc di
loop ptt4
lea di,temp.ct
ass
lea si,[bp].os
lea di,temp.os
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
ptt5: mov byte ptr [di],' '
inc di
loop ptt5
lea di,temp.os
ass
lea si,[bp].total
lea di,temp.total
mov cl,3
xor ch,ch
ptt6: mov byte ptr [di],' '
inc di
loop ptt6
lea di,temp.total
ast
itp: lea bx,res
mov al,i
mov cl,44
mul cl
add bx,ax
lea si,[bx].nam
lea di,[bp].nam
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
itp1: mov byte ptr [di],' '
inc di
loop itp1
lea di,[bp].nam
ass
lea si,[bx].num
lea di,[bp].num
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
itp2: mov byte ptr [di],' '
inc di
loop itp2
lea di,[bp].num
ass
lea si,[bx].asm
lea di,[bp].asm
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
itp3: mov byte ptr [di],' '
inc di
loop itp3
lea di,[bp].asm
ass
lea si,[bx].ct
lea di,[bp].ct
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
itp4: mov byte ptr [di],' '
inc di
loop itp4
lea di,[bp].ct
ass
lea si,[bx].os
lea di,[bp].os
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
itp5: mov byte ptr [di],' '
inc di
loop itp5
lea di,[bp].os
ass
lea si,[bx].total
lea di,[bp].total
mov cl,3
xor ch,ch
itp6: mov byte ptr [di],' '
inc di
loop itp6
lea di,[bp].total
ast
tti: lea si,temp.nam
lea di,[bx].nam
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
tti1: mov byte ptr [di],' '
inc di
loop tti1
lea di,[bx].nam
ass
lea si,temp.num
lea di,[bx].num
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
tti2: mov byte ptr [di],' '
inc di
loop tti2
lea di,[bx].num
ass
lea si,temp.asm
lea di,[bx].asm
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
tti3: mov byte ptr [di],' '
inc di
loop tti3
lea di,[bx].asm
ass
lea si,temp.ct
lea di,[bx].ct
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
tti4: mov byte ptr [di],' '
inc di
loop tti4
lea di,[bx].ct
ass
lea si,temp.os
lea di,[bx].os
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
tti5: mov byte ptr [di],' '
inc di
loop tti5
lea di,[bx].os
ass
lea si,temp.total
lea di,[bx].total
mov cl,3
xor ch,ch
tti6: mov byte ptr [di],' '
inc di
loop tti6
lea di,[bx].total
ast
jmp l1
squ: ret
sort endp
find proc far ;查找(按名字)
assume cs:code,ds:data,es:data,ss:stacksg
mov ax,data
mov ds,ax
mov es,ax
call wnd ;显示查找窗口
mov cx,fl
lea bp,f
int 10h ;显示查找提示信息
mov ah,0ah ;输入欲查找信息
lea dx,fn
int 21h
lea bp,res ;从上次找到的数据条目的下一条数据开始查找(首次查找是从第一条数据起查找)
mov al,fstart
dec al
mov bl,44
mul bl
add bp,ax
mov al,fstart
fn1: cmp al,tot
jnb rfst
lea si,[bp].num
lea di,fn
mov ah,[si+1]
cmp byte ptr [di+1],ah ;比较字符串长度
jz fn2
fb1: add bp,44
inc al
jmp fn1
fn2: mov cl,[si+1] ;若字符串等长,则再比较字符串内容
xor ch,ch
add si,2
add di,2
cld
rep cmpsb
jnz fb1
mov fstart,al ;修改查找起始行号(加1)
add fstart,1
mov ah,tot ;若查找起始行号达到tot,则置1
cmp fstart,ah
jz cfst
bf: xor ah,ah
mov bl,10
div bl
mov pag,al
mov bl,2
mov al,ah
mul bl
add al,1
mov frow,al ;若找到便设置查找行数为查找到的数据行数,查找标志置1
mov findf,1
jmp fqu
cfst: mov fstart,1
jmp bf
fqu: ret
rfst: mov fstart,1
ret
find endp
del proc far ;删除(指定行)
assume cs:code,ds:data,es:data,ss:stacksg
mov ax,data
mov ds,ax
mov es,ax
call wnd ;显示删除窗口
mov cx,dlo
lea bp,d
int 10h ;显示删除提示信息
mov ah,0ah ;输入欲删除数据的行号
lea dx,dn
int 21h
lea si,dn
call td ;将行号转换为10进制数
mov dl,al
xor dh,dh
dec al
lea bp,res
mov bl,44
mul bl
add bp,ax
lopd: cmp tot,dl ;对从输入的行起的每一行,用下一行数据覆盖本行数据,至第(tot-1)行
jna dqu
lea si,[bp+44].nam
lea di,[bp].nam
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as1: mov byte ptr [di],' '
inc di
loop as1
lea di,[bp].nam
ass
lea si,[bp+44].num
lea di,[bp].num
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as2: mov byte ptr [di],' '
inc di
loop as2
lea di,[bp].num
ass
lea si,[bp+44].asm
lea di,[bp].asm
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as3: mov byte ptr [di],' '
inc di
loop as3
lea di,[bp].asm
ass
lea si,[bp+44].ct
lea di,[bp].ct
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as4: mov byte ptr [di],' '
inc di
loop as4
lea di,[bp].ct
ass
lea si,[bp+44].os
lea di,[bp].os
mov cl,[di]
xor ch,ch
sub cx,1
add di,2
as5: mov byte ptr [di],' '
inc di
loop as5
lea di,[bp].os
ass
lea si,[bp+44].total
lea di,[bp].total
mov cl,3
xor ch,ch
as6: mov byte ptr [di],' '
inc di
loop as6
lea di,[bp].total
ast
lea si,tota ;对总分数组也执行同样的覆盖操作
add si,dx
add si,dx
mov di,si
add si,2
mov ax,[si]
mov [di],ax
inc dl
add bp,44
jmp lopd
dqu: lea si,tota ;对总分数组的第tot项数据置0
add si,dx
add si,dx
mov [si],0
dec tot ;条目总数自减
ret
del endp
td proc ;字符转换为10进制数的子函数td
xor al,al
mov bl,10
mov cl,[si+1] ;字符串长度
cmp cl,0
jz td3
dec cl
xor ch,ch
add si,2
cmp cl,0
jz td2
td1: add al,[si]
sub al,30h
mul bl ;从字符串首位置倒数第二位,每位均计入al,并减30h('0'的ASCII值),再乘10
inc si
loop td1
td2: add al,[si] ;最后一位数加入al,并减30h
sub al,30h
td3: ret
td endp
wnd proc far ;绘制输入窗口子函数wnd
mov ah,6
mov al,0
mov bh,70h
mov ch,10
mov cl,10
mov dh,12
mov dl,44
int 10h
mov ah,2
mov bh,0
mov dh,0
mov dl,0
int 10h
mov ah,2
mov cx,10
d0: mov dl,0dh
int 21h
mov dl,0ah
int 21h
loop d0
mov cx,11
d1: mov dl,32
int 21h
loop d1
mov dl,0c9h
int 21h
mov cx,31
d2: mov dl,0cdh
int 21h
loop d2
mov dl,0bbh
int 21h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
mov cx,11
d3: mov dl,32
int 21h
loop d3
mov dl,0bah
int 21h
mov cx,31
d4: mov dl,32
int 21h
loop d4
mov dl,0bah
int 21h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
mov cx,11
d5: mov dl,32
int 21h
loop d5
mov dl,0c8h
int 21h
mov cx,31
d6: mov dl,0cdh
int 21h
loop d6
mov dl,0bch
int 21h
mov ah,13h
mov al,1
mov bh,0
mov bl,70h
mov dh,11
mov dl,13
ret
wnd endp
code ends
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -