📄 function.asm
字号:
include macro.lib
extrn printf:far,printf1:far,printf2:far,printf3:far,box:far,clearscreen_rw:far,putchar:far
extrn fill:far,putimmage:far,getimmage:far,vertical:far,horizontal:far,rectangle:far
extrn showbmp:far,draw_jiao:far
extrn clearscreen_du:far,clearscreen_ud:far,clearscreen_rl:far,clearscreen_lr:far
extrn clearscreen_in:far,clearscreen_out:far
extrn clearscreen_rw:far,clearscreen_dw:far
extrn clearscreen_rdw:far,clearscreen_mlr:far,clearscreen_mud:far
extrn busy:byte,openkeyboard:byte,color:word,movflag_key:byte,old_pos_x:word,new_pos_x:word
extrn new_pos_y:word,old_pos_y:word,closeintr:byte
extrn store_b:far,restore_b:far,restore_m:far,store_m:far
extrn write_one_record:far,putint:far,write_form1:far,tongji_form1:far,tongji_form2:far,write_form2:far
extrn draw_table:far,draw_ge:far,draw_form1:far,draw_form2:far
extrn sound:far,beep:far,goback:far
extrn mousex:word,mousey:word
extrn restore_line:far
extrn BACKFLAG1:BYTE,BACKFLAG2:BYTE ,BACKFLAG3:BYTE,closeintr:byte
extrn store_ax:word,store_bx:word,oldintr:word
public getstring
public input_records,save_exit,init_records,output_records
public search_nopass,search_departmentnum,tongji_nopass,tongji_renshu
public chinese_nopass,maths_nopass,line,boy_num,lady_num
public goout,direct_exit,show_onepage,sort_records
public pageup,pagedown,reflesh,exchange_scroll,light_line
public no_scroll,one,num_scroll,stop_uppage,stop_downpage,page_position
data segment para public 'data'
student struc
department_num db 4 dup(0)
study_num db 9 dup(0)
student_name db 10 dup(0)
sex db 0
chinese db 0
maths db 0
total db 0
average db 2 dup(0)
rank db 0
student ends
one student < >
records student 200 dup (< >)
precords dw 200 dup(0)
visitedflag db 300 dup(0)
length_records dw ?
num_records dw ?
wei_records dw ?
page_position dw 0
stop_downpage db 0
stop_uppage db 0
datafile db 'data\student.dat',0
length_read dw ?
temp db 20 dup(0)
store_si dw ?
STOP db 0
flag1 db 0
flag2 db 0
flag3 db 0
flag4 db 0
flag5 db 0
flag6 db 0
flag7 db 0
flag8 db 0
flag9 db 0
finishflag db 0
no_last db 0
finish_input_string db '结束输入',0,0
help db '鼠标移到相应的位置可进行修改,回车键确定,取消建结束输入',0,0
browse_string db '你是否想要浏览学生记录:',0,0
input_studentnum db '请输入你所查询学生的学号:',0,0
input_departmentnum db '请输入你所查询的系号:',0,0
input_studentname db '请输入你要查询的学生姓名',0,0
yes db '确定',0,0
yeshelp db '确定后进行下一步操作',0,0
cancle db '取消',0,0
canclehelp db '放弃此次操作',0,0
success_save db '数据文件已经成功保存',0,0
fail_save db '存储文件出错',0,0
readfail db '读起始数据文件失败',0,0
num_filecode dw ?
value db 0
nothing db '你所要查询的学生记录不存在',0,0
nodepartment db '你所要查询的系号不存在',0,0
biaoti1_text db '未及格学生统计情况如下',0,0
biaoti2_text db '男女学生人数统计如下',0,0
total_text db '合计',0,0
confirm db '你确定不保存此次的修改吗?',0,0
resume_records db '你确定要放弃所有已存在的记录重新开始输入吗?',0,0
r_back db '返回',0,0
helpr_back db '返回上一级菜单',0,0
uparrow db 1eh,0,0
uparrowhelp db '显示上一页',0,0
downarrow db 1fh,0,0
downarrowhelp db '显示下一页',0,0
chinese_nopass dw 0
maths_nopass dw 0
chinese_total dw 0
maths_total dw 0
line dw 82
boy_num dw 0
lady_num dw 0
total_boy dw 0
total_lady dw 0
swap_flag db 0
num_scroll dw 0
no_scroll db ?
data ends
code segment public 'code'
assume ds:data,cs:code,es:data
.386
;=================================================
;出口参数,bx---new numscroll
;from the position to num_scroll
exchange_scroll proc far
push ax
push ds
push es
mov ax, data
mov ds, ax
mov es, ax
mov ax, mousey
sub ax, 100
mov bx, 20
div bl
mov bx, 0
mov bl, al
pop es
pop ds
pop ax
ret
exchange_scroll endp
;=================================================
;入口参数:BX---numscroll
;show the record line to be delete
light_line proc far
push ax
push es
push ds
mov ax, data
mov ds, ax
mov es, ax
cmp no_scroll, 1
jne next_s
mov busy, 1
call restore_m
highlightground num_scroll,<RGB 0,200,100>
call store_m
mov busy, 0
mov no_scroll, 0
next_s:
cmp bx, num_scroll
je exit
mov ax, num_scroll
mov num_scroll ,bx
mov bx, ax
;restore the original area
mov busy , 1
call restore_m
highlightground bx,<RGB 0,200,100>
call beep
highlightground num_scroll,<RGB 0,200,100>
call store_m
mov busy, 0
exit:
pop es
pop es
pop ax
ret
light_line endp
;=================================================
;刷新表格结果
reflesh proc far
call get_rank
call show_onepage
mov no_scroll , 1
ret
reflesh endp
;=================================================
;入口参数:DI,SI,要交换的两个记录的首指针
swap_record proc
push di
push si
push ax
push cx
push bx
mov cx, 15
loop_swap:
mov ax, [di]
mov bx, [si]
mov [di], bx
mov [si], ax
add di, 2
add si, 2
loop loop_swap
pop bx
pop cx
pop ax
pop si
pop di
ret
swap_record endp
;=================================================
;bx----进行比较的字节位置
sort_records proc far
pusha
push ds
push es
mov cx, data
mov ds, cx
mov es, cx
mov dx, num_records
dec dx
loop1:
mov cx, dx
lea di, records
mov si, di
add si, 30
loop2:
mov al, byte ptr[bx+di]
cmp al, byte ptr[bx+si]
jle next_s
call swap_record
mov swap_flag, 1
next_s:
add di, 30
add si, 30
loop loop2
cmp swap_flag, 0
je out_sort
mov swap_flag, 0
dec dx
jnz loop1
out_sort:
pop es
pop ds
popa
ret
sort_records endp
;=================================================
;得到字符串
;入口参数:ax--x,bx--y, 光标位置,di存储字符串的缓冲区,dx--length_read:字符串长度
;出口参数:CF=0,DI 无效,CF=1,DI有效
getstring proc far
pusha
push ds
push es
mov cx, data
mov ds, cx
mov es, cx
mov new_pos_x,ax
mov old_pos_x,ax
mov new_pos_y,bx
mov old_pos_y,bx
call store_b
mov length_read, dx
mov openkeyboard ,1
lopp: mov ah,1
int 16h
jz lopp ;没有按键
mov ah,0
int 16h ;读键
cmp al, ENTERKEY
je exit_a
cmp al, ESCKEY
je exit_n
cmp al, 0 ;无效字符,响铃
jne next1
alarm
jmp lopp ;返回,继续循环
next1:
cmp al, BACKSPACE
jne next3
cmp dx,length_read
jne next2 ;无输入字符,如回退则响铃
alarm
jmp lopp
next2:
mov closeintr,1
inc dx ;回退一格
sub new_pos_x,8
mov movflag_key,1
mov al,0
std
stosb
mov al, 0dbh
mov bp, 0h
mov bx, new_pos_x
mov cx, new_pos_y
call putchar
mov closeintr,0
jmp lopp
next3:
dec dx
jnz next4
alarm
inc dx
jmp lopp
next4:
mov closeintr,1
mov movflag_key,1
call restore_b
cld
stosb
mov bp, 0ffffh
mov bx, new_pos_x
mov cx, new_pos_y
call putchar
call store_b
add new_pos_x,8
mov closeintr,0
jmp lopp
exit_n:
call restore_b
mov openkeyboard,0
clc ;置无效标志
jmp exit
exit_a:
call restore_b
mov openkeyboard,0
std ;在字符串末尾加一个0
mov al,0
stosb
stc ;置有效标志
exit:
pop es
pop ds
popa
ret
getstring endp
;===============================================================
;得到数字字符串
;入口参数:ax--x,bx--y, 光标位置,di存储数字的缓冲区,dx--length_read:数字串长度
;出口参数:CF=0,DI 无效,CF=1,DI有效
getstring_num proc far
pusha
push ds
push es
mov cx, data
mov ds, cx
mov es, cx
mov new_pos_x,ax
mov old_pos_x,ax
mov new_pos_y,bx
mov old_pos_y,bx
call store_b
mov length_read, dx
mov openkeyboard ,1
lopp: mov ah,1
int 16h
jz lopp ;没有按键
mov ah,0
int 16h ;读键
cmp al, ENTERKEY
je exit_a
cmp al, ESCKEY
je exit_n
cmp al, BACKSPACE
jne next2
cmp dx,length_read
jne next1 ;无输入字符,如回退则响铃
alarm
jmp lopp
next1:
mov closeintr,1
inc dx ;回退一格
sub new_pos_x,8
mov movflag_key,1
mov al,0
std
stosb
mov al, 0dbh
mov bp, 0h
mov bx, new_pos_x
mov cx, new_pos_y
call putchar
mov closeintr,0
jmp lopp
next2:
cmp al,'0'
jl next4
cmp al,'9'
jg next4
dec dx
jnz next3
alarm
inc dx
jmp lopp
next3:
mov closeintr,1
mov movflag_key,1
call restore_b
cld
stosb
mov bp, 0ffffh
mov bx, new_pos_x
mov cx, new_pos_y
call putchar
call store_b
add new_pos_x,8
mov closeintr,0
jmp lopp
next4:
alarm ;无效字符
jmp lopp
exit_n:
call restore_b
mov openkeyboard,0
clc ;置无效标志
jmp exit
exit_a:
call restore_b
mov openkeyboard,0
std ;在字符串末尾加一个0
mov al,0
stosb
;sub length_read ,dx ;计算出实际输入的字符个数
stc ;置有效标志
exit:
pop es
pop ds
popa
ret
getstring_num endp
;===============================================================
;得到数字字符串
;入口参数:ax--x,bx--y, 光标位置,cx 为转化后的数,dx--length_read:数字串长度
;出口参数:CF=0, 无效,CF=1,有效
getinterage proc far
push si
push di
push ds
push es
mov cx, data
mov ds, cx
mov es, cx
lea di, temp
mov new_pos_x,ax
mov old_pos_x,ax
mov new_pos_y,bx
mov old_pos_y,bx
call store_b
mov length_read, dx
mov openkeyboard ,1
lopp: mov ah,1
int 16h
jz lopp ;没有按键
mov ah,0
int 16h ;读键
cmp al, ENTERKEY
je exit_a
cmp al, ESCKEY
je exit_n
cmp al, BACKSPACE
jne next2
cmp dx,length_read
jne next1 ;无输入字符,如回退则响铃
alarm
jmp lopp
next1:
mov closeintr,1
inc dx ;回退一格
sub new_pos_x,8
mov movflag_key,1
mov al,0
std
stosb
mov al, 0dbh
mov bp, 0h
mov bx, new_pos_x
mov cx, new_pos_y
call putchar
mov closeintr,0
jmp lopp
next2:
cmp al,'0'
jl next4
cmp al,'9'
jg next4
dec dx
jnz next3
alarm
inc dx
jmp lopp
next3:
mov closeintr,1
mov movflag_key,1
call restore_b
cld
stosb
mov bp, 0ffffh
mov bx, new_pos_x
mov cx, new_pos_y
call putchar
call store_b
add new_pos_x,8
mov closeintr,0
jmp lopp
next4:
alarm ;无效字符
jmp lopp
exit_n:
call restore_b
mov openkeyboard,0
clc ;置无效标志
jmp exit
exit_a:
call restore_b
mov openkeyboard,0
std ;在字符串末尾加一个0
mov al,0
stosb
lea si, temp
call f10t2
mov cx, ax
stc ;置有效标志
exit:
pop es
pop ds
pop di
pop si
ret
getinterage endp
;功能:把di缓冲区的十进制数转化为二进制数
;入口参数:Si指向缓冲区
;出口参数:ax为转化后的二进制数
f10t2 proc
mov cx,10
mov ax,0
lopi: mov bl,[SI]
cmp bl,0
je exit
sub bl,30h
mov bh,0
mul cx
add ax,bx
inc si
jmp lopi
exit: ret
f10t2 endp
;=============================================
finish_input macro
mov closeintr, 1
call restore_m
background 670,500,770,520,<RGB 0,0,0>
call store_m
mov closeintr, 0
mov STOP ,1
mov finishflag, 1
endm
;得到一个记录
;入口参数:SI 指向一个记录的首地址
get_one_record proc far
pusha
push ds
push es
mov ax, data
mov ds, ax
mov store_si, si
background 100,575,700,595,<RGB 0,0,0>
getnums 172,540,[SI].student.department_num,4
jc continue1
mov no_last, 1
jmp G_exit
continue1:
getnums 297,540,[SI].student.study_num,9
jc continue2
mov no_last, 1
jmp G_exit
continue2:
gets 440,540,[SI].student.student_name, 10
jc continue3
mov no_last, 1
jmp G_exit
continue3:
getchar 574,540,[SI].student.sex
jc continue4
mov no_last, 1
jmp G_exit
continue4:
getgrade 635,540,[SI].student.chinese,4
getgrade 715,540,[SI].student.maths,4
.REPEAT
button 150,535,165,560,flag1,<mov STOP ,1>,next1
next1:
update 170,540,237,558,flag2,<getnums 172,540,[SI].student.department_num,4>,next2
next2:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -