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

📄 function.asm

📁 学分管理系统的分析
💻 ASM
📖 第 1 页 / 共 3 页
字号:
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 + -