?? p231.asm
字號:
.model small
.stack 40h
.data
namepar label byte ;定義姓名變量表
maxnlen db 21 ;最大字符數
namelen db ? ;實際字符數
namefld db 21 dup(?)
crlf db 13,10,'$'
endaddr dw ?
messg1 db 'Name?','$'
messg2 db 'Sorted names:',13,10,'$'
namectr db 0 ;已經輸入姓名的個數
nametab db 30 dup(20 dup(' ')) ;姓名表
namesav db 20 dup(?),13,10,'$'
swapped db 0
.code
main proc far
mov ax,@data
mov ds,ax
mov es,ax
cld
lea di,nametab
a20loop:
call b10read ;接收姓名
cmp namelen,0
jz a30 ;不再輸入姓名,排序
cmp namectr,30 ;30個姓名輸完?
je a30 ;已經輸入30個姓名,排序
call d10stor ;存入剛輸入的姓名
jmp a20loop
a30:
cmp namectr,1
jbe a40 ;一個或者沒有姓名輸入,直接退出。
call g10sort ;排序輸入的姓名
call k10disp ;顯示存入的姓名
a40:
mov ax,4c00h
int 21h
main endp
;接收輸入姓名的子程序
b10read proc near
mov ah,09
lea dx, messg1
int 21h ; 9號功能,顯示字符串
mov ah,0ah
lea dx,namepar
int 21h ;0a號功能,接收姓名字符串、
mov ah,09
lea dx,crlf
int 21h ;輸出回車和換行
mov bh,0 ;輸入姓名不夠21個字符,清除后面的所有內容為空格。
mov bl,namelen
mov cx,21h
sub cx,bx
b20: mov namefld[bx],20h
inc bx
loop b20
ret
b10read endp
d10stor proc near
inc namectr ;已經輸入姓名個數加一
cld
lea si,namefld
mov cx,10
rep movsw
ret
d10stor endp
;姓名排序子程序
g10sort proc near
sub di,40
mov endaddr,di ;要比較的結束地址
g20:
mov swapped,0
lea si,nametab ;要比較的起始地址。
g30:
mov cx,20 ;要比較的長度
mov di,si
add di,20 ;下一個要比較的姓名。
mov ax,di
mov bx,si
repe cmpsb
jbe g40 ;
call h10xchg ;互換
g40:
mov si,ax
cmp si,endaddr
jbe g30
cmp swapped,0
jnz g20
ret
g10sort endp
h10xchg proc near
mov cx,10
lea di, namesav
mov si,bx
rep movsw
mov cx,10
mov di,bx
rep movsw
mov cx,10
lea si,namesav
rep movsw
mov swapped,1
ret
h10xchg endp
k10disp proc near
mov ah,9
lea dx,messg2
int 21h
lea si,nametab
k20:
lea di,namesav
mov cx,10
rep movsw
mov ah,9
lea dx,namesav
int 21h
dec namectr
jnz k20
ret
k10disp endp
end main
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -