;本汇编程序使用冒泡排序算法将长度为20个字的数组由大到小进行排序
;使用简化的段定义
TITLE BUBBLE SORT 20 WORDS OF DATA
PAGE 60, 132
.MODEL SMALL
.STACK 64
;------------------------------------------
.DATA
ARRAY DW 18,1,5,9,17,3,2,4,6,10,11,20,8,16,19,7,13,14,12,15
N EQU 20
;------------------------------------------
.CODE
MAIN PROC FAR ;程序的起点
MOV AX, @DATA ;装载数据段的地址
MOV DS, AX ;将数据段的地址赋给DS
MOV CX, N-1 ;设置循环次数为N-1次
MOV DX, 1 ;控制外部循环的变量,初始化为1
AGAIN: CALL INNER ;通过调用子程序的方式进入内部循环
LOOP AGAIN ;如果CX<>0,继续执行AGAIN
MOV AH, 4CH ;返回程序控制到DOS中
INT 21H
MAIN ENDP
;------------------------------------------
;内部循环
INNER PROC NEAR
PUSH CX ;将主程序中的CX存入堆栈中
MOV CX, N-1 ;设置循环次数为N-1次
MOV SI, 0 ;初始化索引
;重复比较
RECMP: MOV AX, ARRAY[SI]
CMP AX, ARRAY[SI+2]
JGE NOCH ;如果AX>ARRAY[SI+2]则不进行交换,跳转到NOCH
XCHG AX, ARRAY[SI+2]
XCHG AX, ARRAY[SI]
;不进行交换,移动到数组的下一个字
NOCH: INC SI ;将SI加2移动到下一个字
INC SI
LOOP RECMP ;如果CX<>0,继续循环
POP CX ;循环结束后弹出堆栈中的CX,退出内部循环
RET
INNER ENDP
END MAIN ;结束主程序