📄 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 + -