IBM-PC汇编语言
程序设计实验报告
(四)
姓名:周义
学号:12125800
老师:杨洪斌
一、实验目的
学习用汇编语言设计与编写子程序
二、实验要求
(1) 要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分;
(2) 程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;
(3) 凡有新的输入后,程序应按人名对电话号码表重新排序;
(4) 程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。
name tel.
X X X X X X X X
三、实验提示:
(1)显示提示符 ’Input name:’;
(2)调用子程序 input_name 接收人名;
(3)调用子程序 stor_name 把人名存入电话号码表 tel_tab 中:
(4)显示提示符 ’Input a telephone number:’;
(5)调用子程序 inphone 接收电话号码,并把它存入电话号码表tel_tab中;
(6)如输入已结束则调用 name_sort 子程序对电话号码表接人名排序;
(7)显示提示符 ’Do you want a telephone number ?(Y/N)’;
(8)回答N收退出程序;
(9)回答Y则再显示提示符 ’name ?’;
(10)调用子程序 input_name接收人名;
(11)调用子程序 name_search 在电话号码表中查找所要的电话号码;
(12)调用子程序 printline 按要求格式显示人名及电话号码;
(13)重复查号提示符直至用户不要求查号为止。
四、实验程序
datarea segment
tel_name label byte
maxnlen db 20
namelen db ?
namefld db 21 dup(?) ;定义20个字符的用于存放人名的字符串
tel_num label byte
maxtlen db 8
tellen db ?
telfld db 9 dup(?) ;定义8个字符的用于存放电话号码的字符串
tel_tab db 50 dup(20 dup(' '), 8 dup(' ')) ;定义可存放50项纪录的电话号码表
tel_sav db 28 dup(?), 13, 10, '$'
list db 20 dup(' '), 8 dup(' '), 0dh, 0ah, '$' ;定义电话号码表的每个条目
string1 db 'Input name:', '$'
string2 db 'Input a telphone number:', '$'
string3 db 'Do you want a telephone number?(Y/N)', '$'
string4 db 'name?', '$'
string5 db 'Would you like to input a telephone list?(Y/N)', '$'
string6 db 'The Tel_Lab is empty.', '$'
string7 db 'There is no list fitting.', '$'
string8 db 'name tel. ', '$'
string9 db 'Do you want a Tel_Lab?(Y/N)', '$'
endadd dw ?
swapped db 0
tel_count db 0 ;计算电话号码表中的条目数量
datarea ends
prognam segment
main proc far ;主程序
assume cs: prognam, ds: datarea, es: datarea
start:
push ds
sub ax, ax
push ax
mov ax, datarea
mov ds, ax
mov es, ax
cld
lea di, tel_tab ;将电话号码表传给目的变址寄存器
cho_inp: ;进行选择,是否输入条目
mov ah, 09
lea dx, string5
int 21h ;输出“Would you like to in put a telephone list?(Y/N)”
mov ah, 01
int 21h ;输入,进行选择
mov dl, 4eh
cmp al, dl
je sort_n ;若输入为N,则跳转至sort_n,进行电话号码表的排序
mov dl, 6eh
cmp al, dl
je sort_n ;若输入为n,则同上
mov dl, 59h
cmp al, dl
je input_n ;若输入为Y,则跳转至input_n,进行电话号码条目的输入
mov dl, 79h
cmp al, dl
je input_n ;若输入为y,则同上
mov ah, 02
mov dx, 0dh
int 21h
mov dx, 0ah
int 21h
jmp cho_inp ;若输入不为Y(y)/N(n),则返回cho_inp,重新进行选择
input_n: ;输入人名,并保存
mov ah, 02
mov dx, 0dh
int 21h
mov dx, 0ah
int 21h
mov ah, 09
lea dx, string1
int 21h ;输出“Input name:”
call input_name ;调用子程序input_name接收人名
call stor_name ;调用子程序stor_name把人名存入电话号码表tel_tab中
input_p: ;输入电话号码,并保存
lea dx,string2
mov ah, 09
int 21h ;输出“Input a telephone number:”
call inphone ;调用子程序inphone接收电话号码,并把它存入电话号码表tel_tab中
jmp cho_inp ;跳转至cho_inp,按提示选择是否继续输入条目
sort_n: ;对电话号码表进行排序
mov ah, 02
mov dx, 0dh
int 21h
mov dx, 0ah
int 21h
call name_sort ;调用子程序name_sort,对电话号码表按人名排序
print_lab: ;输出整个电话号码表
lea dx, string9
mov ah, 09
int 21h ;输出“Do you want a tel_lab?(Y/N)”
mov ah, 01
int 21h ;输入,进行选择
mov cl, al
mov ah, 02
mov dl, 0dh
int 21h
mov ah, 02
mov dl, 0ah
int 21h
mov al, cl
mov dl, 4eh
cmp al, dl
je search_n ;若输入为N,则跳转至search_n,进行电话号码的查找
mov dl, 6eh
cmp al, dl
je search_n ;若输入为n,则同上
mov dl, 59h
cmp al, dl
je goon_p ;若输入为Y,则跳转至goon_p,继续该部分操作
mov dl, 79h
cmp al, dl
je goon_p ;若输入为y,则同上
jmp print_lab ;若输入不为Y(y)/N(n),则跳转至print_lab,重新进行选择
goon_p: ;继续输出电话号码表的操作
call printall ;调用子程序printall,输出整个电话号码表
search_n: ;查找电话号码条目
lea dx, string3
mov ah, 09
int 21h ;输出“Do you want a telephone number?(Y/N)”
mov ah, 01
int 21h ;输入,进行选择
mov cl, al
mov ah, 02
mov dl, 0dh
int 21h
mov ah, 02
mov dl, 0ah
int 21h
mov al, cl
mov dl, 4eh
cmp al, dl
je exit ;若输入为N,则跳转至exit,退出程序
mov dl, 6eh
cmp al, dl
je exit ;若输入为n,则同上
mov dl, 59h
cmp al, dl
je goon_s ;若输入为Y,则跳转至goon_s,继续该部分操作
mov dl, 79h
cmp al, dl
je goon_s ;若输入为y,则同上
jmp search_n ;若输入不为Y(y)/N(n),则跳转至search_n,重新进行选择
goon_s: ;继续查找操作
lea dx, string4
mov ah, 09
int 21h ;输出“name?”
mov ah, 02
mov dl, 0dh
int 21h
mov ah, 02
mov dl, 0ah
int 21h
call input_name ;调用子程序input_name,接收人名
call name_search ;调用子程序name_search,对电话号码表按人名进行查找
jmp search_n ;跳转至search_n,继续进行查找
exit: ;退出程序
ret
main endp
input_name proc near ;子程序input_name,用于接受人名
mov ah, 0ah
lea dx, tel_name
int 21h ;输入人名
mov ah, 02h
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
mov bh, 0
mov bl, namelen
mov cx, 20
sub cx, bx
namebrk: ;将人名除外所剩下的字符用空格填满
mov namefld[bx], 20h
inc bx
loop namebrk
ret
input_name endp
stor_name proc near ;子程序stor_name,用于把人名存入电话号码表tel_tab中
inc tel_count ;将人名存入电话号码之后,电话号码条目数量增1
cld
lea si, namefld
mov cx, 10
rep movsw
ret
stor_name endp
inphone proc near ;子程序inphone,用于接受电话号码,并把它存入电话号码表tel_tab中
mov ah, 0ah
lea dx, tel_num
int 21h ;输入电话号码
mov ah, 02h
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
mov bh, 0
mov bl, tellen
mov cx, 8
sub cx, bx
telbrk: ;将电话号码数字除外,所剩下的字符用空格填满
mov telfld[bx], 20h
inc bx
loop telbrk
cld
lea si, telfld
mov cx, 4
rep movsw
ret
inphone endp
name_sort proc near ;子程序name_sort,用于对电话号码表按人名排序
sub di, 56
mov endadd, di
cmp al, 0
je empty
start_sort:
mov swapped, 0
lea si, tel_tab
cmp_n:
mov cx, 20
mov di, si
add di, 28
mov ax, di
mov bx, si
repe cmpsb
jbe no_exchg
call exchange_name ;调用子程序exchang_name,将两个相邻的条目进行对调
jmp no_exchg
empty: ;若电话号码表为空
mov ah, 09
lea dx, string6
int 21h ;输出“The tel_lab is empty.”
jmp exit_sort
no_exchg: ;不进行对调
mov si, ax
cmp si, endadd
jbe cmp_n
cmp swapped, 0
jnz start_sort
exit_sort:
ret
name_sort endp
exchange_name proc near ;子程序exchange_name,用于将电话号码表中的两个相邻的条目进行对调
mov cx, 14
lea di, list
mov si, bx
rep movsw
mov cx, 14
mov di, bx
rep movsw
mov cx, 14
lea si, list
rep movsw
mov swapped, 1
ret
exchange_name endp
name_search proc near ;子程序name_search,用于按人名在电话号码表中查找所要的电话号码
push di
mov al, tel_count
lea si, tel_tab
again:
cmp al, 0
je no_list
mov cx, 20
lea di, namefld
mov bx, si
repz cmpsb
jb find_n
ja no_list
dec al
mov ah, 09
lea dx, string8
int 21h ;输出“name tel. ”
mov ah, 02
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
call printline ;调用子程序printline,输出所查找到的条目
jmp exit_sch
find_n:
mov si, bx
add si, 28
jmp again
no_list: ;若不存在该条目
mov ah, 09
lea dx, string7
int 21h ;输出“There is no list fitting.”
mov ah, 02
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
exit_sch:
pop di
ret
name_search endp
printline proc near ;子程序printline,用于输出所查找到的电话号码条目
mov si, bx
lea di, list
mov cx, 14
rep movsw
mov ah, 09
lea dx, list
int 21h
ret
printline endp
printall proc near ;子程序printall,用于输出整个电话号码表
push di
mov ah, 09
lea dx, string8
int 21h
mov ah, 02
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
mov bl, tel_count
cmp bl, 0
je empty_lab
lea si, tel_tab
next:
lea di, list
mov cx, 14
rep movsw
mov ah, 09
lea dx, list
int 21h
dec bl
jnz next
jmp exit_pall
empty_lab:
mov ah, 09
lea dx, string6
int 21h
exit_pall:
pop di
ret
printall endp
prognam ends
end start
五、模块说明
主函数main:用来显示用户操作提示,调用子模块,使程序完成查找电话号码的过程
接收人名函数input_name:输入人名,将此人名保存至缓冲区,并用空格补足
保存人名函数stor_name:将人名从缓冲区中取出,保存在电话号码表中的人名区中
接收并且保存电话号码函数inphone:输入电话号码,将此电话号码保存至缓冲区,并用空格补足,然后,将电话号码从缓冲区中取出,保存在电话号码表中的电话号码区中
电话号码表排序函数name_sort:运用冒泡法,对电话号码表按人名排序
对调条目位置函数exchange:将不符合排序规律的条目的位置进行调整
查找电话号码函数name_search:输入人名,在电话号码表中依次比较人名进行查找
输出电话号码条目函数printline:查找到条目之后,将条目输出
输出电话号码表函数printall:将整个电话号码表的所有条目依次输出
六、模块层次图
七、调试结果
实验一汇编语言的源程序的输入一实验目的1通过实验了解和熟悉微机系统的配置2学习在DEBUG状态下输入汇编源程序的方法3初步掌握调试…
学生实验报告册20xx20xx学年第1学期实验名称汇编语言程序设计学院信息与电气工程学院班级09级计算机科学与技术2班学号1351…
汇编语言实验报告姓名专业软件工程班级093班学号099074235STARTMOVAXDATASMOVDSAXmovbxoffse…
HarbinInstituteofTechnologyatWeihai汇编语言实验报告实验一第一部分dubug用法一问题描述上机前…
福建农林大学金山学院课程名称姓名系专业年级学号指导教师职称程序设计类课程实验报告汇编语言庄建军信息与机电工程电子信息工程专业20x…
实验七分支程序实验目的1掌握利用间接转移指令JMPBX实现多岔分枝的方法2宏替换指令MACRO及ENDM3符号扩展指令CBW实验程…
一实验内容1DEBUG的启动及其基本命令的使用2内存操作数与寻址方式1利用DEBUG程序中的E命令将两个多字节数12345678H…
汇编语言程序设计实验报告学院计算机科学与技术专业计算机科学与技术指导教师班级学号姓名实验一集成环境及调试工具一实验题目认识Tdde…
计算机组成原理与汇编语言实验20xx指导教师签名一实验原理基本知识简单介绍算法流程计算机组成原理与汇编语言实验20xx计算机组成原…
汇编语言程序设计学习总结与心得班级09计本3班学号0姓名刘得分本学期学习了汇编语言汇编语言是面向机器的程序设计语言在汇编语言中用助…
汇编语言程序设计第一次上机作业1.从键盘上接受一个字符,找出他的前导字符和后继字符,按顺序显示这三个字符。寄存器分配:AL:存输入…