您的位置:首页 > 其它

MASM-文件记录操作

2005-11-06 05:23 344 查看
文件记录操作

该程序实现及其说明:

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:hbyufan@163.com

;程序: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

推荐技术站点:

技术精英网
www.ofbizchina.com

"OFBIZCHINA.COM" - 专注于软件开发中文IT社区,为从事软件开发技术人员提供最全面的信息传播和服务平台"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: