继续看招,已经调试过:
;
;
用MASM或TASM编译
;
用LINK或TLINK连接
;
例如:
;
TASM ASMSORT
;
TLINK ASMSORT
;
执行ASMSORT即可。
;
哈哈哈 !!!
;
Code Segment
Assume Cs:Code,Ds:Code
Start:
Jmp Init
_N EQU 20 ;
20个数字
I Dw 0
J Dw 0
;
要排序的数字(20个),自己填在里面,例如:
_Dec Dw 351,3,99,118,15,256,1205,17,25,331
Dw 95,999,68,13,21,251,5235,137,25,391
AsmSort Proc Near
Push Cs
Pop Ds
Mov Word Ptr I,1
@@11:
Mov Ax,I
Inc Ax
Mov Word Ptr J,Ax
@@13:
;
得到数字的起始地址:
Mov Ax,Word Ptr J
Mov Bl,2
Mul Bl
Mov SI,Ax
Sub SI,2
Mov Ax,Word Ptr I
Mov Bl,2
Mul Bl
Sub Ax,2
Mov DI,Ax
LEA BX,_Dec
Add SI,Bx
Add DI,Bx
;
比较两个数字
Mov Ax,Word Ptr [SI]
Mov Cx,Word Ptr [DI]
Cmp Ax,Cx
Jle @@15 ;升序
;;
Jg @@15 ;降序
;
交换
Mov Word Ptr [SI],Cx
Mov Word Ptr [DI],Ax
@@15:
Mov Ax,_N
Inc Word Ptr J
Cmp Word Ptr J,Ax
Jle @@13
Mov Ax,_N
Inc Word Ptr I
Cmp Word Ptr I,Ax
Jl @@11
Ret
AsmSort EndP
ShowOne Proc Near
;
显示Ax的内容
Push Cs
Pop Ds
Mov Bx,10000
Mov Cx,5
@@21:
Push Cx
Push Ax
Xor Dx,Dx
Div Bx
Mov Cl,Al
;
显示
Mov Ah,0Eh
Add Al,'0'
Int 10h
Pop Ax
;
求余数
Push Ax
Xor Dx,Dx
Xor Ah,Ah
Mov Al,Cl
Mul Bx
Mov Cx,Ax
Pop Ax
Sub Ax,Cx
;
Bx = Bx Div 10
Push Ax
Xor Dx,Dx
Mov Ax,Bx
Mov Cx,10
Div Cx
Mov Bx,Ax
Pop Ax
Pop Cx
Loop @@21
Ret
ShowOne EndP
ShowRes Proc Near
;
把_Dec中的20个数字显示出来
Push Cs
Pop Ds
LEA BX,_Dec
Mov Cx,_N
@@31:
Mov Ax,Word Ptr [Bx]
Push Cx
Push Bx
Call ShowOne
;
显示间隔的","
Mov Ah,0Eh
Mov Al,','
Int 10h
Pop Bx
Pop Cx
Add Bx,2
Loop @@31
Ret
ShowRes EndP
_BSort Db 13,10,'Source Data: ',13,10,'$' ;
排序前
_LSort Db 13,10,13,10,'Last Data: ',13,10,'$' ;
排序后
_Ok Db 13,10,13,10,'Ok !!!',13,10,'$' ;
结束
Init:
Push Cs
Pop Ds
;
显示排序前数字
LEA Dx,_BSort
Mov Ah,9
Int 21h
Call ShowRes
;
排序
Call AsmSort
;
显示排序后数字
LEA Dx,_LSort
Mov Ah,9
Int 21h
Call ShowRes
;
显示结束
LEA Dx,_Ok
Mov Ah,9
Int 21h
;
程序终止
Mov Ax,4C00h
Int 21h
Code EndS
End Start