DATAS SEGMENT
DATA DB 24,18,-8,-16,66,56,86,6,10,98
COUNT DB 10,10
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,ES:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV ES,AX
MOV BL,1 改进版本,用BL来检验是否排序完成,减少循环次数
LOOP1:
CMP BL,0
JE DATAOUT ZF=1,若相等或为0,则跳转
XOR BL,BL 用逻辑异或将BL清零
MOV CL,COUNT COUNT用于外层的计数
DEC CL CL减一,CL用于内层的计数
PUSH CX 将CX压入堆栈
LEA DI,DATA 将数据段首地址赋值给DI
LOOP2:
MOV AL,[DI]
CMP AL,[DI+1] 将前一个数与后一个数比较
JLE LOOP3 ZF=1或SF!=OF 若前一个数小于或等于后一个数,则跳转到LOOP3
XCHG [DI+1],AL 前者大于后者,则交换两数
MOV [DI],AL 如果前一个数字大于后一个数字,则交换
MOV BL,1
LOOP3:
INC DI 指针加一
LOOP LOOP2 循环L00P2,直到CX==0成立
POP CX 将CX从堆栈中d出
MOV COUNT,CL 改变外层计数器的值
JMP LOOP1
DATAOUT:
MOV CL,10 开始数据输出
LEA DI,DATA 载入数据段(数组)首地址
NEXT:
MOV AX,0 输出下一个数
MOV BH,2 输出的数字之间的空格
MOV AL,[DI] 取数
CMP AL,0
JGE NON 如果是非负数,则跳至NON
NEG AL 若是负数,将AL中的负数取补转成对应的正数
PUSH AX INT 21H 中断将会有一个返回值
MOV AH,2 同时显示负数的标记‘-’
MOV DL,'-' 注意这个时候 AX 的值会因为 21H中断的调用而改变, 所以先要保存起来
INT 21H 若是负数,在屏幕上显示‘-’号
POP AX 某些中断之后AX会改变
NON: XOR AH,AH 将AH清零
DIV COUNT+1 除以10取十位
MOV DH,AH AH是余数,AL是商(如果是个位数,则AL为零)
CMP AL,0
JE SINGLE 如果AL为零(个位数),则跳转到DIR,直接输出十位数
ADD AL,30H 将数字转换成ASC码
MOV DL,AL 数字放入DL,在屏幕输出
MOV AH,2
INT 21H 显示十位上的数值
SINGLE:
MOV AL,DH 将余数(个位数)放入AL
XOR AH,AH 将AH清零
ADD AX,3030H
MOV DL,AL 所以最好在显示时判断是否是大于100或者小于100再根据判断结果来处理 DIV
OUTP:MOV AH,2 显示输出功能
INT 21H 显示个位数
DEC BH BH减一
JZ XT 若相等或为0,则跳转
MOV DL,BL BL为零,屏幕输出空格
JMP OUTP
XT: DEC CL 输出数组下一个
JZ DONE 如果ZF标志位为零(CL为零),则程序完成
INC DI 数组指针+1
JMP NEXT 继续输出数组下一个数
DONE: MOV AH,1 键盘输入并回显功能,目的是使程序输出窗口暂停,以便看到输出结果
INT 21H
MOV AH,4CH 带返回码结束功能
INT 21H 返回系统
CODES ENDS
END START
以下是冒泡排序子程序,可直接调用:(请设置es与ds相同)
===============================
字数组排序(有符号数冒泡排序)
SORTWORD PROC NEAR
数组长度置入cx,数组首地址置入 si
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
PUSH CX
POP DX
DEC DX
@SORTWL1:
MOV CX,DX
MOV DI,SI
@SORTWL2:
MOV AX,[DI+2]
CMP AX,[DI]
JL @SORTWNEXT 从大到小(无符号换成 JB)
XCHG AX,[DI]
MOV [DI+2],AX
@SORTWNEXT:
INC DI
INC DI
LOOP @SORTWL2
DEC DX
JNZ @SORTWL1
POPF
POP DI
POP SI
POP DX
POP CX
POP AX
RET
SORTWORD ENDP
===============================================
字节数组排序(有符号数冒泡排序)
SORTBYTE PROC NEAR
数组长度置入cx,数组首地址置入 si
PUSH AX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
PUSH CX
POP DX
DEC DX
@SORTBL1:
MOV CX,DX
MOV DI,SI
@SORTBL2:
MOV AL,[DI+1]
CMP AL,[DI]
JL @SORTBNEXT 从大到小(无符号换成 JB)
XCHG AL,[DI]
MOV [DI+1],AL
@SORTBNEXT:
INC DI
LOOP @SORTBL2
DEC DX
JNZ @SORTBL1
POPF
POP DI
POP SI
POP DX
POP CX
POP AX
RET
SORTBYTE ENDP
===============================================
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)