汇编语言子程序设计

( 鉴于网友对本博文比较感兴趣,2012年5月新增了实验报告中相关内容。 )

实验2.4  查找电话号码

1:题目:查找电话号码phone
2.实验要求
1)要求建立一个可以存入50项的电话号码表,每项包括人名(20字符)和电话号码(8字符)两部分;
2)程序可以接受用户输入的人名及相应的电话号码,并把它们加入到电话号码表中;
3)凡有新的输入后,程序可以按人名对电话号码进行排序;
4)程序可接收需要查找的电话号码的人名,并从电话号码表中查出电话号码,再在屏幕上以如下格式显示
name         tel
xxxxx        xxxxxxxxxx
程序解决方案
一:总体设计与模块说明
总体设计(2012年5月新增)如下图所示:

模块说明:
1.main:作为主程序调用其他模块,完成程序功能。
2:menu :作为主菜单供用户选择操作所用。
3:input_name:作为输入姓名子程序块。
4: input_phone:作为输入电话号码子程序。
5: ifchar:作为判断输入姓名是否含非字母字符的子程序。
6:ifnum:作为判断输入电话号码是否含非数字字符的子程序。
7:store:存储输入姓名或者电话号码等内容的子程序。
8 name_sort:对已经输入的电话记录按姓名排序的子程序。
9:name_search:在已经输入的电话记录中查找所需号码的子程序。
10:printline:输出已经查找到的电话记录。
11:clear_screen:在菜单选择之间,适时清除屏幕冗余性息的子程序。
12:cursor :清屏后光标重定位的子程序。

13:crlf:回车换行的子程序。

程序代码清单:

