;***************************************************************
;人名排序实现
;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