汇编实验-查找电话号码_第1页
汇编实验-查找电话号码_第2页
汇编实验-查找电话号码_第3页
汇编实验-查找电话号码_第4页
汇编实验-查找电话号码_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验四 查找电话号码一、 实验的目的与要求(一)实验目的:学习用汇编语言设计与编写子程序,理解子程序的调用过程。(二) 实验要求:(1) 要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分;(2) 程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;(3) 凡有新的输入后,程序应按人名对电话号码表重新排序;(4) 程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。 name tel X X X X X X X X二、实验正文 实验分析:查找电话号码程序设计,应注意子程序的设计,合理的设计子程序

2、,使程序思路更清晰,便于设计。实验涉及查找排序,对程序设计提出了更高的要求,数据结构采用二维数组来存储电话信息,还应设置变量用于排序以及查找等子功能的实现。核心的子功能是排序和查找功能,排序采用冒泡排序,并设置标志位,以便提高程序效率,排序时应当注意的是数据段的截止地址,以防发生越界错误。在排序时也嵌套调用子过程交换,此时应该注意,源地址寄存器和目的地址寄存器的变化。查找的功能其实是对电话本的每一项的姓名进行匹配。显示电话本内容是把电话本的每一项先放在一个变量里面,然后显示,直到全部取出为止。由于字符串的操作较多,多次使用si和di寄存器,再适当时候应注意压栈。保存必要的信息,否则会发生越界等

3、严重错误。三、流程图如下:四、实验结果附录:程序源代码如下:;*8data_seg segment namcount dw 0 ;the number count tel_tab db 50 dup(28 dup(' ') ;the telbook nameitem label byte ; store namemax1 db 21 ncurlen db ? namefld db 21 dup(?) phoneitem label byte;store numer max2 db 9 pcurlen db ? phonefld db 9 dup(?) addend dw ? ;

4、排序时的tel_tab尾地址指针 namtemp db 28 dup(?),13,10,'$' swap db 0 ;排序中是否有交换的标志位 msg_count db 'Do you want to insert a item to phonebook?(Y/N)',13,10,'$' msg_error db 'Error!Please enter the requested.',13,10,'$' msg_inputnam db 'Input name:','$' msg_in

5、putnum db 'Input a telephone number:','$' msg_inquire db 'Do you want a telephone number?(Y/N)','$' msg_sname db 'name?',13,10,'$' msg_outtitle db 'name tel.',13,10,'$' msg_nomatch db 'NOt EXIT!',13,10,'$' msg_allphone d

6、b 'print all RECORD?(Y/N)',13,10,'$' msg_result db 'name tel.',13,10,'$' data_seg ends ;*stack_seg segment para stack 'stack' ;定义堆栈段 dw 256 dup(0) stack_seg ends ;*code_seg segment ;-main proc far assume cs:code_seg,ds:data_seg,es:data_seg,ss:stack_seg start:

7、mov ax,data_seg mov ds,ax ;初始化数据段 mov es,ax ;初始化附加段 xor bx,bx cld lea di,tel_tab ;名字表的首地址放入di a1: lea dx,msg_count mov ah,9 int 21h ;显示信息是否插入一项纪录?(Y/N)' mov ah,1 int 21h mov bl,al call crlf cmp bl,'n' ;判断输入 jz a2 cmp bl,'N' jz a2 cmp bl,'y' jz next0 cmp bl,'Y' jz

8、next0 mov ah,9 lea dx,msg_error int 21h jmp a1next0:lea dx,msg_inputnam mov ah,9 int 21h ;要求输入名字 call input_name ;调用input_name输入人名 call stor_name ;调用stor_name存储人名 call input_phone ;调用input_phone输入电话 call name_sort ;排序 jmp a1 ;是否继续输入? a2: lea dx,msg_inquire mov ah,9 int 21h ;显示是否查找电话号码 mov ah,1 int 2

9、1h mov bl,al call crlf cmp bl,'n' jz a3 cmp bl,'N' jz a3 cmp bl,'y' jz next1 cmp bl,'Y' jz next1 mov ah,9 lea dx,msg_error int 21h jmp a2next1:lea dx,msg_sname mov ah,9 int 21h ;显示要查询电话的姓名 call input_name ;输入姓名 call name_search jmp a2 a3: lea dx,msg_allphone ;显示所有电话号码

10、 mov ah,9 int 21h mov ah,1 int 21h mov bl,al call crlf ;回车换行 cmp bl,'n' jz exit cmp bl,'N' jz exit cmp bl,'y' jz next2 cmp bl,'Y' jz next2 mov ah,9 lea dx,msg_error int 21h jmp a3next2: call printline ;调用子程序打印出所有的电话号码exit: ret main endp ;- input_name proc near ;子程序 接受

11、输入字符 lea dx,nameitem mov ah,0ah int 21h call crlf ;回车换行 mov bh,0 mov bl,ncurlen mov cx,21 sub cx,bx repeat1:mov namefldbx,20h inc bx loop repeat1 ;输入的名字为20字节,不足的用空格补足 ret input_name endp ;-stor_name proc near ;子程序传送名字的每个字母到si inc namcount cld lea si,namefld mov cx,20 rep movsb ret stor_name endp ;-i

12、nput_phone proc near ;子程序(输入电话号码) lea dx,msg_inputnum mov ah,9 int 21h ;显示要求输入电话号码 lea dx,phoneitem mov ah,10 int 21h mov bh,0 mov bl,pcurlen mov cx,9 sub cx,bx repeat2:mov phonefldbx,20h inc bx loop repeat2 call crlf cld lea si,phonefld mov cx,8 rep movsb ;把输入的号码存入namtab表中 ret input_phone endp ;-na

13、me_sort proc near ;子程序 push di push ax push bx cmp namcount,1 jz exit4 ;比较名字个数是否为一个s1: mov swap,0 sub di,56 mov addend,di lea si,tel_tab s2: mov cx,20 mov di,si add di,28 mov ax,di mov bx,si repe cmpsb jbe s3 call exchange s3: mov si,ax cmp si,addend jbe s2 cmp swap,0 ;如果有交换,继续下一趟 jnz s1 exit4: pop

14、bx pop ax pop di ret name_sort endp ;-exchange proc near ;交换tel_tab中di,si所指表项的内容 mov cx,28 lea di,namtemp mov si,bx rep movsb mov cx,28 mov di,bx rep movsb mov cx,28 lea si,namtemp rep movsb mov swap,1 ret exchange endp ;-name_search proc near ;查找输入的名字 lea di,tel_tab push di mov bx,namcount loop1: l

15、ea si,namefld mov cx,20 repe cmpsb ;连续查找匹配名字 je found ;找到跳转found pop di ;没找到di出栈 add di,28 push di dec bx jnz loop1 lea dx,msg_nomatch mov ah,9 int 21h ;没有找到输出信息 found: pop di lea dx,msg_outtitle mov ah,9 int 21h mov si,di lea di,namtemp mov cx,28 rep movsb lea dx,namtemp mov ah,9 int 21h ;显示查到的姓名和电

16、话号码 ret name_search endp ;-printline proc near ;输出排序结果 push di push namcount call crlf ;回车换行 lea dx,msg_result mov ah,9 int 21h ;显示升序输出姓名、电话 lea si,tel_tab loop2: lea di,namtemp mov cx,28 rep movsb lea dx,namtemp mov ah,9 int 21h ;显示姓名、电话 dec namcount jnz loop2 ;循环输出 pop namcount pop di ret printline endp ;-crlf proc near ;回车换行 mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp;-code_seg ends ;*end main 五、实验总

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论