***************************************************************************************
msg  macro message ;输出提示符的宏
lea dx,message
mov ah,09
int 21h
endm
datasg segment
tel_tab db  2700 dup(?),'
count     dw  0
count1    dw  0
count2    dw  0
count3    dw  0
count4    dw  15
count5    dw  0
result    db  0
num       dw  0
ifnumy     dw  0
ifchary    dw  0
window    db  '  **************************************************************************' ,13,10db  '    A Telphonenumber Store And Search System' ,13,10db  '                                                                            ' ,13,10db  '           Author:HNU   Dingqiao Wang     2010-6   ' ,13,10db  '                                                                            ' ,13,10db  '  **************************************************************************',13,10,';程序相关的界面
mess1     db  '  Input Name( max  14 char):','mess2     db  '  Input A Number( max 11 num):','mess4     db  '  Not In The Table ,Check Your Spelling Or Try Again! ','mess5     db  '      Result As follow  : ',13,10db  'Name***********TEL********',13,10 ,';程序相关的界面
mess6     db  '-----------------------------------------------',13,10,'mess7     db  '   * Additem  [Enter/Space]',13,10db  '   * Search  [S]',13,10db  '   * View  [V]',13,10db  '   * Exit  [Esc]',13,10,13,10db  '  Make    a    choice      ',13,10,'mess8     db  '  Check Your Inputting,It Contains  None Char !',13,10,';程序相关的提示符
mess9     db  '  Check Your Inputting,It Contains  None Number!',13,10,'mess10    db  '  No  Record  , Check  Your  Inputting  And Try Again!',13,10,'mess11    db  '  The  Name You want  search:','tip       db  '        System      Tips:           ',13,10db  '  You can press A Key List In The Menu ',13,10db  '  Then System Will Work For You        ',13,10,13,10,'name1   label   byte
max1     db  15
act1     db  ?
str1     db  15 dup(?)
tel    label   byte
max2     db  12
act2     db  ?
str2     db  12 dup(?)
datasg  ends
;------------------------------------------------
codesg  segment
assume cs:codesg,ds:datasg,es:datasg
main proc far
start:
push ds
sub ax,ax
push ax
mov  ax,datasg
mov ds,ax
mov es,ax
;---------
msg window;程序相关的界面
call menu
quit:   ;返回DOS系统
mov ah,4ch
int 21h
main endp
;------------------------------------------------
menu  proc near ;显示选择菜单,包括输入、查看、查询、退出
msg mess7
call crlf
mov ah,07
int 21h
cmp al,0dh    ;键入回车则查询相应纪录
je  inputproc;输入
cmp al,20h    ;键入空格则查询相应纪录
je  inputproc;输入
cmp al,'s'   ;键入s则查询相应纪录
je  sear  ;查询
cmp al,'v' ;键入v则查看所有纪录
je  allrecord;查看
cmp al,1bh;Esc键退出
je  quit ;退出
jmp help
allrecord:
call viewall;调用查看已有纪录子程序
jmp exitmenu
inputproc:
call input  ;调用输入子程序
jmp exitmenu
sear:
cmp count,0
je promp
call clear_screen
call name_search;调用电话号码查询子程序
jmp exitmenu
promp:
msg mess10
call crlf
call menu
help:
mov dl,07
mov ah,02
int 21h
call clear_screen ;清除屏幕
msg tip
call menu
exitmenu:
ret
menu endp
;------------------------------------------------
input    proc    near ;输入子程序,调用输入姓名及输入电话号码子程序
mov   bx,num
call  input_name;调用输入姓名函数
call  input_phone;调用输入号码函数
inc   count
add   bx,12
mov   byte ptr tel_tab[bx-1],'mov   num,bx
call name_sort
call clear_screen
call  menu
ret
input    endp
;-------------------------------------------------
input_name  proc  near;存入姓名函数
push cx
lea dx,mess1
mov ah,09
int 21h
;-------
lea dx,name1 ;将输入姓名存入到缓冲区name1
mov ah,0ah
int 21h
;-------
mov cl,act1;检验输入的人名是否包含非字母的字符
mov si,0
test1:
mov  al, str1[si]
call ifchar
cmp ifchary,'y'
jne  error1
goon:
inc si
loop test1
;-------
move1:
mov cl,act1
lea si ,str1
lea di,tel_tab[bx]
call store;输入的电话纪录人名存入电话表
call crlf
pop cx
jmp exitname
error1:
msg mess8
call crlf
call menu
exitname:
ret
input_name endp
;------------------------------------------------
input_phone   proc   near;存入电话号码函数
push cx
lea dx,mess2
mov ah,09h
int 21h
;---------
lea dx,tel;将输入姓名存入到缓冲区tel
mov ah,0ah
int 21h
;-------
mov cl,act2 ;检验输入的人名是否包含非数字的字符
mov si,0
test2:
mov  al, str2[si]
call ifnum
cmp ifnumy,'y'
jne error2
inc si
loop test2
;--------------
move2:
add bx,15
mov cl,act2
lea si ,str2
lea di ,tel_tab[bx]
call store;输入的电话号码存入电话表
call crlf
pop cx
jmp exitphone
error2:
msg mess9
call crlf
call menu
exitphone:
ret
input_phone endp
;-------------------------------------------------
ifchar proc near ;判断输入是否为姓名字母子程序,结果存入ifchary中
cmp al,'.'
je   permit
cmp  al,20h
je   permit
cmp  al,41h
jb   error1
cmp  al,5ah
jbe  permit
cmp al,61
jb   error3
cmp al,7ah
jnbe error3
permit:
mov ifchary,'y'
jmp exitif1
error3:
mov ifchary,'n'
exitif1:
ret
ifchar endp
;-------------------------------------------------
ifnum proc near;判断输入是否为电话号码数字子程序,结果存入ifnumy中
sub al,30h
cmp  al,0h
jb   error4
cmp  al,9h
jnbe error4
mov ifnumy,'y'
jmp exitif2
error4:
mov ifnumy,'n'
exitif2:
ret
ifnum endp
;-------------------------------------------------
store proc near  ;存储输入内容程序函数
cld
rep movsb;串传送指令,存入相应的内容到电话表
ret
store endp
;-------------------------------------------------
name_sort proc  near;按名字冒泡法排序函数
mov cx,count
cmp cx,1
je  exits
dec cx
lop2:
mov  count1,cx
mov bx,0
lop3:
call compare
cmp result,'>'
jne  continue
change:
mov count2,cx
mov cl, 26
mov di,0
exchange:      ;排序时移动纪录的程序段,本来想用rep movsb,但一直应为名字长度不同而出现错误
mov al,tel_tab[bx][di]
xchg  al,tel_tab[bx+27][di]
mov  tel_tab[bx][di],al
inc di
loop  exchange
mov cx,count2
continue:
add  bx,27
loop  lop3
mov  cx,count1
loop lop2
exits:
ret
name_sort endp
;------------------------------------------------
compare   proc   near;按名字15为循环比较函数,结果存贮到result中,供name_sort函数判断
mov  si,bx
comp:
mov al,tel_tab[si]
cmp al,'Z'
jnb goon2
add al,20h  ;比较时不区分大小写,遇到大写转换为小写
goon2:
mov dl, tel_tab[si+27]
cmp dl,'Z'
jnb goon3
add dl,20h  ;比较时不区分大小写,遇到大写转换为小写
goon3:
cmp al,dl
jl  exit4;两个名字中a[i]<a[i+1],结果保存到result位'<'
jg  exit5;两个名字中a[i]>a[i+1],结果保存到result位'>'
inc si
dec count4
jnz comp
exit4:
mov result ,'<'
ret
exit5:
mov result ,'>'
ret
compare endp
;------------------------------------------------
name_search proc near;按姓名查找电话号码
mov count5,0
msg  window
call crlf
msg  mess11
lea dx,name1
mov ah,0ah
int 21h
lea si,str1
mov cl,act1
test3:  ;检验输入的姓名中是否包含非字母
mov al,[si]
call ifchar
cmp ifchary,'y'
jne error5 ;若包含非字母则提示并转到菜单重新选择
inc si
loop test3
mov bx,0
mov cx,count;根据输入的姓名,在电话表中循环查询是否有此纪录
search:
push cx
call searchresult ;调用大小写兼容查询子程序
continue2:
add bx,27
pop cx
loop  search
cmp count5,0
jnz exitsear
msg  mess10
msg  mess6
call crlf
call menu
jmp exitsear
error5:
msg mess8
exitsear:
msg mess6
mov count5,0
call menu
ret
name_search  endp
;------------------------------------------------
searchresult  proc near ;搜索结果的判断子程序
call crlf
lea  si,str1
mov cl,act1
mov di,0
check:  ;check段的作用为大小写兼容查询状态
mov al,[si]
cmp al,tel_tab[bx][di] ;算法为假设输入为小写,先匹配,无结果则转换为大写查询,若仍然无结果,
jne  onece1            ;则可以断定为输入为大写或者确实无结果,当输入为大写是先前的操作引起al值改变
je again               ;此时应该将al+40h,再次判断,若在不成功,则应该为的确没有记录。
onece1:
sub al,20h
cmp al,tel_tab[bx][di]
jne  onece2
je again
onece2:
add al,40h
cmp al,tel_tab[bx][di]
jne  exitresult
again:
inc si
inc di
loop check
getit:
inc count5
call printline
exitresult:
ret
searchresult endp
;------------------------------------------------
viewall  proc near;显示当前已存入所有经过排序的纪录
call clear_screen;清屏
cmp count ,0
je  exit8  ;当前无记录时提示符
call crlf
msg mess5
call crlf
mov  cx ,count
mov bx,0
view:
lea dx,tel_tab[bx]
mov ah,09
int 21h
call crlf
add bx,27
loop  view
exit7:
msg mess6
call crlf
call menu
jmp exitprint
exit8:
msg mess10
call crlf
exitprint:
msg mess6
call menu
ret
viewall endp
;------------------------------------------------
printline proc near;输出查询结果
cmp count5,1
jnbe print
msg mess5
print:
lea dx,tel_tab[bx]
mov ah,09
int 21h
call crlf
ret
printline endp
;-------------------------------------------------
clear_screen proc near ;清除屏幕子程序
push ax
push bx
push cx
push dx
mov ah,6
mov al,0
mov bh,7
mov ch,0
mov cl,0
mov dh,24
mov dl,79
int 10h
mov dx,0
mov ah,2
int 10h
mov dh,0
call cursor
pop dx
pop cx
pop bx
pop ax
ret
clear_screen endp
;-------------------------------------------------
cursor proc near ;重置光标位置子程序,置光标为第零行和第零列
push ax
push bx
push cx
push dx
mov  ah,02
mov  bh,00
mov  dl,00
mov  dh,00
int  10h
xor bh,bh
mov dh,0
mov dl,0
mov ah,02
int 10h
pop dx
pop cx
pop bx
pop ax
ret
cursor endp
;-------------------------------------------------
crlf proc near  ;输出回车换行
push ax
push cx
mov dl,0dh
mov ah,02h
int 21h
;----------
mov dl,0ah
mov ah,02h
int 21h
pop cx
pop ax
ret
crlf endp
;------------------------------------------------
codesg ends
end  start
**************************************************************************************

