;-------------------------------------------------------------------------
; Project: NameSort.asm
; Name: zwp
; Date: 2013.10
;-------------------------------------------------------------------------
.MODEL SMALL
.STACK 40H
; 数据段定义
.DATA
namepar label byte ; name parameter list
maxnlen db 21 ; name's max length
namelen db ?
namefld db 21 dup(?) ; 21 个?
crlf db 13, 10, '$' ; 回车换行
endaddr dw ?
message1 db 'Name?', '$' ; '$' 为字符串结尾标志字符
message2 db 'Sorted names:', 13, 10, '$'
namectr db 0
nametab db 30 dup(20 dup(' ')) ; 30 个元素每个元素20个空格
namesav db 20 dup(?), 13, 10, '$'
swapped db 0
.CODE
begin proc far
mov ax, @data
mov ds, ax
mov es, ax ; 将数据放入数据段中
cld ; 方向标志置0
lea di, nametab ; di = nametab 的偏移地址
a20loop:
call b10read
cmp namelen, 0
jz a30 ; 如果名称长度为0跳转至a30
cmp namectr, 30 ; 输入30个名称
je a30
call d10stor
jmp a20loop ; 输入结束
a30:
cmp namectr, 1 ; 1 or 没有名称输入
jbe a40 ; 若小于等于1个
call g10sort ; 调用排序
call k10disp
a40:
mov ah, 1 ; 获取输入为了暂停
int 21h
mov ax, 4ch
int 21h
begin endp
b10read proc near
mov ah, 09h ; 从键盘获取输入
lea dx, message1 ; dx = message1的偏移地址
int 21h
mov ah, 0ah ; 换行
lea dx, namepar ; dx = namepar 的偏移地址
int 21h
mov ah, 09 ; 从键盘获取输入
lea dx, crlf ; dx = crlf 的偏移地址
int 21h
mov bh, 0 ; 清除名称之后的字符
mov bl, namelen ; 名称长度
mov cx, 21 ; 循环21次
sub cx, bx ; cx -= bx
b20:
mov namefld[bx], 20h ; 设置到块
inc bx ; cx++
loop b20 ; cx--
ret
b10read endp
;--------------------------------------------------------------
d10stor proc near
inc namectr
cld ; 方向标志置0
lea si, namefld ; si = 名称的偏移地址
mov cx, 10 ; 循环10次
rep movsw ; cx--
ret
d10stor endp
;--------------------------------------------------------------
g10sort proc near
sub di, 40 ; di = di - 40
mov endaddr, di ; endaddr = di
g20:
mov swapped, 0
lea si, nametab ; si = nametab 的偏移地址
g30:
mov cx, 20 ; 循环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 ; 若swapped不为0
ret
g10sort endp
;---------------------------------------------------------------
h10xchg proc near
mov cx, 10
lea di, namesav ; ax = namesav的偏移地址
mov si, bx
rep movsw ; cx-- ds:[si] = es:[di]
mov cx, 10
mov di, bx ; di = bx
rep movsw ; cx-- ds:[si] = es:[di]
mov cx, 10
lea si, namesav
rep movsw ; cx-- ds:[si] = es:[di]
mov swapped, 1
ret
h10xchg endp
;---------------------------------------------------------------------
k10disp proc near
mov ah, 09h ; 从键盘获取输入
lea dx, message2
int 21h
lea si, nametab
k20:
lea di, namesav
mov cx, 10
rep movsw
mov ah, 9 ; 从键盘获取输入
lea dx, namesav
int 21h
dec namectr ; namectr--
jnz k20 ; 若不为0循环
ret
k10disp endp
end begin
加油:每天进步一点点!!Assembly Name Sort
最新推荐文章于 2022-04-25 14:17:36 发布