DSEG SEGMENT
n equ 10
BUFFER DB 9,11,2,7,21,13,2,0,14,3
DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG
MAIN PROC FAR ;主程序入口
mov ax, dseg
mov ds, ax
mov cx,n
dec cx
loop1: mov di,cx
mov bx,0
loop2: mov al,buffer[bx]
cmp al,buffer[bx+1]
jge continue
xchg al,buffer[bx+1]
mov buffer[bx],al
continue: add bx,1
loop loop2
mov cx,di
loop loop1
mov ah,1;按任意键退出
int 21h
mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
MAIN ENDP
CSEG ENDS
END MAIN
经典排序之冒泡排序
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 定义常量
Yes EQU 1
No EQU 0
On EQU 1
Off EQU 0
; -----------------------------------------
; 定义结构类型
Bubb_Para Struc ; 冒泡排序法参数表
Carry DB No ; 是否带符号。Yes:有符号数;No:无符号数
Sort DB No ; 升序/降序。Yes:升序;No:降序
Yes_No DB 73h,76h,7dh,7eh
Load DB 0ach,0adh
Comp DB 3ah,3bh
Exchange DB 86h,87h
Store DB 0aah,0abh
Bubb_Para EndS
; -----------------------------------------
; 功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序。
; 子程序原型:对字节元素进行无符号升序排序。
Bubbling Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
; ------------------根据排序参数,修改排序指令
LEA SI,Parameters
LEA DI,@@Compare
MOV AL,TYPE BUFFER
DEC AL
PUSH AX
LEA BX,[SI.Load]
XLAT
MOV [DI][2],AL
POP AX
PUSH AX
LEA BX,[SI.Comp]
XLAT
MOV [DI][3],AL
POP AX
PUSH AX
LEA BX,[SI.Exchange]
XLAT
MOV [DI][7],AL
POP AX
LEA BX,[SI.Store]
XLAT
MOV [DI][9],AL
MOV AL,[SI.Carry]
SHL AL,1
OR AL,[SI.Sort]
XOR AH,AH
LEA BX,[SI.Yes_No]
XLAT
MOV [DI][5],AL
; ------------------按要求排序
MOV CX,Elements ;外循环次数
@@Scanning: PUSH CX ;入栈保存外循环次数
LEA SI,BUFFER ;数组首地址装入源变址寄存器
@@Compare: PUSH SI
POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用
LODSB ;将当前数组元素读入累加器
CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较
JBE @@NextOne ;若小于或等于,不作数据交换,处理下一个数组元素
XCHG AL,[SI] ;若大于,交换数组元素
STOSB ;保存数值较小者
@@NextOne: LOOP @@Compare ;处理下一个数组元素
POP CX ;外循环次数出栈
LOOP @@Scanning ;下一趟比较
; ------------------
POP DI
POP SI
POP CX
POP BX
POP AX
RET
Bubbling EndP
BUFFER DB 9,11,2,7,21,13,2,0,14,3 ;需要排序的数据
Elements EQU ($-BUFFER)/Type BUFFER-1 ; 外循环次数
Parameters Bubb_Para
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
call Bubbling ;对BUFFER中的元素按无符号数、升序排序
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END
DSEG SEGMENT
n equ 10
BUFFER DB 9,11,2,7,21,13,2,0,14,3
DSEG ENDS
CSEG SEGMENT
assume cs:CSEG, ds:DSEG
MAIN PROC FAR ;主程序入口
mov ax, dseg
mov ds, ax
mov cx,n
dec cx
loop1: mov di,cx
mov bx,0
loop2: mov al,buffer[bx]
cmp al,buffer[bx+1]
jge continue
xchg al,buffer[bx+1]
mov buffer[bx],al
continue: add bx,1
loop loop2
mov cx,di
loop loop1
mov ah,1;按任意键退出
int 21h
mov ax, 4c00h ;程序结束,返回到操作系统系统
int 21h
MAIN ENDP
CSEG ENDS
END MAIN
; 冒泡法排序
Code Segment
Assume CS:Code,DS:Code
; -----------------------------------------
; 定义常量
Yes EQU 1
No EQU 0
On EQU 1
Off EQU 0
; -----------------------------------------
; 定义结构类型
Bubb_Para Struc ; 冒泡排序法参数表
Carry DB No ; 是否带符号。Yes:有符号数;No:无符号数
Sort DB No ; 升序/降序。Yes:升序;No:降序
Yes_No DB 73h,76h,7dh,7eh
Load DB 0ach,0adh
Comp DB 3ah,3bh
Exchange DB 86h,87h
Store DB 0aah,0abh
Bubb_Para EndS
; -----------------------------------------
; 功能:按要求对数组元素排序,能够对字节元素、字元素进行无符号数、有符号数的升序、降序排序。
; 子程序原型:对字节元素进行无符号升序排序。
Bubbling Proc Near
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI
; ------------------根据排序参数,修改排序指令
LEA SI,Parameters
LEA DI,@@Compare
MOV AL,TYPE BUFFER
DEC AL
PUSH AX
LEA BX,[SI.Load]
XLAT
MOV [DI][2],AL
POP AX
PUSH AX
LEA BX,[SI.Comp]
XLAT
MOV [DI][3],AL
POP AX
PUSH AX
LEA BX,[SI.Exchange]
XLAT
MOV [DI][7],AL
POP AX
LEA BX,[SI.Store]
XLAT
MOV [DI][9],AL
MOV AL,[SI.Carry]
SHL AL,1
OR AL,[SI.Sort]
XOR AH,AH
LEA BX,[SI.Yes_No]
XLAT
MOV [DI][5],AL
; ------------------按要求排序
MOV CX,Elements ;外循环次数
@@Scanning: PUSH CX ;入栈保存外循环次数
LEA SI,BUFFER ;数组首地址装入源变址寄存器
@@Compare: PUSH SI
POP DI ;当前数组元素地址赋给目的变址寄存器,以备交换之用
LODSB ;将当前数组元素读入累加器
CMP AL,[SI] ;当前数组元素与相邻的下一个数组元素相比较
JBE @@NextOne ;若小于或等于,不作数据交换,处理下一个数组元素
XCHG AL,[SI] ;若大于,交换数组元素
STOSB ;保存数值较小者
@@NextOne: LOOP @@Compare ;处理下一个数组元素
POP CX ;外循环次数出栈
LOOP @@Scanning ;下一趟比较
; ------------------
POP DI
POP SI
POP CX
POP BX
POP AX
RET
Bubbling EndP
BUFFER DB 9,11,2,7,21,13,2,0,14,3 ;需要排序的数据
Elements EQU ($-BUFFER)/Type BUFFER-1 ; 外循环次数
Parameters Bubb_Para
Start: push cs
pop ds
push cs
pop es ;使数据段、附加段与代码段同段
call Bubbling ;对BUFFER中的元素按无符号数、升序排序
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Code ENDS
END Start ;编译到此结束