人名排序实现

;***************************************************************
;人名排序实现
;author:野渡无人
;create date:2007-12-20
;***************************************************************
data segment
     No_of_name    dw 15
     No_of_phone   dw 12
     total                    dw 27
     cnt_name         db 5          ;count of input name
     tel_tab               db 'lucy           13424301234 '
                                db 'lily           13728875678 '
                                db 'Brown          13754781234 '
                                db 'Bob            13874784789 '
                                db 'Green          13779875678 '
     message1       db 'please input name:','$'
     message3       db '  NAME',10 dup(20h),'   TEL.',13,10,'$'
     message7       db 'Sorry!There is not such a name!',13,10,'$'
     crlf                      db 13,10,'$'
     swapped          db ?          ;judge whether exchange happens
     cmp_flag          dw ?         
data ends
;**************************************************************
prog segment
;--------------------------------------------------------------
main proc far
      assume cs:prog,ds:data
start:
       push ds
       sub  ax,ax
       push ax
       mov  ax,data
       mov  ds,ax
       call name_sort   
       call printline                   
       ret
main endp
;---------------------------------------------------------
name_sort proc near
       push ax
       push bx
       push cx
       push dx
       mov  swapped,0
       mov  ch,0
       mov  cl,cnt_name
       dec  cl

name_sort_loop:
       mov  bx,cx
       mov  cx,0
name_sort_loop1:
       mov  di,0
       mov  ax,total
       mul  cl
       inc  cl
       add  di,ax
       mov  si,di
       sub  si,total
       mov  cmp_flag,0
name_sort_loop2:
       mov  dl,tel_tab[di]
       cmp  dl,tel_tab[si]
       jb   name_sort_continue
       ja   name_sort_continue1
       inc  di
       inc  si
       inc  cmp_flag
       mov  ax,cmp_flag
       cmp  ax,No_of_name
       jbe  name_sort_loop2
name_sort_continue:
       call name_exchange
name_sort_continue1:
       cmp  cx,bx
       jbe  name_sort_loop1
    
       mov  cx,bx
       ;cmp  swapped,0
       loop name_sort_loop

       pop  dx
       pop  cx
       pop  bx
       pop  ax
       ret

name_sort endp
;---------------------------------------------------------
name_exchange proc near
       push dx
       push cx
       mov  cx,total
       sub  cx,cmp_flag
name_exchange_rotate:
       mov  dl,tel_tab[di]
       xchg dl,tel_tab[si]
       mov  tel_tab[di],dl
       inc  di
       inc  si
       loop name_exchange_rotate
       mov  swapped,1
       pop  cx
       pop  dx
       ret
name_exchange endp
;---------------------------------------------------------
printline proc near
       push ax
       push dx
       push cx

       lea  dx,message3
       mov  ah,09
       int  21h
       mov  bh,cnt_name
print_again:
       mov  bl,cnt_name
       sub  bl,bh
       mov  di,0
       mov  ax,total
       mul  bl
       add  di,ax
       mov  cx,total
print_rotate:      
       mov  ah,02
       mov  dl,tel_tab[di]
       int  21h
       inc  di
       loop print_rotate
       dec  bh
       cmp  bh,0
       mov  ah,09
       lea  dx,crlf
       int  21h
       jnz  print_again

       mov  ah,09
       lea  dx,crlf
       int  21h
       pop  cx
       pop  dx
       pop  ax
       ret
printline endp
;------------------------------------------------------------  
prog ends
;**********************************************************
  end start 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值