资源描述
《汇编语言程序设计》课程设计
题目:人事档案文献管理
-11-26
一. 设计目
汇编语言课程设计是对所学课程内容全面、系统总结、巩固和提高一项课程实践活动。依照汇编语言特点,选取相应题目,在教师指引下,由学生独立完毕。课程设计规定同窗们熟悉汇编语言编程,BIOS中断调用、系统功能调用、磁盘数据查询、存取、图形颜色显示与调节等有关知识。通过课程设计,一方面提高运用汇编语言编程解决实际问题能力,另一方面使同窗们更进一步理解计算机系统内部关于知识,为后来学习和系统开发奠定良好基本。
二.设计内容
在文档中创立一种person.txt文本文献,它包括id号、姓名、年龄、性别、电话、通信地址等六项内容,先编写一项如下图界面功能:
实现如下功能:
(1) i命令,实现数据输入,在末尾添加
(2) f命令,实现数据查找,按名字进行查找
(3) d命令,实现数据删除,按名字进行查找删除。
(4) o命令,实现数据排序,按名字进行排序
(5) l命令,实现数据显示,
(6) q命令,实现退出,并将数据重新写入
三.程序设计原理
(1)本次实验是模块化程序设计思想,通过一种主程序,调用其她模块子程序,
①:文献打开,如果能打开文献便读取其中内容,否则话,便创立文献,接着执行后来裔码。
②:宏定义:实验中做了一种显示字符串宏,以便后来显示各种字符串
③:背景颜色实现:通过调用int 10h功能,实现s草绿色背景
④:插入程序:通过查寻与否存在当前输入id,如果不存在,则继续输入,如果存在则停止输入。输入时候计算输入字节,局限性用空格补充,并将输入内容保存到内存里,当关闭文献时,保存到文献里,同步设立指针指向数据段末尾。
程序框图如下:
cmp al,’I’
jnz error
call input
Y/N
输入id
输入
输入id进行检查,调用check函数,设立flag=bp,初始值设立bp=0,如果存在bp=0,否则bp=1;
Check
Y
调用storid保存到stu中,
BP=0?
N
Y
保存到数据段
Y
调用inputname
输入名字
调用inputsex
输入性别
输入年龄
调用inputold
调用inputaddress
输入地址
调用inputphone,如果输入结束,通过回车键进入主页面。
输入电话
Ret
结束
⑤:显示程序,一方面判断文献中是不是有内容,通过设立是一种全局count记录文献个数,如果记录为零,则退出,返回主菜单,否则每次从内存中取60个字节。
到另一种缓存显示,用count计数,显示一次,count--;
⑥:查找模块 :一方面提示顾客输入想要查找名字,调节指针,然后用字符串cmpsw比较名字,直到最后一种名字为止,若找到则显示,不存在,则提示;
程序框图:
名字查找
核心代码
:lea si,stu
add si,10 ;指向记录第一种人姓名
mov bx,si
nase10:
lea di,_name ;存储待查人姓名地址
mov cx,5
repe cmpsw
输入要查找名字
si->数据段第一种名字
di=输入名字bp=0
名字比较
Si移到下一种名字
找到名字
Y si=指向学生信息头
N
输出学生信息
Count-1
COUNT=0?
N
RET
结束
Y
⑦:删除程序:通过名字进行查找,如果不存在就报错,如果存在多条记录进行提示,选取删除那条记录:
Bp作为一种标志:
Bp<=1;无记录
3>Bp>1;有一条记录
Bp>3;有多调记录
程序框图:
名字删除
rep movsw
RET
结束
sub stu1,60
sub count1,1
Si=di下一种
di=del[bp]
di=del[bx]
删除第bx个记录
Bx=bx*2
BP>3?
Bp>1?
查找名字相似记录
N
Y
N
Y
Si
endaddr
si>=endaddr
N
Y
⑧:排序程序:若只有一条记录或者没有直接跳出,否则按照Ascii码排序,排序用冒泡排序算法:程序框图:
endaddr->倒数第二个名字
si->第一种名字
swapped=0
这里采用冒泡算法,从第一种数开始对相邻两个数进行比较,如果顺序不对,进行互换。从图中可以看出,
为了提高效率,设立了一种标志位,每次进入外循环,就将标志位值零,在内循环每做一次互换,就将该标志位值1,在每次内循环结束后,可测试标志位与否是0,如果是0.则结束排序,否则在进行一次外循环。这种算法效率较高某些。
di->si下一种名字
Ax=di bx=si
repe cmpsb
Si<=di?
Y
dißàsi
N
Swapped=1
Si=ax
Si<=endaddr
Swapped=0?
N
N
Y
结束ret
⑨:退出程序:打开文献,把数据段内容读入文献,否则创立文献,同是依照count,写入最后一条记录,在末尾‘ ’,关闭文献。
四.程序分工
苏林东:模块整合与颜色调配,尚有文献建立与有关模块制作
吴威:输入模块和删除模块制作,关闭文献制作。
曹锦峰:查询模块和排序模块制作。
五.源程序及运营成果:
(1)源程序:
data segment
HH DB 0,0,':'
MM DB 0,0,':'
SS1 DB 0,0
mess1 db 'id:','$'
mess2 db 'name:','$'
mess3 db 'old:','$'
mess4 db 'sex:','$'
mess5 db 'address:','$'
mess6 db 'phone number:','$'
mess7 db 'enter error!!!',0dh,0ah,'$'
mess8 db 'id',8 dup(' '),'name',5 dup(' '),'old ','sex ',' address ',5 dup(' '),'telphone',13,10,'$'
mess9 db 'student information in the table is:',13,10,'$'
mess10 db 'please enter the name:',13,10,'$'
mess11 db 13,10,'OK,you are quit,welcome the next!!','$'
mess13 db 'sorry,create file is not success!!',13,10,'$'
mess14 db 'No Records!!!',13,10,'$'
mess15 db 'sorry,the input is not found!!!',13,10,'$'
mess16 db 'Do you want to delete this messae(y/n)?',13,10,'$'
mess17 db 'please choose which one do you want to delete(1,2...):','$'
mess18 db 'Delete success!!',13,10,'$'
mess19 db 'sorry,the id is same ,please input again!!',13,10,'$'
mess20 db 'please press to paste next page',13,10,'$'
mess21 db 'Very good,the sort is sucessful!!',13,10,'$'
idpar label byte
maxilen db 10
actilen db ?
id db 10 dup(?) ;学号
namepar label byte
maxnlen db 10
actnlen db ?
_name db 10 dup(?) ;姓名
oldpar label byte
maxolen db 3
actolen db ?
old db 3 dup(?) ;年龄
sexpar label byte
maxslen db 5
actslen db ?
sex db 5 dup(?) ;性别
addresspar label byte
maxalen db 15
actalen db ?
ad db 15 dup(?) ;地址
phonepar label byte
maxplen db 15
actplen db ?
phone db 15 dup(?) ;电话号码
displ macro x ;显示宏
lea dx,x
mov ah,09
int 21h
endm
stu db 50 dup(58 dup (' '),13,10) ;内存空间
temp db 60 dup (' '),'$' ;暂时存储空间
crlf db 13,10,'$' ;换行回车
menu db '***************** welcom ***********************',13,10
db '* i-------input *',13,10
db '* f-------find *',13,10
db '* d-------delete *',13,10
db '* o-------sort *',13,10
db '* l-------list *',13,10
db '* q-------quit *',13,10
db '************************************************',13,10
db 'please input the choice:','$'
stu1 dw ?;作为存储末尾指针
address db 'f:\person.txt',0 ;途径
count1 db 0 ;暂时记录输入个数
count db 0;记录输入个数
count2 db 0;检查学\号时候用
fcode dw ? ;文献代号
endaddr dw ?;排序时用到,及存储末尾指针
end1 db ' ';
count3 db 0;显示时候用,分页
del dw 20 dup(?)
swapped db 0 ;互换标志位
data ends
;-----------------代码段--------------------
code segment
assume cs:code,ds:data,es:data
main proc far
mov ax,data
mov ds,ax
mov es,ax
start:
mov ax,0600h
call scren
lea di,stu
call open
cld
mov stu1,di
menu1:
displ menu ;显示菜单
mov ah,01
int 21h
mov bl,al
displ crlf
mov al,bl
and al,5fh ;把输入选取都转化为大写
insert:
cmp al,'I'
jnz list
call input
jmp menu1
list:
cmp al,'L'
jnz dele
call display
displ crlf
jmp menu1
dele:
cmp al,'D'
jnz find
call delet
displ crlf
jmp menu1
find:
cmp al,'F'
jnz sort
call search
displ crlf
jmp menu1
sort:
cmp al,'O'
jnz quit
call namesort
displ crlf
displ mess21
jmp menu1
quit:
cmp al,'Q'
jz over
error:
displ mess7
jmp menu1
over:
call close
displ mess11
mov ah,4ch
int 21h
ret
main endp
;--------------插入模块---------------
input proc near
mov di,stu1
inputloop:
cld
again:
mov bp,0
displ mess1
call inputid ;输入学号
cmp actilen,0
jz A10
cmp count1,50
je A10
call check ;检查学号与否重复
cmp bp,0
jnz again
call storid ;保存到stu
displ mess2
call inputname ;输入名字
displ mess3
call inputold ;输入年龄
displ mess4
call inputsex ;输入性别
displ mess5
call inputaddress ;输入地址
displ mess6
call inputphone ;输入电话
add di,2
jmp inputloop
A10:
mov ah,count1 ;记录数
mov count,ah
mov stu1,di
ret
input endp
;------------输入学号模块-----------------
inputid proc near
mov ah,0ah
lea dx,idpar
int 21h
displ crlf
mov bh,0
mov bl,actilen
mov cx,10
sub cx,bx
loopn:
mov id[bx],20h
inc bx
loop loopn
ret
inputid endp
;----------------相似窗号检查段------------
check proc near
mov bp,0
mov ah,count1
mov count2,ah
mov si,stu1
sub si,60
mov endaddr,si;指向最后一条记录学号
lea si,stu
mov bx,si
nase1:
lea di,id;存储学号偏移地址
mov cx,5
repe cmpsw
jcxz naseex
jmp nase2
naseex:
displ mess19
mov bp,1
jmp mm1
nase2:
add bx,60
mov si,bx
dec count2
jnz nase1
mm1:
ret
check endp
;----------------保存学号模块--------------
storid proc near
mov di,stu1
inc count1
cld
lea si,id
mov cx,5
rep movsw
ret
storid endp
;---------------输入名字-------------
inputname proc near
mov ah,0ah
lea dx,namepar
int 21h
displ crlf
mov bh,0
mov bl,actnlen
mov cx,10
sub cx,bx
in20:
mov _name[bx],20h ;剩余充填空格
inc bx
loop in20
cld
lea si,_name
mov cx,5
rep movsw
ret
inputname endp
;---------------输入年龄------------------
inputold proc near
mov ah,0ah
lea dx,oldpar
int 21h
displ crlf
mov bh,0
mov bl,actolen
mov cx,3
mov cx,bx
lo20:
mov old[bx],20h
inc bx
loop lo20
cld
lea si,old
mov cx,3
rep movsb
ret
inputold endp
;---------------输入性别------------------
inputsex proc near
mov ah,0ah
lea dx,sexpar
int 21h
displ crlf
mov bh,0
mov bl,actslen
mov cx,5
sub cx,bx
is20:
mov sex[bx],20h
inc bx
loop is20
cld
lea si,sex
mov cx,5
rep movsb
ret
inputsex endp
;---------------输入地址-------------------
inputaddress proc near
mov ah,0ah
lea dx,addresspar
int 21h
displ crlf
mov bh,0
mov bl,actalen
mov cx,15
sub cx,bx
ia20:
mov ad[bx],20h
inc bx
loop ia20
cld
lea si,ad
mov cx,15
rep movsb
ret
inputaddress endp
;----------------输入电话-----------------
inputphone proc near
mov ah,0ah
lea dx,phonepar
int 21h
displ crlf
mov bh,0
mov bl,actplen
mov cx,15
sub cx,bx
ip20:
mov phone[bx],20h
inc bx
loop ip20
cld
lea si,phone
mov cx,15
rep movsb
ret
inputphone endp
;----------------time时间----------------------
time proc near
; push ax
;;push bx
; push cx
;push dx
push ds
mov ax,0
push ax
mov ax,data
mov ds,ax
AGAIN1:
mov ah,2ch ;读取系统时间 CH:CL--时:分 DH:DL--秒:百分秒
int 21h
MOV BX ,OFFSET HH
MOV AL,CH
CALL C16_10 ;转换AL中16进制为10进制,并填入相应位置
MOV BX ,OFFSET MM
MOV AL,CL ;分
CALL C16_10
MOV BX ,OFFSET SS1
MOV AL,DH ;秒
CALL C16_10
MOV AH,2 ;光标定位
MOV DH,0 ;首行
MOV DL,70 ;70列
MOV BH,0
INT 10H
MOV CX,8
MOV SI,OFFSET HH
NN1:
MOV AH,0EH ;电传方式写字符(一次1个)
MOV AL,[SI]
MOV BL,0
INT 10H
INC SI
LOOP NN1
MOV AH,1
INT 16H
;JNZ DOWN ;按任一键结束
JMP AGAIN1
;DOWN:
;pop ds
;pop dx
;pop cx
;pop bx
;pop ax
;RET
ret
time endp
;----------------进制转换-----------------
C16_10 PROC NEAR
PUSH CX ;将AL中16进制转为10进制
MOV AH,0
MOV CX,10D
DIV CL
ADD AX,3030H
MOV [BX],AL
INC BX
MOV [BX],AH
POP CX
RET
C16_10 ENDP;
;----------------关闭文献-----------------
close proc near
mov ah,count1
mov count,ah
cmp count,0
jbe exit10
mov ah,3dh
mov al,2
lea dx,address
int 21h
jnc y2
mov ah,3ch
mov cx,00
lea dx,address
int 21h
jc exit10
y2:
mov fcode,ax
mov bx,fcode
lea si,stu
y1:
lea di,temp
mov cx,30
rep movsw
lea dx,temp
mov cx,60
mov ah,40h
int 21h
sub count,1
jnz y1
lea dx,end1
mov cx,2
mov ah,40h
int 21h
mov bx,fcode
mov ah,3eh
int 21h
exit10:
ret
close endp
;----------------打开文献-------------------
open proc near
lea dx,address
mov ah,3dh
mov al,02
int 21h
jc p9 ;不存在则创立文献
mov fcode,ax ;保存文献代号
p1:
mov ah,3fh
mov bx,fcode
mov cx,60 ;读取文献记录数(一条记录)
lea dx,temp
int 21h
jc p9
mov bl,temp
cmp bl,' '
jz p6 ;读取结束
;;
lea si,temp
mov cx,30
rep movsw
inc count1
jmp p1
p9:
displ mess13
p6:
mov bx,fcode
mov ah,3eh
int 21h
ret
open endp
;------------------------删除模块-------------------------
delet proc near
mov si,stu1
mov endaddr,si
call search
cmp bp,1
jae p3
ret
p3:
cmp bp,3
jae p4
mov di,del[bp]
jmp l1
p4:
displ mess17
call inputnum
cmp bx,bp
jbe p5
displ crlf
displ mess7
jmp p4
p5:
mov di,del[bx]
l1:
displ crlf
displ mess16
mov ah,01h
int 21h
cmp al,'y'
jz d1
cmp al,'Y'
jz d1
cmp al,'n'
jz exit7
cmp al,'N'
jz exit7
displ mess7
jmp l1
d1:
mov si,di
add si,60
d2:
mov cx,30
rep movsw
cmp si,endaddr
jnbe p01
jmp d2
p01:
sub stu1,60
sub count1,1
displ crlf
displ mess18
displ crlf
exit7:
ret
delet endp
;------------------------查找模块------------------------
search proc near
mov ah,count1
mov count,ah
mov bp,0
cld
displ mess10
call inputname1 ;输入要查找人名
call namesearch
cmp bp,0
jbe s2
jmp exit6
s2:
displ mess15
exit6:
ret
search endp
;-----------------计算要删除是哪一种-----------------------------
inputnum proc near
mov bx,0
it1:
mov ah,1
int 21h
mov dl,al
sub al,30h
jl exit1 ;输入为零
cmp al,9D
jg exit1
cbw
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
add bx,ax
jmp it1
exit1:
mov ax,bx
mov bl,2
mul bl
mov bx,ax
ret
inputnum endp
;-----------------------查找姓名函数模块输入-----------
inputname1 proc near
mov ah,0ah
lea dx,namepar
int 21h
displ crlf
mov bh,0
mov bl,actnlen
mov cx,10
sub cx,bx
in21:
mov _name[bx],20h
inc bx
loop in21
ret
inputname1 endp
;-------------------------姓名搜索-----------------
namesearch proc near
lea si,stu
add si,10 ;指向记录第一种人姓名
mov bx,si
nase10:
lea di,_name ;存储待查人姓名地址
mov cx,5
repe cmpsw
jcxz naseexit
jmp nase20
naseexit:
mov si,bx
sub si,10
add bp,2
mov del[bp],si
lea di,temp
mov cx,30
rep movsw
displ temp
nase20:
add bx,60
mov si,bx
dec count
jnz nase10
ret
namesearch endp
;------------------------排序模块---------------------
namesort proc near
cmp count1,1
jbe exit5
mov di,stu1
sub di,110 ;调节指针
mov endaddr,di ;调节指针指向倒数第二个名字
NS1
展开阅读全文