运行结果:

汇编语言子程序设计 查找电话号码相关推荐

  1. 汇编语言---子程序设计举例(两组数据相加)

    汇编语言---子程序设计举例(两组数据相加) 配置环境 要求 编辑程序 运行程序 后续 配置环境 首先双击下载程序进行下载.(没有安装程序的,可以下载我为大家准备的安装文件.) 不会安装的可以看一下文 ...

  2. 【汇编语言与计算机系统结构笔记16】子程序设计:子程序的嵌套与递归,多个模块之间的参数传送

    本次笔记内容: 23.子程序设计-2-1 24.子程序设计-2-2 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的内容与对应ppt页码. 本 ...

  3. 【汇编语言与计算机系统结构笔记15】子程序设计:调用与返回,保护与恢复寄存器,子程序的参数传递,堆栈平衡,结构伪操作 STRUC

    本次笔记内容: 20.子程序设计-1-1 21.子程序设计-1-2 22.子程序设计-1-3 注:我找到了对应内容的课件,请见我于GitHub的CS笔记仓库.因此,为了节省时间,我只记录老师上课强调的 ...

  4. 计算机课程设计课程计划书,计算机汇编语言课程设计计划书.doc

    计算机汇编语言课程设计计划书 第1章 课程设计目的与要求 1.1课程设计目的 本课程实际是计算机科学与技术专业得技术实践课.主要目的是使学生学会微机汇编语言程序的整体设计过程和设计思路,将微机汇编语言 ...

  5. 微机原理与接口技术实验:子程序设计实验

    学生实验报告 实验课名称:微机原理与接口技术 实验项目名称:子程序设计实验 实验名称:单指令功能的实现 一. 实验目的 1.掌握汇编语言源程序子程序设计方法:. 二.实验内容 设计一个程序,将所有的小 ...

  6. 11子程序设计中的内聚性

    一. 子程序设计 ​ 对于子程序而言,内聚性是指子程序中各种操作之间联系的紧密程度.有些程序员更喜欢使用"强度"这一术语:一个子程序中各种操作之间的联系有多强?想Consine() ...

  7. 子程序调用与宏定义的异同_微机原理 宏指令及子程序设计实验:宏指令和子程序的区别...

    西安邮电学院 微机原理实验报告 题 目: 宏指令及子程序设计实验 院系名称: 班 级: 学生姓名: 学号(8位): 指导教师: 2.5 宏令及子程序设计实验 2.5.1 实验目的 1.熟悉宏指令.宏定 ...

  8. 哈夫曼树算法思想设计内线电话号码

    前言 一个单位有12个部门,每个部门都有一部电话,但是整个单位只有一根外线,当有电话打过来的时候,由转接员转到内线电话,已知各部门使用外线电话的频率为(次/天):5 20 10 12 8 43 5 6 ...

  9. 汇编语言-子程序调用

    汇编语言-子程序调用 ret与ref指令 ret ret == pop IP ret指令用栈中的数据,修改IP的内容,从而实现近转移: 功能介绍 retf指令用栈中的数据,修改CS和IP的内容,从而实 ...

  10. 【顺序、分支、循环、子程序设计】—— 微机原理实验

    本文目录 一.实验要求 二.实验目的 三.实验代码及实验结果 实验1 实验2 实验3 实验4 实验5 四.实验总结 一.实验要求 编写 Q = a + (b - c) * d 的程序.(a.b.c.d ...

最新文章

  1. JavaScript—— 前端编程语言
  2. css元素捕捉,css元素选择器
  3. Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
  4. 针对WildFly和EAP运行Java Mission Control和Flight Recorder
  5. LeetCode 1737. 满足三条件之一需改变的最少字符数(计数)
  6. 神经网络技巧篇之寻找最优参数的方法
  7. 比特币开发者:BSC可能会超越以太坊成为顶级智能合约平台
  8. 基于RV1126平台imx291分析 --- media部件注册 imx291
  9. 互联网产品经理核心素质能力模型
  10. JS代码:当前日期时分秒加30分钟
  11. 余弦距离的应用 -- cosine distance
  12. 快速入门github网站,了解GitHub网站的基本使用
  13. 【软件下载】换新电脑记录下下载的软件时所需地址
  14. psu 计算机 排名,PSU计算机工程专业研究生排名必然得当心去考察
  15. 百练 / 2016计算机学科夏令营上机考试: E
  16. python画脑电信号
  17. 个人账号被Facebook封号怎么办
  18. linux centos 解压 tar.bz2文件
  19. Pandownload 下线了,我花了 30 分钟自己搭建了一个网盘!
  20. linux sata硬盘热交换,浅谈希捷7200.7硬盘热交换数据恢复教程.pdf

热门文章

  1. matlab的ism实现,ism模型的matlab实现
  2. 创意书签名字_给书签作品起名字-给书签起名字
  3. 服务器刷课源码,国开刷课
  4. 论文绘图-教你如何绘制响应面
  5. 在Windows下使用安装并启动HDFView踩坑记录
  6. SQL SERVER 不允许保存更改
  7. Siemens M65...
  8. 工业互联网常用无线通信协议介绍(详细版)
  9. 数学分析(9): 不定积分
  10. android 禁止软键盘弹出自动弹出,Android屏蔽软键盘自动弹出的解决方案