实验4:(电话本)

要求:

可放50项的电话号码表,每项中有姓名(20)和电话号码(8),存放联系人,并且进行排序。并完成添加电话,根据姓名查询电话,显示输出等功能

算法设计:

①数据结构:可放50项的电话号码表,每项中有姓名(20)和电话号码(8)。数据定义则用tel_tab  db 50 dup(20 dup(' '),8 dup(' ')),即可满足,每项用空白符初始化

②.1存放输入的数据:tel_name和tel_num分别存放用户输入的姓名和电话号码。di初始化为电话簿tel_tab的首地址,使用movsb完成字符串的赋值,因此,di指向传送的目标地址,si为源地址,cx赋值为传送的字节数,转送名字时,cx=20,传送电话时,cx=8。循环输入电话簿项中di会跟着movsb而变化,代表接下来用户传送的目标位置,而si每次需重置为缓存区的首地址。这样就完成了用户输入的名字电话存到tel_tab中。在此基础上,完成排序等功能。

②.2.用户输入缓冲区中的数据需要将剩下的空间用空格代替,具体原因会在讨论与结论中说明。主要原因是,用户输入的字符串一般为回车符结尾,倘若连回车符也一起赋到了tel_tab中,则在输出tel_tab中会完成了输出电话簿信息的效果。所以每次输入姓名和电话时,要把缓存区剩余空间(包括回车符)一起用空白符填满,空白符填入的个数=总长度-输入字符的长度

③、排序:每次名字转入电话簿后都要对电话簿进行重新排序(字典序)。采用排序的最佳方法是插入排序,因为每次插入数据时,tel_tab中的数据都已经排好了,只要找到比用户输入名字大的电话簿项时,将次内存后的所有数据都向后移28个字节,然后再把名字和电话存入该位置。

④、输出:起始地址tel_tab,每输出28个字符换行回车。

程序实现:(代码见附录)

①、输入名字和电话,剩余用空白符代替:调用inputname和inputtel子程序即可。

②、将tel_name和tel_num存入tel_tab中,调用stor_name和stor_mun,子程序。主要采用movsb命令符

③、指定字符串后移28个字节: moveto28byte子程序,因为电话簿每一项长度为28个字节,所以cx赋值28,然后si字符串首地址,di=si+28,使用movsb传送

④、插入排序:需要一个变量tel_count来存放电话簿项个数,当插入数据时比较到比自己大时,从电话簿最后一项开始,每一项调用moveto28byte子程序,然后再将数据放到电话簿中

⑤、输出电话簿:cx=28*tel_count。

⑥、查询名字并输出:用sea_name缓冲区存放要查询的名字(记得用空白符将剩下空间填满)。匹配两字符串是否相等,教课书上有代码就不再多说,把名字都遍历一遍,如果匹配成功,另匹配到的名字首地址加上20个字节,即为对应的电话号码首地址,将其输出即可。

