📄 grade_manage.asm
字号:
; Template for DOS .exe file
win macro opr1,opr2,opr3,opr4,opr5,opr6 ;建立窗口
pushreg
mov ah,6
mov al,opr1
mov bh,opr2
mov ch,opr3
mov cl,opr4
mov dh,opr5
mov dl,opr6
int 10h
popreg
endm
posset macro opr1,opr2,opr3 ;设置光标
push ax
push bx
push dx
mov ah,2
mov bh,opr1
mov dh,opr2
mov dl,opr3
int 10h
pop dx
pop bx
pop ax
endm
posred macro ;读取光标位置,返回:dh所在行,dl所在列
push ax
push bx
push cx
mov ah,3
mov bh,0
int 10h
pop cx
pop bx
pop ax
endm
inchr macro ;读取字符,返回:al,字符值,ah,扫描码
mov ah,0
int 16h
endm
putchr macro opr1 ;输出字符
push dx
push ax
mov ah,2
mov dl,opr1
int 21h
pop ax
pop dx
endm
warn macro ;鸣警
push dx
push ax
mov ah,2
mov dl,07h
int 21h
pop ax
pop dx
endm
outstr macro opr1 ;输出字符串
mov ah,9
lea dx,opr1
int 21h
endm
pushreg macro ;保存寄存器值
push ax
push bx
push cx
push dx
endm
popreg macro ;恢复寄存器值
pop dx
pop cx
pop bx
pop ax
endm
thead macro ;填写表头
posset 0,6,7
outstr stu_num
posset 0,6,18
outstr stu_name
posset 0,6,29
outstr english
posset 0,6,40
outstr math
posset 0,6,51
outstr computer
posset 0,6,62
outstr total
endm
stay macro ;暂停
push ax
mov ah,0
int 16h
pop ax
endm
ahelp macro ;显示HELP
call savedisplay
win 0,57h,7,15,17,65
posset 0,9,22
outstr help1
posset 0,11,18
outstr help2
posset 0,12,18
outstr help3
posset 0,13,18
outstr help4
posset 0,14,53
outstr help5
posset 0,15,53
outstr help6
stay
call backdisplay
endm
afile macro ;显示FILE
call savedisplay
win 0,1ah,1,1,5,10
posset 0,1,2
outstr new
posset 0,2,2
outstr open
posset 0,3,2
outstr save
posset 0,4,2
outstr saveas
posset 0,5,2
outstr exit
win 0,00h,6,2,6,11
win 0,00h,2,11,6,11
posset 0,1,2
mov bl,1
aflp: call bakitem
posset 0,bl,2
call newitem
inchr
cmp ah,48h
jnz afnext1
jmp aflp
afnext1:cmp ah,50h
jnz afnext2
inc bl
cmp bl,5
jna aflp
mov bl,1
jmp aflp
afnext2:cmp al,0
jnz afnext3
call backdisplay
call fuckey
afnext3:cmp al,0dh
jnz afnext4
posred
dec dh
mov dl,dh
xor dh,dh
add dl,dl
lea bx,jmp_file
add bx,dx
jmp [bx]
afnext4:call backdisplay
endm
aedit macro ;显示EDIT
call savedisplay
win 0,1ah,1,11,3,20
posset 0,1,12
outstr eadd
posset 0,2,12
outstr insert
posset 0,3,12
outstr delete
win 0,00h,4,12,4,21
win 0,00h,2,21,4,21
posset 0,1,12
mov bl,1
aelp: call bakitem
posset 0,bl,12
call newitem
inchr
cmp ah,48h
jnz aenext1
jmp aelp
aenext1:cmp ah,50h
jnz aenext2
inc bl
cmp bl,3
jna aelp
mov bl,1
jmp aelp
aenext2:cmp al,0
jnz aenext3
call backdisplay
call fuckey
aenext3:cmp al,0dh
jnz aenext4
posred
dec dh
mov dl,dh
xor dh,dh
add dl,dl
lea bx,jmp_edit
add bx,dx
jmp [bx]
aenext4:call backdisplay
endm
asort macro ;显示SORT
call savedisplay
win 0,1ah,1,21,4,30
posset 0,1,22
outstr english
posset 0,2,22
outstr math
posset 0,3,22
outstr computer
posset 0,4,22
outstr total
win 0,00h,5,22,5,31
win 0,00h,2,31,5,31
posset 0,1,22
mov bl,1
aslp: call bakitem
posset 0,bl,22
call newitem
inchr
cmp ah,48h
jnz asnext1
jmp aslp
asnext1:cmp ah,50h
jnz asnext2
inc bl
cmp bl,4
jna aslp
mov bl,1
jmp aslp
asnext2:cmp al,0
jnz asnext3
call backdisplay
call fuckey
asnext3:cmp al,0dh
jnz asnext4
posred
dec dh
mov dl,dh
xor dh,dh
add dl,dl
lea bx,jmp_sort
add bx,dx
jmp [bx]
asnext4:call backdisplay
endm
alook macro ;显示LOOK
call savedisplay
win 0,1ah,1,31,2,40
posset 0,1,32
outstr stu_num
posset 0,2,32
outstr stu_name
win 0,00h,3,32,3,41
win 0,00h,2,41,3,41
posset 0,1,32
mov bl,1
allp: call bakitem
posset 0,bl,32
call newitem
inchr
cmp ah,48h
jnz alnext1
jmp allp
alnext1:cmp ah,50h
jnz alnext2
inc bl
cmp bl,2
jna allp
mov bl,1
jmp allp
alnext2:cmp al,0
jnz alnext3
call backdisplay
call fuckey
alnext3:cmp al,0dh
jnz alnext4
posred
dec dh
mov dl,dh
xor dh,dh
add dl,dl
lea bx,jmp_look
add bx,dx
jmp [bx]
alnext4:call backdisplay
endm
equstu macro ;两个学生结构体间赋值,参数student2给stduent1
LOCAL equstu1
pushreg
mov cx,28
mov bx,student2
mov dx,student1
equstu1:mov byte ptr al,[bx]
inc bx
push bx
mov bx,dx
inc dx
mov byte ptr [bx],al
pop bx
loop equstu1
popreg
endm
excstu macro ;两个学生结构体交换;参数:excstu1,excstu2
push bx
mov bx,excstu1
mov student2,bx
lea bx,temp
mov student1,bx
equstu
mov bx,excstu2
mov student2,bx
mov bx,excstu1
mov student1,bx
equstu
lea bx,temp
mov student2,bx
mov bx,excstu2
mov student1,bx
equstu
pop bx
endm
stotn macro opr1 ;比较dx所指学生成绩存到tempnum
posset 0,23,0
mov strcount,3
mov stradr,dx
add stradr,opr1
call putstr
call getnum
endm
debug macro opr1 ;仅供调试
pushreg
posred
push dx
posset 0,1,1
putchr opr1
stay
pop dx
posset 0,dh,dl
popreg
endm
student struct ;学生结构体定义
num db ' '
nm db ' '
el db ' '
mt db ' '
cp db ' '
tt db ' '
student ends
assume cs:cseg, ds:dseg, ss:sseg
; code
cseg segment
start:
mov ax,dseg
mov ds,ax
mov ah,0
mov al,3
int 10h
snew:
mov scount,0
mov ccount,0
mov tcol,0
mov spage,1
mov cpage,1
; push ax
; posred
; push dx
; posset 0,1,1
; mov ah,2
; mov dl,scount
; add dl,30h
; int 21h
; pop dx
; posset 0,dh,dl
; pop ax
; stay
call window
call table
posset 0,24,0
call showpage
call getkey
quit: mov ax, 4C00h
int 21h
window proc near ;创建窗体
win 0,2fh,0,0,24,79
win 0,1ah,0,0,0,79
posset 0,0,1
outstr menu
win 0,1ah,24,0,24,79
posset 0,24,1
outstr staus
posset 0,23,0
win 0,22h,23,0,23,5
call windate
call winpage
ret
window endp
windate proc near ;显示时间
mov ah,2ah
int 21h
mov bl,10
mov ax,0
mov al,dh
div bl
add ax,3030h
mov [date+6],al
mov [date+7],ah
mov ax,0
mov al,dl
div bl
add ax,3030h
mov [date+9],al
mov [date+10],ah
win 0,1dh,0,67,0,79
posset 0,0,67
outstr date
ret
windate endp
winpage proc near ;显示页码
pushreg
lea bx,pg
mov al,cpage
add al,30h
mov byte ptr [bx+5],al
mov al,spage
add al,30h
mov byte ptr [bx+7],al
win 0,1dh,24,69,24,79
posset 0,24,71
outstr pg
popreg
ret
winpage endp
table proc near ;画表格
call rline
call cline
mov bx,0b800h
mov es,bx
mov head,1154
mov cx,6
tp2: push cx
mov cx,5
mov bx,head
tp1: mov es:[bx],206;197
inc bx
mov byte ptr es:[bx],00100001b
add bx,21
loop tp1
pop cx
add head,320
loop tp2
mov cx,5
mov bx,834
tp3: mov es:[bx],203;194
inc bx
mov byte ptr es:[bx],00100001b
add bx,21
loop tp3
mov cx,5
mov bx,3074
tp4: mov es:[bx],202;193
inc bx
mov byte ptr es:[bx],00100001b
add bx,21
loop tp4
mov cx,6
mov bx,1132
tp5: mov es:[bx],204;195
inc bx
mov byte ptr es:[bx],00100001b
add bx,319
loop tp5
mov cx,6
mov bx,1264
tp6: mov es:[bx],185;180
inc bx
mov byte ptr es:[bx],00100001b
add bx,319
loop tp6
mov bx,812
mov es:[bx],201;218
inc bx
mov byte ptr es:[bx],00100001b
mov bx,944
mov es:[bx],187;191
inc bx
mov byte ptr es:[bx],00100001b
mov bx,3052
mov es:[bx],200;192
inc bx
mov byte ptr es:[bx],00100001b
mov bx,3184
mov es:[bx],188;217
inc bx
mov byte ptr es:[bx],00100001b
thead
ret
table endp
rline proc near ;画表格横线
push ax
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov head,814
mov cx,8
rp2: push cx
mov cx,65
mov bx,head
rp1: mov es:[bx],205;196
inc bx
mov byte ptr es:[bx],00100001b
inc bx
loop rp1
pop cx
add head,320
loop rp2
pop es
pop cx
pop bx
pop ax
ret
rline endp
cline proc near ;画表格竖线
push ax
push bx
push cx
push es
mov bx,0b800h
mov es,bx
mov head,812
mov cx,7
cp2: push cx
mov cx,15
mov bx,head
cp1: mov es:[bx],186;179
inc bx
mov byte ptr es:[bx],00100001b
add bx,159
loop cp1
pop cx
add head,22
loop cp2
pop es
pop cx
pop bx
pop ax
ret
cline endp
savedisplay proc near ;保存屏幕
pushreg
posred
mov row,dh
mov col,dl
push ds
mov ax,0002h
int 33h
mov bx,0
mov cx,3840
sdloop1:
mov ax,0b800h
mov ds,ax
mov dl,ds:[bx]
mov ax,dseg
mov ds,ax
mov bak[bx],dl
inc bx
loop sdloop1
mov ax,0001h
int 33h
pop ds
popreg
ret
savedisplay endp
backdisplay proc near ;恢复屏幕
pushreg
push ds
mov bx,0
mov cx,3840
bdloop11:
mov ax,dseg
mov ds,ax
mov dl,bak[bx]
mov ax,0b800h
mov ds,ax
mov ds:[bx],dl
inc bx
loop bdloop11
pop ds
posset 0,row,col
popreg
ret
backdisplay endp
getkey proc near ;响应键盘
gklp: inchr
cmp al,0
jnz gknext1
call fuckey
jmp gknext
gknext1:cmp al,1bh
jnz gknext2
jmp quit
gknext2:cmp al,08h
jnz gknext
cmp scount,0
jz gknext
posred
cmp dl,62
jz gknext
call clstd
call edttd
jmp gknext
gknext: jmp gklp
ret
getkey endp
fuckey proc near ;识别菜单键,参数ah,扫描码
cmp ah,23h
jnz fknext1
ahelp
jmp fknext
fknext1:cmp ah,21h
jnz fknext2
afile
jmp fknext
fknext2:cmp ah,12h
jnz fknext3
aedit
jmp fknext
fknext3:cmp ah,1fh
jnz fknext4
asort
jmp fknext
fknext4:cmp ah,26h
jnz fknext5
alook
jmp fknext
fknext5:cmp ah,50h
jnz fknext6
cmp scount,0
jz fknext
call down
jmp fknext
fknext6:cmp ah,4bh
jnz fknext7
cmp scount,0
jz fknext
call left
jmp fknext
fknext7:cmp ah,4dh
jnz fknext8
cmp scount,0
jz fknext
call right
jmp fknext
fknext8:cmp ah,48h
jnz fknext9
cmp scount,0
jz fknext
call up
jmp fknext
fknext9:cmp ah,51h
jnz fknext10
mov ah,cpage
cmp ah,spage
jz fknext
inc cpage
call showpage
call baktd
posset 0,8,7
call newtd
mov ccount,1
mov tcol,1
jmp fknext
fknext10:cmp ah,49h
jnz fknext
mov ah,cpage
cmp ah,1
jz fknext
dec cpage
call showpage
call baktd
posset 0,8,7
call newtd
mov ccount,1
mov tcol,1
fknext: ret
fuckey endp
down proc near ;向下键
mov bl,ccount
cmp bl,pcount
jz down1
call baktd
inc ccount
posred
inc dh
inc dh
posset 0,dh,dl
call newtd
down1: ret
down endp
left proc near ;向左键
cmp tcol,1
jz left1
call baktd
dec tcol
posred
sub dl,11
posset 0,dh,dl
call newtd
left1: ret
left endp
right proc near ;向右键
cmp tcol,6
jz right1
call baktd
inc tcol
posred
add dl,11
posset 0,dh,dl
call newtd
right1: ret
right endp
up proc near ;向上键
cmp ccount,1
jz up1
call baktd
dec ccount
posred
dec dh
dec dh
posset 0,dh,dl
call newtd
up1: ret
up endp
newtd proc near ;特显单元格
pushreg
mov ax,0b800h
mov es,ax
posred
mov al,dh
xor ah,ah
mov cl,dl
mov bx,160
mul bx
xor ch,ch
add ax,cx
add ax,cx
mov bx,ax
inc bx
mov cx,10
ntlp: and byte ptr es:[bx],10001111b
or byte ptr es:[bx],01010000b
add bx,2
loop ntlp
popreg
ret
newtd endp
baktd proc near ;恢复单元格
pushreg
mov ax,0b800h
mov es,ax
posred
mov al,dh
xor ah,ah
mov cl,dl
mov bx,160
mul bx
xor ch,ch
add ax,cx
add ax,cx
mov bx,ax
inc bx
mov cx,10
btlp: and byte ptr es:[bx],10001111b
or byte ptr es:[bx],00100000b
add bx,2
loop btlp
popreg
ret
baktd endp
clstd proc near ;清空单元格
pushreg
posred
cmp dl,17
ja clstd1
mov dl,7
jmp clstds
clstd1: cmp dl,28
ja clstd2
mov dl,18
jmp clstds
clstd2: cmp dl,39
ja clstd3
mov dl,29
jmp clstds
clstd3: cmp dl,50
ja clstd4
mov dl,40
jmp clstds
clstd4: cmp dl,61
ja clstd5
mov dl,51
jmp clstds
clstd5: mov dl,62
clstds: mov cx,10
posset 0,dh,dl
ct1: putchr ' '
loop ct1
posset 0,dh,dl
popreg
ret
clstd endp
edttd proc near ;编辑单元格
posred
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -