微机原理
课 程 设 计 报 告
学
姓
学
专
班
级:
指导教师:
号: 200604135156
名:
朱 庆 春
院: 信息科学与工程学院
业: 电子信息工程
0605 班
熊 庆 国
一、 课程设计目的
运用所学的汇编语言写一个具有电话本功能的程序,达到提高动手能力及解
决问题的能力。
二、 设计要求
1、能够存储 50 个电话号码,包括人名(20 个字符)、电话号码(8 个字符)。
2、系统可以随时接受新的人名和电话号码。
3、具有随时查询号码的功能。要求输入人名后,在屏幕上显示相应的电话
号码。
4、具有删除号码的功能。要求输入人名后,系统自动删除相应的号码。
5、运行此系统后,要显示菜单选择的功能。
三、 程序设计思想
每个人的信息包括人名和号码,人名占 20 个字节,外加一个$字符,电话号
码占 8 个字节,外加一个$字符,所以每个人的信息一共占 30 个字节。可以开辟
一片连续的存储区,包含 30*50 即 1500 个字节,
即 ZHU DB 1500 DUP(0)。
另外再定义四个需要输入信息的变量,依次为:
ZHU1 DB 21,0,21 DUP(0)
ZHU2 DB 21,0,21 DUP(0)
ZHU3 DB 9,0,9 DUP(0)
ZHU4 DB 21,0,21 DUP(0)
;搜索姓名变量
;添加姓名变量
;添加号码变量
;删除姓名变量
添加新的人名和号码时,可以通过 10 号功能调用,先将人名和号码暂时存
放在 ZHU2 和 ZHU3 中,然后在逐字节地复制到 ZHU 中,记住在人名和号码末尾
加上$字符。查询号码时,将输入的要查询的人名存放在 ZHU1 中,然后再每隔
30 个字节与 ZHU 中的人名逐个字符地比较,若完全相等,则将人名下面的号码
输出,否则说明要查询的人名不存在。删除时,先输入要删除的人名,同查询相
似,按同样的方法在 ZHU 中寻找相应的数据区,若找到了,则从找到时下面一个
人的信息开始,统一向上移动 30 个字节,若没有找到,则说明要删除的人名的
信息不存在。
四、 程序框图
2
五、程序清单
DATAS SEGMENT
OBF1 DB 'Welcome to use this phone book!$'
OBF2 DB 'Please choose the function buttom(1/2/3):$'
OBF11 DB '1 for inputing$'
OBF16 DB '2 for searching$'
OBF17 DB '3 for deleting$'
OBF18 DB 'Other for exiting$'
OBF3 DB 'Please input a new name(within 20 words):$'
OBF4 DB 'please input the number(within 8 numbers):$'
OBF5 DB 'Continue to input?(y/n)$'
OBF6 DB 'Are you sure to end the phone book?(y/n)$'
OBF7 DB 'Please input a name you want to search(within 20 words):$'
OBF8 DB 'Got it,it is:$'
OBF9 DB 'Have not found ,it does not exit!$'
OBF10 DB 'Continue to search?(y/n)$'
OBF12 DB 'Please input the name you want to delete(within 20 words):$'
OBF13 DB 'The name you want to delete does not exit!$'
OBF14 DB 'Success to delete!$'
OBF15 DB 'Continue to delete?(y/n)$'
ZHU1 DB 21,0,21 DUP(0)
ZHU2 DB 21,0,21 DUP(0)
ZHU3 DB 9,0,9 DUP(0)
ZHU4 DB 21,0,21 DUP(0)
ZHU DB 1500 DUP(0)
;搜索(查询)姓名变量
;添加姓名变量
;添加号码变量
;删除姓名变量
DATAS ENDS
STACKS SEGMENT
DW 32 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATAS
MOV DS,AX
MOV BP,-30
BEGIN:CALL NEXTLINE
MOV DX,OFFSET OBF1
MOV AH,9
INT 21H
CALL NEXTLINE
MOV DX,OFFSET OBF2
MOV AH,9
;显示菜单选择界面
;调用换行函数
3
INT 21H
CALL NEXTLINE
MOV DX,OFFSET OBF11
MOV AH,9
INT 21H
CALL NEXTLINE
MOV DX,OFFSET OBF16
MOV AH,9
INT 21H
CALL NEXTLINE
MOV DX,OFFSET OBF17
MOV AH,9
INT 21H
CALL NEXTLINE
MOV DX,OFFSET OBF18
MOV AH,9
INT 21H
CALL NEXTLINE
MOV AL,0
MOV AH,1
INT 21H
CMP AL,'1'
JE INPUT
CMP AL,'2'
JE SEARCH
CMP AL,'3'
JE DELETE
JMP STOP
;选择1,输入信息
;选择2,查询信息
;选择3,删除信息
INPUT: CALL NEXTLINE
ADD BP,30
MOV SI,BP
S2:MOV BYTE PTR ZHU[SI],0
INC SI
CMP [SI],0
JNE S2
MOV SI,BP
MOV DX,OFFSET OBF3
MOV AH,9
INT 21H
MOV DX,OFFSET ZHU2
MOV AH,10
INT 21H
MOV BX,-1
;清除ZHU中最后一个人的信息后面的30
个字节中非0的单元
;
;输入的人名存放在ZH2中
4
S5:INC BX
CMP BYTE PTR ZHU2[BX+2],0DH
JNE S5
;为避免ZHU2中刚输入的信息没有完全覆
;盖上一次的信息,将出车符(0DH)及其后
;面的字节归0
S6:MOV BYTE PTR ZHU2[BX+2],0
INC BX
CMP BX,20
JNE S6
MOV BYTE PTR ZHU2[BX+2],0DH
MOV CX,20
MOV BX,-1
S1:INC BX
;将ZH2复制到ZHU中
MOV DL,BYTE PTR ZHU2[BX+2]
MOV BYTE PTR ZHU[SI+BX],DL
LOOP S1
MOV BYTE PTR ZHU[SI+20],'$'
CALL NEXTLINE
MOV DX,OFFSET OBF4
MOV AH,9
INT 21H
MOV DX,OFFSET ZHU3
MOV AH,10
INT 21H
MOV BX,-1
S7:INC BX
;为避免刚输入的号码没有完全覆盖上一次的号码,将这次输
CMP BYTE PTR ZHU3[BX+2],0DH ; 入的号码的最后一位的回车符(0DH)换成$
JNE S7
MOV BYTE PTR ZHU3[BX+2],'$'
ADD SI,21
MOV CX,8
MOV BX,-1
S3:INC BX
MOV DL,BYTE PTR ZHU3[BX+2]
MOV BYTE PTR ZHU[SI+BX],DL
LOOP S3
MOV BYTE PTR ZHU[SI+8],'$'
CALL NEXTLINE
MOV DX,OFFSET OBF5
MOV AH,9
INT 21H
CALL NEXTLINE
MOV AH,1
INT 21H
CMP AL,'Y'
JE INPUT
5
STOP:
CMP AL,'y'
JE INPUT
JMP BEGIN
CALL NEXTLINE
MOV DX,OFFSET OBF6
MOV AH,9
INT 21H
MOV AL,0
MOV AH,1
INT 21H
CMP AL,'Y'
JE EXIT
CMP AL,'y'
JNE BEGIN
EXIT:MOV AX,4C00H
INT 21H
SEARCH:CALL NEXTLINE
MOV DX,OFFSET OBF7
MOV AH,9
INT 21H
MOV DX,OFFSET ZHU1
MOV AH,10
INT 21H
MOV BX,-1
;退出电话本程序
;输入你要搜索的名字,存放在ZHU1中
L5:INC BX
;为避免 ZHU1 刚输入的信息没有完全覆盖上一次的信息,
CMP BYTE PTR ZHU1[BX+2],0DH ;将回车符(0DH)及其后面的字节归0
JNE L5
L6:MOV BYTE PTR ZHU1[BX+2],0
INC BX
CMP BX,20
JNE L6
MOV BYTE PTR ZHU1[BX+2],0DH
CALL NEXTLINE
MOV CX,50
MOV SI,-30
L1:ADD SI,30
MOV BX,-1
L2:INC BX
CMP BX,20
JE L3
PUSH AX
MOV AL,BYTE PTR ZHU[SI+BX]
;在ZHU中搜索与ZHU1相等的字符串
6
MOV AH,BYTE PTR ZHU1[BX+2]
CMP AL,AH
POP AX
JE L2
LOOP L1
MOV DX,OFFSET OBF9
MOV AH,9
INT 21H
JMP L4
;没有搜索到
L3:MOV DX,OFFSET OBF8
;搜索到了
MOV AH,9
INT 21H
INC BX
ADD BX,OFFSET ZHU
ADD BX,SI
MOV DX,BX
MOV AH,9
INT 21H
L4:CALL NEXTLINE
MOV DX,OFFSET OBF10
MOV AH,9
INT 21H
MOV AL,0
MOV AH,1
INT 21H
CMP AL,'Y'
JE SEARCH
CMP AL,'y'
JE SEARCH
JMP BEGIN
DELETE:CALL NEXTLINE
MOV DX,OFFSET OBF12
MOV AH,9
INT 21H
MOV DX,OFFSET ZHU4
MOV AH,10
INT 21H
MOV BX,-1
;继续搜索吗?
;输入你要删除的名字,存放在ZHU4中
D6:INC BX
;为避免 ZHU4 刚输入的信息没有完全覆盖上一次的信息,
CMP BYTE PTR ZHU4[BX+2],0DH ;将回车符(0DH)及其后面的字节归0
JNE D6
D7:MOV BYTE PTR ZHU4[BX+2],0
INC BX
7
CMP BX,20
JNE D7
MOV BYTE PTR ZHU4[BX+2],0DH
CALL NEXTLINE
MOV CX,50
MOV SI,-30
D1:ADD SI,30
MOV BX,-1
D2:INC BX
CMP BX,20
JE D3
PUSH AX
MOV AL,BYTE PTR ZHU[SI+BX]
MOV AH,BYTE PTR ZHU4[BX+2]
CMP AL,AH
POP AX
JE D2
LOOP D1
MOV DX,OFFSET OBF13
MOV AH,9
INT 21H
JMP D5
D3:PUSH AX
D4:MOV AL,BYTE PTR ZHU[SI+30]
MOV BYTE PTR ZHU[SI],AL
INC SI
CMP [SI],0
JNE D4
POP AX
SUB BP,30
MOV DX,OFFSET OBF14
MOV AH,9
INT 21H
D5:CALL NEXTLINE
MOV DX,OFFSET OBF15
MOV AH,9
INT 21H
MOV AL,0
MOV AH,1
INT 21H
CMP AL,'Y'
JE DELETE
CMP AL,'y'
JE DELETE
;你要删除的姓名不存在
;删除成功!
;要继续删除吗?
8