汇编语言实现快速冒泡排序
(2012-10-26 20:14:41)
标签:
编程it |
分类: 2012 |
DATAS SEGMENT
DATAS ENDS
CODES SEGMENT
START:
LOOP1:
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:
CMP AL,[DI+1]
;将前一个数与后一个数比较
JLE LOOP3 ;ZF=1或SF!=OF
若前一个数小于或等于后一个数,则跳转到LOOP3
XCHG [DI+1],AL
;前者大于后者,则交换两数
MOV [DI],AL
;如果前一个数字大于后一个数字,则交换
MOV
BL,1
LOOP3:
LOOP LOOP2
;循环L00P2,直到CX==0成立
POP CX
;将CX从堆栈中弹出
MOV COUNT,CL
;改变外层计数器的值
JMP
LOOP1
DATAOUT:
LEA DI,DATA
;载入数据段(数组)首地址
NEXT:
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:
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
后一篇:汇编指令