DATAS SEGMENT;此处输入数据段代码  tel_name db 20namelen    db 0namefld     db 20 dup(?)tel_num  db 8numlen   db 0numfld   db 8 dup(?)tel_tab  db 50 dup(20 dup(' '),8 dup(' '))tel_count db 0pushunit db 0turnnewline db 28string1  db 'Input name:$'string2  db 'Input a telephone number:$'string3  db 'Please add telephone into table(n/y)$'string4  db 'search telephone by name:$ 'string5  db 'noresult$'strSeaName db 20           ;根据名字查询电话seanamelen db 0seanamefld  db 20 dup(?)outputname  db 0         ;查询电话时记录匹配不成功的次数
DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AXmov es,axcldlea di,tel_tab;   输出Inputname
addphone:mov dx,offset string3call print    mov ah,01hint 21hcall printnewline;cmp al,59h;jne  searchphonecmp al,79hjne  printtable    ;如果键入不是y或Y则进入查询号码mov dx,offset string1call print       call Inputnamecall stor_name    ;把名字存放在tel_tab中mov dx,offset string2call printcall inputtelcall stor_num     ;把电话存放在tel_tab中call name_sort    ;排序jmp addphone
printtable:  ;打印电话簿lea  bx,tel_tab;lea  dx,tel_tab;call moveto28bytemov al,tel_countmov ah,28mul ahmov cx,ax
printtableline:mov dl,[bx]mov ah,02hint 21hinc bxdec turnnewlinemov al,turnnewline  cmp al,0jne nochange1mov turnnewline,28call printnewline
nochange1:  loop printtableline
namesearch:     ;查询电话mov dx,offset string4call print    lea dx,strSeaNamecall cincall printnewlinemov bl, seanamelenmov cx, 20sub cx, bx
namebrk1: ;将人名除外所剩下的字符用空格填满mov seanamefld[bx], 20hinc   bxloop  namebrk1 ;比较字符串大小mov cl,tel_count
lastp:
push cxmov si,offset seanamefldmov di,offset tel_tab ;+outputname*28mov al,outputnamemov bl,28mul bladd di,axmov cx,20cld
lastagain: cmpsbjnz lastunmatloop lastagain;匹配成功mov al,0jmp lastoutput
lastunmat: mov al,-1
pop cxinc outputnameloop lastp
lastoutput: cmp al,0jne noresultmov cx,8
matchname:mov dl,[di]mov ah,02hint 21hinc diloop matchnamejmp stop
noresult:mov dx,offset string5call print    stop:MOV AH,4CHINT 21H;其他子程序
name_sort proc     ;对名字和电话一起排序 ,待完成
push dx
push bx
push cx
push axmov dx,di
push disub dx,28      ;刚刚输入的姓名的地址lea bx,tel_tab mov cl,tel_countsortagain:cmp bx,dxje sortendcall strcompareadd bx,28cmp al,1      ;如果刚刚输入的姓名大,那就继续循环jne index1loop sortagain
index1:mov al,tel_count ;ax=(tel_count-cx)*28为要放的单元数 ;如果小的话,把当前之后的名字后移28个字节,再把名字插入到当前位置sub al,clmov ah,28MUL ah
allmove:call moveto28bytesub dx,28loop allmovejmp putintoputinto:mov si,di  ;刚刚输入名字的新地址lea di,tel_tabadd di,axmov cx,28rep MOVSB
sortend:
pop di
pop ax
pop cx
pop bx
pop dxret
name_sort endpmoveto28byte proc ;dx为当前地址28位各后移28个字节push cxpush bx   push sipush di   mov bx,dxadd bx,28mov si,dxmov di,bxmov cx,28rep MOVSBpop dipop sipop bxpop cx ret
moveto28byte endpInputname proc ;输入名字lea dx,tel_namecall cinmov bl, namelenmov cx, 20sub cx, bx
namebrk: ;将人名除外所剩下的字符用空格填满mov namefld[bx], 20hinc   bxloop  namebrk ret
Inputname endpstor_name procinc tel_countcldmov si,offset tel_name+2;mov di,offset tel_tabmov cl,20rep MOVSBret
stor_name endpInputtel proclea dx,tel_numcall cinmov bl, numlenmov cx, 8sub cx, bx
numbrk: ;将人名除外所剩下的字符用空格填满mov numfld[bx], 20hinc   bxloop  numbrk ret
Inputtel endpstor_num proccldlea si,numfld;mov di,offset tel_tabmov cl,8rep MOVSBret
stor_num endp;打印固定字符串,入口参数dx指向的地址以$符号结束
print procpush axmov ah,09hint 21hpop axret
print endp
;用户输入,入口参数dx指向第一个缓冲区地址
cin procpush axmov ah,0AHint 21hpop axcall printnewlineret
cin endp
;输出换行
printnewline procpush axpush dxmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21hpop dxpop axret
printnewline endp
;字符串大小比较(字典序)
strcompare proc   ;入口参数dx,bx的首地址,dx大于bx则输出al为1,否则为0
push si
push di
push cxmov si,dxmov di,bx
push bx
push dxmov cx,20cld
stragain:mov bl,[si]cmp bl,[di]jb unmat1cmp bl,[di]ja  unmat2inc siinc diloop stragain
unmat1: mov al,0jmp endstrcompare
unmat2: mov al,1
endstrcompare:
pop dx
pop bx
pop cx
pop di
pop siret
strcompare endp
CODES ENDSEND START

输出结果如图:

