汇编语言实现快速冒泡排序
2014-04-15 10:50
232 查看
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从堆栈中弹出
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
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从堆栈中弹出
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
相关文章推荐
- 常见的排序算法(Java实现):冒泡、插入、选择、快速排序
- 插入,归并,快速,冒泡,shell,选择排序 用c实现
- 算法代码实现之三向切分快速排序,Golang(Go语言)实现
- 冒泡、快速、直接插入、选择排序算法(Java语言实现)
- 排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 汇编实现快速排序
- 冒泡、插入、快速、选择排序的java实现
- 冒泡,选择,插入,快速排序在Java中的实现
- 算法导论 - 快速排序的 C 语言实现
- C语言排序实例(选择、冒泡、插入、折半、快速)
- 【转】排序算法复习(Java实现)(一): 插入,冒泡,选择,Shell,快速排序
- 快速排序的Java语言与C语言实现
- C++实现快速冒泡排序
- java实现冒泡,选择,插入,快速排序
- 快速排序的不同语言不同方法实现的…
- Java语言实现九大排序算法(快速、归并、堆、选择、插入、计数、基数、希尔、冒泡)
- 汇编语言八 编写程序实现,将缓冲区BUFFER中的100个字按递增排序
- Java 常用排序算法实现--快速排序、插入排序、选择、冒泡
- 快速排序的不同语言不同方法实现的…
- (数据结构排序的实验四)快速,冒泡,简单选择,直接插入排序的c语言实现!!