我是靠谱客的博主 糊涂鲜花,最近开发中收集的这篇文章主要介绍dos汇编练习(2)——冒泡法排序完整版,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

8086的汇编和51单片机的汇编差距还是有点的,最明显的区别就是更难。
经典冒泡法排序的算法思想还是一致贯通的,可参考51单片机汇编_冒泡法排序

冒泡法原理:
相邻作比较,直至找出正确顺序。

注意不要和选择排序的原理混淆,传送门:DOS汇编练习(8)——选择排序
在这里插入图片描述
程序1:(debug下调试)

DATA SEGMENT
	DAT1 DB 08H,04H,09H,01H,60H,02H
	LEN1 = $-DAT1
DATA ENDS
CODE SEGMENT
	ASSUME CS:CODE,DS:DATA
START:
	MOV AX,DATA
	MOV DS,AX
	MOV CX,LEN1
	DEC CX
WAI:      ;外层循环控制趟数
	PUSH CX ;注意每次必须在外层循环内PUSH CX
	LEA SI,DAT1
NEI:      ;内存循环控制比较次数
	MOV AL,[SI]
	INC SI  ;相邻作比较
	MOV BL,[SI]
	CMP AL,BL
	JBE NEXT  ;从小到大排序,如果AL<BL则跳过,比较下一个相邻值
	XCHG AL,BL
	MOV BYTE PTR [SI],BL  ;送回原来的地址
	MOV BYTE PTR [SI-1],AL
NEXT:
	;注意千万不能在这里加INC SI,否则SI每比较完一次多加一次
	LOOP NEI  ;CX-1
	POP CX  ;比较完一趟弹出CX原来的值
	LOOP WAI  ;CX-1
	
	MOV AH,4CH
	INT 21H
CODE ENDS
	END START

程序2:(含显示功能)

huiche macro ;回车宏
	mov ah,02h ;系统中断,显示功能
	mov dl,0ah ;0aH是换行符的ASCII码
	int 21h
	mov ah,02h
	mov dl,0dh ;是将DL中的ASCII码显示到屏幕
	int 21h
	endm

data segment
	var db 51h,63h,45h,84h,03h
	varlen = $-var ;定义数据长度,到$终止	
	str1 db "Before sorted:",0dh,0ah,"$"
	str2 db "Sorted:",0dh,0ah,"$"
data ends

code segment
	assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax
	
	lea dx,str1
	mov ah,09h ;输出字符串功能,显示"Before sorted:"
	int 21h
	huiche
	
	mov cx,varlen
	lea bx,var
	call dispbcd ;调用显示字符子程序
	huiche

	lea bx,var
	mov cx,varlen
	dec cx

wai:		;外层循环控制趟数
	mov si,bx
	mov di,bx
	inc si
	push cx ;这句的位置及其关键!不要不理解而放在了循环外面,否则会造成程序死循环

nei:		;内层循环控制一趟比较次数
	mov al,[di] ;交换部分
	cmp al,[si]
	jb next	;判断是否交换
	mov al,[si]
	push ax
	mov al,[di]
	mov [si],al
	pop ax
	mov [di],al
next:		;不交换,往下计数
	Inc si
	inc di
	loop nei  ;一趟没比较完继续内层循环
	
	pop cx    ;cx计数器重新赋值
	loop wai  ;loop对cx减1,进行下一趟循环
	
	huiche

	lea dx,str2 
	mov ah,09h ;显示"Sorted:"
	int 21h
	huiche

	lea bx,var
	mov cx,varlen
	call dispbcd
	huiche

	mov ah,4ch ;系统中断标志
	int 21h

dispbcd proc near
disp:
	mov dl,[bx]
	mov ah,02h
	rol dl,1
	rol dl,1
	rol dl,1
	rol dl,1
	and dl,0fh
	or dl,30h
	int 21h
	mov dl,[bx]
	and dl,0fh
	or dl,30h
	int 21h
	inc bx
	mov ah,02h
	mov dl,"," ;用逗号隔开
	int 21h
	loop disp
	ret
dispbcd endp

code ends
	end start

结果显示:
在这里插入图片描述
程序1中,要换成从大到小排序,只需将JB(Below 小于则跳)换成JA(Above 大于则跳);
程序2中,要换成从大到小排序,只需将jb换成jnb

最后

以上就是糊涂鲜花为你收集整理的dos汇编练习(2)——冒泡法排序完整版的全部内容,希望文章能够帮你解决dos汇编练习(2)——冒泡法排序完整版所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部