⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dianhuaxitong.asm

📁 电话号码管理系统 (1) 建立一个可存放50项的电话号码表
💻 ASM
字号:
datarea  segment
      tel_tab      db  50 dup( 28 dup(?))  ;人名和电话号码存储区
      maxnlen      db  20                  ;人名最大长度
      maxnumblen   db   8                  ;号码最大长度
      namesav      db  20 dup(?),13,10,'$' ;姓名缓冲区 
      numbersav    db  8  dup(?),13,10,'$' ;电话号码缓冲区 
      peopleinfor  db  28 dup(?),13,10,'$' ;姓名与电话号码缓冲区
      endaddr      dw  0                   ;存储截止地址
      count1       db  0                   ;存入的号码个数
      namelen      dw  ?                   ;计入名字的长度
      numberlen    dw  ?                   ;计入号码的长度
      count2       db  ?                   ;冒泡排序循环次数
      namesearch   db  20 dup(?),'$'       ;输入查找名字缓冲区
      sisave      dw  0                    ;保存si寄存器
      

      mess1    db   'input a name: $'
      mess2    db   'input a phone number: $'
      mess3    db   'name           number$'
      mess5    db    'Not this phone$'
      mess6    db    'input you name: $' 
      mess7    db    'Not save$'
      mess8    db    'selete error $'
      mess10   db    'search again(y/n)? $'
      mess9    db    'please select 0-3: $'       
      mess11   db    ' 1.create your name_tab $'
      mess12   db    ' 2.sort your name_tab $'
      mess13   db    ' 3.search telephone number $'
      mess14   db    ' 0.exit $'
datarea ends
;-----------------------------------------------------------
program segment
main  proc  far
       assume cs:program,ds:datarea,es:datarea
start:
         push ds
         sub  ax,ax
         push ax
         mov  ax,datarea     
         mov  ds,ax 
         mov  ax,datarea 
         mov  es,ax
         cld                  ;df=0
     g11:
         call crlf
         lea dx,mess9
         mov ah,09       
         int 21h              ;显示信息'please select 0-3: '    
;
         call crlf
         lea dx,mess11       
         mov ah,09
         int 21h               ;显示信息'1.create your name_tab '
;
         call crlf
         lea dx,mess12
         mov ah,09
         int 21h               ;显示信息'2.sort your name_tab '
;
         call crlf
         lea dx,mess13
         mov ah,09
         int 21h               ;显示信息'3.search telephone number '
;
         call crlf
         lea dx,mess14
         mov ah,09
         int 21h               ;显示信息'0.exit '
         call crlf
  
         mov  ah,1
         int  21h
         cmp  al,31h
         jne  tt1              
         jmp  call1             ;输入为1时调用input_name子程序
tt1:    
         cmp  al,32h
         jne  tt2
         cmp  count1,0           ;判断tel_tal是否为空  
         je   tt3                
         jmp  call2              ;输入为2且tel_tal不为空时调用 name_sort 和 printline 子程序
    
tt2:      
          cmp al,33h
          jne tt5 
          cmp count1,0
          je  tt3
          call call3             ;输入为3且tel_tal不为空时调用 name_search 子程序

          tt3: lea dx,mess7
          mov ah,09
          int 21h               ;当tel_tal为空时显示信息 'You hava not create your name_tab '
          jmp g11
     
tt5:      
          cmp al,30h
          jne tt6
          call exit0            ;输入为0时退出系统
tt6:
          lea dx,mess8
          mov ah,09
          int 21h               ;当输入不在0-3范围时,显示信息'your selection is error '
          jmp g11
          
call1: 
         call input_name
         jmp g11
        
call2: 
         call name_sort
         call printline
         jmp g11
         
call3: 
         call name_search
         lea dx,mess10
         mov ah,09
         int 21h             ;查找完后提示是否还要查找 'search again(y/n)? '
         mov  ah,1
         int  21h
         cmp  al ,'y'        ;输入为y继续查找,否则退出查找项,返回主菜单项
         call  crlf
         je   call3
         jmp g11
exit0:   
         ret
main endp

input_name proc  near        ;子程序(输入名字)
         mov si,endaddr      ;si始终指向tel_tal中最后信息下一个地址
enter:
         call crlf           ;回车、换行
         lea dx,mess1
         mov ah,09
         int 21h             ;显示信息'input_name: '
         mov namelen,0       ;名字长度初始化为0
loop1:   
         mov ah,1
         int 21h             ;输入名字字符
         cmp al,0dh
         je  exit1           ;判断输入是否为回车,是的话退出输入名字,否则输入字符存入tel_tab中,
         cmp al,' '
         je  next
         cmp al,0dh
         je  exit1
         mov tel_tab[si],al
         inc si
         inc namelen         ;记录名字长度 
         jmp loop1           ;跳转继续输入该名字字符状态     
next:  
         mov bx,namelen
         mov cx,20
         sub cx,bx
