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

📄 func.asm

📁 学生成绩管理系统
💻 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 + -