汇编原理实验 --电话簿的实现相关推荐

  1. 汇编原理实验 --计算平均数

    先不考虑用户输入以及输出,我们可以根据一些总结来的经验得出:在处理数组累加,以及求平均值的程序中需要用到循环,把用户输入的数字加起来,然后除以一个总数得到平均值. 了解了核心算法后,开始需要处理一些汇 ...

  2. 汇编原理实验 --类型统计(字母,数字,其他字符的个数)

    实验3: (类型统计,统计字母,数字,其他字符在一个句子中出现的次数) 算法设计:用三个变量分别记录用户输入数字类型,字母类型和其他类型的个数.根据ACSII码判断类型,遍历完整个句子后调用十进制数输 ...

  3. 汇编原理实验 --查找子字符串的位置

    实验2:(子字符串,查找字符串在另一个字符串中出现的位置) 设计算法:将用户输入关键字和句子,将bx为关键字起始位置地址,dx赋初值为句子起始位置地址,将dx和bx内容进行匹配,如果不匹配则dx指向句 ...

  4. 汇编原理实验--输出ASCII码10H到100H

    实验1:ASCII码 设计算法:为了将ASCII的10H到100H输出显示,得从10H开始显示输出然后循环90h次,每次ASCII自增1,重复上述步骤. 编程实现:将循环次数90h存在计数器cx中,用 ...

  5. 微型计算机原理实验报告总结,微机原理实验报告-两个多位十进制数相加的实验等.doc...

    微机原理实验报告-两个多位十进制数相加的实验等.doc 微机原理实验报告班级学号姓名实验一两个多位十进制数相加的实验一.实验目的学习数据传送和算术运算指令的用法熟悉在PC机上建立.汇编.链接.调试和运 ...

  6. 微型计算机c240,PC微机原理实验.doc

    PC微机原理实验 微型计算机原理与应用 实验指导书 上 海 大 学 通 信 学 院 PC微机原理实验一 目的:掌握PC机DEBUG调试程序有关命令的操作及8086各类指令的 功能. 要求:在PC机上完 ...

  7. 南邮java实验报告,南邮微机原理实验报告精选.doc

    南邮微机原理实验报告精选 <微型计算机原理与接口技术> 上机实验 学 院: 电子科学与工程 专 业: 电磁场与无线技术 姓 名: 陈秀慧 课 程 号: B0300062S 学 号: 任课老 ...

  8. 用汇编语言与C语言实验其他排序,微机原理实验报告冒泡排序

    微机原理实验报告冒泡排序 五.运行结果 (1)对300,250,280,240,260五个数进行冒泡排序,运行结果如下: (2)对-1,2,54,-38,43五个数进行冒泡排序,运行结果如下 (1)当 ...

  9. 编译原理实验:代码生成作业(1)

    编译原理实验4:中间代码生成实验包-C++文档类资源-CSDN下载编译原理实验4:中间代码生成实验包更多下载资源.学习资料请访问CSDN下载频道.https://download.csdn.net/d ...

最新文章

  1. P1505 [国家集训队]旅游 树链剖分
  2. mysql anyvalue报错_Mysql 的ANY_VALUE()函数和 ONLY_FULL_GROUP_BY 模式
  3. 使用DBLINK为远程数据库的用户表创建同义词
  4. 树莓派3 64linux,树莓派3 model b安装64位debian+qt5.9
  5. Ubuntu Tweak 0.8.2 发布
  6. 简单了解各种序列化技术-kyro序列化框架
  7. Java 线程的 5 种状态
  8. naarray查询 swift_Swift 4最全的新特性详细解析(推荐)
  9. Matlab中transpose函数的使用
  10. 重写setTimeout扩展参数
  11. linux系统下ntp网络时钟服务器(NTP服务器)的搭建和使用
  12. git基本概念与核心命令_Git:了解核心版本控制概念的初学者指南
  13. 关于JAVA匿名内部类,回调,事件模式的一点讨论
  14. 函数的练习1——python编程从入门到实践
  15. 在anaconda环境下搭建python3.5 + jupyter sparkR,scala,pyspark
  16. linkin大话设计模式--抽象工厂
  17. arma 预测 matlab代码,求助:ARMA模型进行预测
  18. word标题排序包括有汉字和罗马数字的标题排序
  19. mirserver传奇服务端各文件夹注解
  20. 动态规划之二项式系数

热门文章

  1. AS3深拷贝数据对象(1)深拷贝基本数据类型
  2. 某android平板项目开发笔记--自定义sharepreference UI
  3. 周立波贼经典的话31-40
  4. 中小型企业纯开源免费工具的解决方案
  5. Session对象的清空
  6. Pycharm连接远程服务器进行代码调试开发
  7. 卷积神经网络初步认知
  8. Linux磁盘阵列raid1和raid5相关概念及其实现途径
  9. ubuntu date -R查看时区
  10. MySQL设置数据库的字符编码为utf8