b20:   
         mov tel_tab[si],20h
         inc si
         loop b20            ;输入的名字为20字节,不足的用空格补足
         
         call inphone        ;输入名字后,回车进入输入电话号码子程序
         mov namelen,0
         inc count1          ;记录人数
         jmp enter
exit1: 
         mov endaddr,si      ;跳转输入另一个名字状态
         ret
input_name endp
inphone  proc near           ;子程序(输入号码)
         mov numberlen,0     ;初始化号码长度为0
         call crlf           ; 回车、换行
         lea dx,mess2
         mov ah,09
         int 21h             ;显示信息'input a telephone number: '
loop2: 
         mov ah,1
         int 21h             ;输入号码字符
         cmp al,' '
         je  exit2           ;输入为空格返回input_name子程序;否则输入号码字符存入tel_tal中
         mov tel_tab[si],al
         inc numberlen       ;记录号码长度
         inc si
         jmp loop2           ;跳转继续输入该号码字符状态
exit2:
         mov bx,numberlen
         mov cx,8
         sub cx,bx
b8:    
         mov tel_tab[si],20h
         inc si
         loop b8             ;输入的号码为8字节,不足的用空格补足 
       
         ret
inphone endp
name_sort proc near          ;子程序(按名字排序)
         mov  sisave,si      ;si内容保存入sisave
         mov  count2,0       ;初始化循环排序次数
g20:  
         lea  si,tel_tab
g30:  
         mov  di,si
         add  di,28
         mov  cx,20
         mov  ax,di
         mov  bx,si          ;比较名字
         repe cmpsb
         jbe  g40            ;前一个名字大于后一个名字,则调用xchg1子程序交换两人信息
         call xchg1
g40:  
         mov  si,ax          ;前一个名字小于后一个名字,si和di指向下一个人
         cmp  si,endaddr
         jb   g30            ;si<endaddr继续排序,
         inc  count2          ;记录排序次数
         mov  al,count2
         cmp  al,count1 
         jbe  g20
         mov  si,sisave
        
         ret
name_sort endp
xchg1  proc  near     ;子程序(交换tel_tab中di,si所指表项的内容,前项保存在bx )
    mov  cx,14
    lea  di,peopleinfor  
    mov  si,bx
    rep  movsw

    mov  cx,14
    mov  di,bx
    rep  movsw

    mov  cx,14
    lea  si,peopleinfor  
    rep  movsw

    ret
xchg1  endp
name_search  proc near    ;子程序(在表中顺序查找输入的名字 )
        mov  endaddr,si   ;截止地址存入endaddr
        mov  namelen,0    ;名字长度初始化为0
        mov  di,0
        call  crlf
        mov  ah,09
        lea  dx,mess6      ;显示信息'please enter name : '
        int  21h
g50:
        mov  ah,1
        int  21h            ;输入要查找的名字字符
        cmp  al,0dh         ;若输入的为回车,结束输入名字字符,否则继续输入名字字符
        je   next1           
        mov  namesearch[di],al
        inc  di
        inc  namelen        ;记录要查找名字长度
        jmp  g50
next1:
        mov  bx,namelen
        mov  cx,20
        sub  cx,bx
loop3:  
        mov  namesearch[di],20h   ;输入的要查找名字长度为20字节,不足的用空格补足
        inc  di
        loop loop3
      
        lea  si,tel_tab           ; si指向tel_tal第一个人的首地址
loop4:
        mov  cx,20
        lea  di,namesearch        ;di指向要查找名字的首地址
        repe cmpsb   
        cmp  cx,0

        jne   next4               ;判断查到否
        call  crlf
        mov   ah,09
        lea   dx,mess3
        int   21h                ;显示信息'name           telephone '
        call  crlf

        mov   ah,09
        lea   dx,namesearch
        int   21h                ;显示要查找的人名

        lea   di,numbersav
        mov   cx,4
        rep   movsw 
        mov   ah,09
        lea   dx,numbersav
        int   21h               ;显示相应该人的电话号码
        jmp   exit3

next4: 
        cmp   si,endaddr       ;判断si是否大于endaddr内容
        jge   next2            ;大于就跳转next2
        add    si,8
        jmp   loop4
next2: 
        call  crlf
        mov   ah,09
        lea   dx,mess5
        int   21h            ;显示信息'not find! '
exit3: 
        ret    
name_search endp
printline proc near      ;子程序(显示tel_tal中的信息)
        call crlf
        mov ah,09
        lea dx,mess3
        int 21h           ;显示信息 'name           telephone '
        lea si,tel_tab
k33:   
        lea  di,peopleinfor
        mov  cx,14
        rep  movsw         ;一个人信息暂存在peopleinfor中
        mov  ah,09
        lea  dx,peopleinfor
        int  21h
        cmp  si,endaddr
        jg   exit4
        loop k33
        mov  si,sisave
exit4:  
        ret 
printline endp
crlf  proc  near       ;子程序(回车换行)
         mov  dl,0ah
         mov  ah,02h
         int  21h
         
         mov  dl,0dh
         mov  ah,02h
         int  21h
         ret
crlf endp
program ends
end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -