汇编语言实验报告四

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:将整个电话号码表的所有条目依次输出

六、模块层次图

七、调试结果

相关推荐