Assembly Name Sort

;-------------------------------------------------------------------------
; 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

				
				
				


				
				

                     加油:每天进步一点点!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值