文件記錄操作
該程序實現及其說明:
1)從磁盤文件中讀入記錄數據.(這裏磁盤文件中的數據爲字符串格式,而且字符型串與數值型的串混雜在一起,要從中分離數值型字符串並將其轉化爲數值以便進行數值運算等.我這裏作了簡化這程序核心目的不在這.)
記錄文件格式:(串與串第一個字符之間間隔8個字符,可以按這格式添加若干行,但列數和列名如下得一致.呵呵,這麻煩點,程序了簡單多了啊,不信編編試試看)
name math englsh yuwen
zhou 89 79 68
lanx 96 78 88
maro 78 88 97
ping 79 97 84
ming 75 78 97
2)分離後的數字串數據分組保存並轉化成相應的數值,編寫排序,串拷貝等等函數對起操作並顯示.(這裏顯示代碼借了我上個程序<打字練習程序>,詳見我BLOG).與
3)程序啓動時候,先進入密碼驗證階段,密碼有系統時間生成,這裏需要留意的是去系統時間後將系統時間轉化輸出成指定格式的6位十進制串.按找密碼提示輸入密碼進入下一環節,這裏設計到密碼串比較的問題,參見相關代碼塊.
密碼驗證採用了錯誤循環輸入處理,但只能輸入三次.
4)進入裝載文件塊.這模塊功能和代碼及操作與程序<打字練習程序>基本一致.這裏添加了
5)屏幕輸出結果模塊.這模塊主要在paixu_out模塊中實現.如果注意到宏CLEARSCREAM具有定製界面功能,還可以利用他定製自己的界面,不過這當然要自己在適當的地方添加CLEARSCREAM宏代碼.
6)關於函數的功能說明參見函數名和其實現代碼.與以前程序一樣,函數名或宏就表明了其主要實現的功能.程序中有些函數代碼可以優化,找找看.
7)希望這個程序對你有所幫助.程序在MASM5中調試通過.拷貝下列原碼自己運行下先啊.如果不能運行,和我聯繫:發消息或EMAIL:[email protected]
;程序:mima.asm
;作者:周志明
;------------------------------------------
CLEARSCREAM MACRO alz,bhz,chz,clz,dhz,dlz
push ax
push bx
push cx
push dx
mov al,alz
mov bh,bhz
mov ch,chz
mov cl,clz
mov dh,dhz
mov dl,dlz
mov ah,6h
int 10h
pop dx
pop cx
pop bx
pop ax
ENDM
STIMEMC MACRO
push cx
push dx
mov ah,2ch
int 21h
mov stime[0],ch
mov stime[1],cl
mov stime[2],dh
pop dx
pop cx
ENDM
READGB MACRO bhz
push ax
push bx
push cx
push dx
mov bh,bhz
mov ah,3
int 10h
mov gbattr[0],dh
mov gbattr[1],dl
pop dx
pop cx
pop bx
pop ax
ENDM
SETGB MACRO bhz,dhz,dlz
push ax
push bx
push cx
push ax
push si
mov bh,bhz
mov dh,dhz
mov dl,dlz
mov ah,2
int 10h
pop si
pop dx
pop cx
pop bx
pop ax
ENDM
TISHI MACRO row,col,addr
push ax
push bx
push cx
push dx
SETGB 0,row,col
mov ah,09h
lea dx,addr
int 21h
pop dx
pop cx
pop bx
pop ax
ENDM
;=======================================================
data segment
addr db 300 dup('$')
path db 50 dup(0)
ts00 db 'Load File$'
ts01 db 'Load:$'
ts02 db 'OK?$'
ts03 db 'Path Error! Press any key to reinput!$'
stime db 3 dup(0)
temp db 10 dup(0)
inpw db 10 dup('$')
pw db 10 dup('$')
strflag db 0
gbattr db 4 dup(0)
ts0 db 'sn:$'
ts1 db 'password:$'
ts2 db 'Success!Press any key to continue!$'
ts3 db 'Error!Press any key to continue!$'
ts4 db 'Sorry,Three times over!Press any key to ESC!$'
tspx1 db 'Stu-Records:$'
tspx2 db 'PaiXuHou Stu-Records:$'
rcdstart dw 0
rcdnum dw 5 ;/////////
rcdlessons dw 3 ;////////
cname db 240 dup('$')
math db 30 dup(0)
english db 30 dup(0)
yuwen db 30 dup(0)
sum dw 30 dup(0)
sumflag db 0
aveflag db 0
row db 0
colum db 0
gbtemp db 10 dup(0)
dspts0 db 'sum$'
dspts1 db 'ave$'
data ends
;=========================================================
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
mov ah,0h
mov al,03h ;80*25/16
int 10h
;-------------------------------
CLEARSCREAM 0,07,0,0,25,79
CLEARSCREAM 0,37h,8,16,17,63
CLEARSCREAM 0,57h,10,20,15,59
TISHI 9,20,ts0
STIMEMC
call OutTime
TISHI 15,22,inpw ;///test
TISHI 13,20,ts1
call InPassWord
;-----------------------------
CLEARSCREAM 0,07H,0,0,24,79
CLEARSCREAM 0,5eh,9,14,14,65
TISHI 10,35,ts00
TISHI 12,25,ts01
call LoadFile
TISHI 13,45,ts02
mov ah,01h
int 21h
mov ah,01h ;//
int 21h ;//
;------------------------------
CLEARSCREAM 0,07,0,0,25,79
CLEARSCREAM 0,1eh,1,0,23,79
; CLEARSCREAM 0,60h,4,19,20,69
call paixu_out
;------------------------------
mov ah,01h
int 21h
exit:
mov ah,4ch
int 21h
;================================================-----
btod_out proc near ;num store in bx
push ax
push cx
push dx
mov cl,10
mov ax,bx
div cl
add ah,'0'
add al,'0'
mov temp[2],ah
mov temp[1],al
rnext0: mov dl,temp[1]
mov ah,02h
int 21h
mov dl,temp[2]
mov ah,02h
int 21h
pop dx
pop cx
pop ax
ret
btod_out endp
;--------------------------------------------------
OutTime proc near
;stime[0],stime[1],stime[2]
mov al,stime[0]
cbw
mov bx,ax
CALL btod_out
mov al,temp[1]
mov ah,temp[2]
mov inpw[0],al
mov inpw[1],ah
mov ah,2h
mov dl,':'
int 21h
mov al,stime[1]
cbw
mov bx,ax
CALL btod_out
mov al,temp[1]
mov ah,temp[2]
mov inpw[2],al
mov inpw[3],ah
mov ah,2h
mov dl,':'
int 21h
mov al,stime[2]
cbw
mov bx,ax
CALL btod_out
mov al,temp[1]
mov ah,temp[2]
mov inpw[4],al
mov inpw[5],ah
ret
OutTime endp
;--------------------------------------------------
InPassWord proc near
mov si,0
mov di,3
IPLFROTA:
READGB 0
mov ah,01h
int 21h
cmp al,0dh
jnz id0dnt
SETGB 0,gbattr[0],gbattr[1]
jmp IPLFROTA
id0dnt: cmp al,08h
jz IPLFBK
mov pw[si],al
inc si
mov ah,02h
mov dl,08h
int 21h
mov dl,'*'
int 21h
cmp si,06
jz IPLoadNext
jmp IPLFROTA
jmp IPLoadNext
IPLFBK: cmp si,0
jnz iplfnz
READGB 0
inc gbattr[1]
SETGB 0,gbattr[0],gbattr[1]
jmp IPLFROTA
iplfnz: mov pw[si],0
dec si
mov ah,02h
mov dl,' '
int 21h
mov ah,02h
mov dl,08h
int 21h
jmp IPLFROTA
IPLoadNext:
mov cx,03h
iptimes:
mov cx,6
mov bx,offset inpw
mov bp,offset pw
call strcpare
;--------------------
mov al,strflag
cmp al,0
jz ipexit
TISHI 15,20,ts3
mov ah,01h
int 21h
CLEARSCREAM 0,57h,10,20,15,59
TISHI 13,20,ts1
mov si,0
dec di
cmp di,0
jnz ipdint
mov ah,4ch
int 21h
ipdint:jmp IPLFROTA
ipexit: TISHI 15,20,ts2
mov ah,01h
int 21h
ret
InPassWord endp
;--------------------------------------------------
strcpare proc near
;cx store character numbers
;bx,bp
;return strflag
mov strflag,0
strrota:
mov ax,[bx]
cmp ax,[bp]
ja strAbove
jb strBlow
inc bx
inc bp
loop strrota
mov strflag,0
jmp strexit
strAbove:
mov strflag,2
jmp strexit
strBlow:
mov strflag,1
jmp strexit
strexit:
ret
strcpare endp
;--------------------------------------------------
LoadFile proc near
push ax
push bx
push cx
push dx
push si
mov si,0
LFROTA: mov ah,01h
int 21h
cmp al,0dh
jz LoadNext
cmp al,08h
jz LFBK
mov path[si],al
inc si
jmp LFROTA
jmp LoadNext
LFBK: cmp si,0
jnz lfnz
READGB 0
inc gbattr[1]
SETGB 0,gbattr[0],gbattr[1]
jmp LFROTA
lfnz: mov path[si],0
dec si
mov ah,02h
mov dl,' '
int 21h
mov ah,02h
mov dl,08h
int 21h
jmp LFROTA
LoadNext:
mov ah,3dh
mov dx,seg path
mov ds,dx
mov dx,offset path
mov al,00
int 21h
jc LoadERROR
;bx use to save file code
mov bx,ax
mov si,0
mov dx,seg addr
mov ds,dx
mov dx,offset addr
mov cx,1
mov di,0
LROT: mov ah,3fh
int 21h
cmp ax,0
jnz lfnt0
jmp lfret
lfnt0:
inc dx
inc si
jmp LROT
jmp lfret
LoadERROR:
TISHI 14,20,ts03
mov ah,01h
int 21h
CLEARSCREAM 0,5eh,9,14,14,65
TISHI 10,35,ts00
TISHI 12,25,ts01
mov si,0
jmp LFROTA
lfret: pop si
pop dx
pop cx
pop bx
pop ax
ret
LoadFile endp
;--------------------------------------------------
Separate proc near
push si
;//--------------------
;//Get first record's position//Store in rcdstart
mov si,0
FRSrota:
mov dl,addr[si]
inc si
cmp dl,0dh
jnz FRSrota
lea bx,addr[si]
mov rcdstart,bx
;//-------------------
;---------------------//Separate name and every scord
;//name ->cname[] (char)
;scord ->math[],english[],yuwen[] (int)
mov cx,rcdnum
lea bx,addr[si]
call chartoint
lea bx,addr[si]
call LoadName
;---------------------
pop si
ret
Separate endp
;--------------------------------------------------
paixu_out proc near
mov si,0
pxrota: mov dl,addr[si]
inc si
cmp dl,0dh
jnz pxrota
;=================================
CLEARSCREAM 0,60h,5,19,10,65
TISHI 4,15,tspx1
mov aveflag,1
mov row,5 ;//test
mov colum,20 ;//
call disPlay ;//
call Separate
lea bx,addr[si]
call paixu ;//pai xu
CLEARSCREAM 0,60h,15,19,20,65
TISHI 14,15,tspx2 ;//test paixu
mov aveflag,1
mov row,15
mov colum,20
call disPlay
ret
paixu_out endp
;-------------------------------------------------
paixu proc near
push si
push di
mov ax,rcdnum
push ax
;//bx:first record address
mov si,0
mov ax,rcdnum
add rcdnum,ax
pxrot0: mov bp,bx
cmp si,rcdnum
jnb pxrtnt0
mov ax,sum[si]
mov di,si
add di,2
pxrot1: cmp di,rcdnum
jnb pxrtnt1
;--------------
add bp,34
cmp ax,sum[di]
jnb pxrtnt2
mov cx,32
call strexchg
mov ax,sum[di]
mov dx,sum[si]
mov sum[si],ax
mov sum[di],dx
;--------------
pxrtnt2:add di,2
jmp pxrot1
pxrtnt1:
add bx,34
add si,2
jmp pxrot0
pxrtnt0:
pop ax
mov rcdnum,ax
pop di
pop si
ret
paixu endp
;--------------------------------------------------
strexchg proc near
;bx,bp
;cx
push ax
push bx
push cx
push bp
push si
mov si,0
mrot: mov al,[bx][si]
mov ah,[bp][si]
mov [bx][si],ah
mov [bp][si],al
inc si
loop mrot
pop si
pop bp
pop cx
pop bx
pop ax
ret
strexchg endp
;--------------------------------------------------
chartoint proc near
;cx=records'number
;bx=first record address
push dx
push si
mov bp,bx
mov dl,10
mov si,0
ctoirota:
;////////////////math
add bp,7
firstch:inc bp
mov dh,[bp]
cmp dh,'0'
jb firstch
cmp dh,'9'
ja firstch
sub dh,'0'
mov al,dh
fchnt: inc bp
mov dh,[bp]
cmp dh,' '
jz mathnext
mul dl
sub dh,'0'
add al,dh
jmp fchnt
mathnext:
mov math[si],al
;////////////////english
mov bp,bx
add bp,15
firstch1:
inc bp
mov dh,[bp]
cmp dh,'0'
jb firstch1
cmp dh,'9'
ja firstch1
sub dh,'0'
mov al,dh
fchnt1: inc bp
mov dh,[bp]
cmp dh,' '
jz englishnext
mul dl
sub dh,'0'
add al,dh
jmp fchnt1
englishnext:
mov english[si],al
;//////////////////yuwen
mov bp,bx
add bp,23
firstch2:
inc bp
mov dh,[bp]
cmp dh,'0'
jb firstch2
cmp dh,'9'
ja firstch2
sub dh,'0'
mov al,dh
fchnt2: inc bp
mov dh,[bp]
cmp dh,' '
jz yuwennext
mul dl
sub dh,'0'
add al,dh
jmp fchnt2
yuwennext:
mov yuwen[si],al
inc si
add bx,34
mov bp,bx
mov ax,0
;;--------///loop ctoirota
dec cx
cmp cx,0
jz ctexit
jmp ctoirota
;;---------
ctexit:
;-----------------////request sum[]
mov si,0
mov di,0
mov cx,rcdnum
ctsum: mov dx,0
mov ax,0
mov al,math[si]
cbw
mov dx,ax
mov al,english[si]
cbw
add dx,ax
mov al,yuwen[si]
cbw
add dx,ax
mov sum[di],dx
add di,2
inc si
loop ctsum
pop si
pop dx
ret
chartoint endp
;--------------------------------------------------
LoadName proc near
;bx=first record's address
push ax
push bx
push cx
push dx
push si
push di
push bp
mov bp,0
mov si,0
lnrota0:mov di,0
mov cx,8
lnrota1:
mov al,[bx][di]
mov cname[bp+di],al
inc di
loop lnrota1
add bp,9
add bx,34
inc si
cmp si,rcdnum
jb lnrota0
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
LoadName endp
;--------------------------------------------------
btod_out4 proc near ;num store in bx
push ax
push cx
push dx
push bp
push si
mov ax,bx
mov si,4
rota1: mov bl,10
div bl
mov temp[si],ah
and ax,00ffh
dec si
cmp si,0
jnz rota1
mov bp,1
mov si,1
rota2: mov dl,temp[si]
add dl,'0'
cmp dl,'0'
jz btodeal
mov bp,0
btrt1: mov ah,02h
int 21h
btrt2: inc si
cmp si,4
jna rota2
cmp bp,1
jnz RT
mov ah,2h
int 21h
jmp RT
btodeal: cmp bp,1
jz btrt2
jmp btrt1
RT: pop si
pop bp
pop dx
pop cx
pop ax
ret
btod_out4 endp
;--------------------------------------------------
ave_out proc near
;bp=scords
push ax
push bx
push cx
push dx
push si
push di
push bp
mov ax,bp
mov dx,0
div rcdlessons
mov bx,ax
CALL btod_out4
push dx
mov ah,02h
mov dl,'.'
int 21h
pop dx
mov cx,100
mov ax,dx
mul cx
div rcdlessons
mov bx,ax
CALL btod_out4
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
ave_out endp
;--------------------------------------------------
disPlay proc near
;row,colum
push ax
push bx
push cx
push dx
push si
push di
push bp
mov si,0
dpclr:mov dl,'$'
mov cname[si],dl
inc si
cmp si,150
jnz dpclr
mov si,0
dpFRProta:
mov dl,addr[si]
inc si
cmp dl,0dh
jnz dpFRProta
;-------------------
SETGB 0,row,colum
mov di,0
dptsrota:
mov ah,2h
mov dl,addr[di]
int 21h
inc di
cmp di,si
jb dptsrota
; inc row
;-------------------
lea bx,addr[si]
mov cx,rcdnum
call chartoint
lea bx,addr[si]
call LoadName
mov dl,row
mov gbtemp[0],dl
mov dl,colum
mov gbtemp[1],dl
mov gbtemp[2],dl
mov gbtemp[3],dl
mov gbtemp[4],dl
mov gbtemp[5],dl
add gbtemp[1],8
add gbtemp[2],16
add gbtemp[3],24
add gbtemp[4],32
add gbtemp[5],40
mov si,0
mov di,0
mov bp,0
; SETGB 0,row,colum
dplayrota:
TISHI gbtemp[0],colum,cname[bp]
inc gbtemp[0]
SETGB 0,gbtemp[0],gbtemp[1]
mov al,math[si]
cbw
mov bx,ax
call btod_out
SETGB 0,gbtemp[0],gbtemp[2]
mov al,english[si]
cbw
mov bx,ax
call btod_out
SETGB 0,gbtemp[0],gbtemp[3]
mov al,yuwen[si]
cbw
mov bx,ax
call btod_out
;-------------------------------
mov al,0
cmp aveflag,al
jnz dspsv
jmp aveflgnext
dspsv:
SETGB 0,gbtemp[0],gbtemp[4]
mov bx,sum[di]
call btod_out4
mov ah,2h
mov dl,' '
int 21h
SETGB 0,gbtemp[0],gbtemp[5]
push bp
mov bp,sum[di]
call ave_out
pop bp
aveflgnext:
;-----------------------------
add di,2
add bp,9
inc si
cmp si,rcdnum
jz dplayet
jmp dplayrota
dplayet:
mov aveflag,0
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
disPlay endp
;--------------------------------------------------
code ends
end start
推薦技術站點:
"OFBIZCHINA.COM" - 專注於軟件開發中文IT社區,爲從事軟件開發技術人員提供最全面的信息傳播和服務平臺"