【汇编语言】使用汇编语言实现冒泡排序并输出长度

冒泡排序:

假设有n个数字,第一个数字与第二个数字相比较,如果第一个数字大于第二个就交换;接着第二个数字与第三个数字相比较,如果第二个数字大于第三个就交换...一直到第n-1个数字与第n个数字相比较,第一趟比较完成。

每一趟比较完成后可以确定一个数字。第一趟可以确定第n个数字,需要比较n-1次;第二趟可以确定第n-1个数字,需要比较n-2次...

一直重复此步骤直到完成排序。

分段代码:

一、定义宏-两数交换

JH MACRO
	PUSH AX
	MOV AL,[SI]
	MOV AH,[DI]
	MOV [SI],AH
	MOV [DI],AL
	POP AX
ENDM 

二、定义宏-排序

PX MACRO
	LOCAL PX1,PX2,PX3
	PUSH SI
	PUSH DI
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	
	DEC CX
	MOV BX,CX
PX3:MOV SI,DX
	MOV DI,SI
	INC DI
	
		MOV CX,BX
	PX2:MOV AL,[SI]
		CMP AL,[DI]
		JA PX1
		JH
	
	PX1:INC SI
		INC DI
		LOOP PX2 
		
	DEC BX
	JNZ PX3
	
	POP DX
	POP CX
	POP BX
	POP AX
	POP DI
	POP SI
ENDM

三、定义宏-回车换行

HCHH MACRO
	PUSH DX
	PUSH AX
	MOV AH,2
	MOV DL,10
	INT 21H
	MOV DL,13
	INT 21H
	POP AX
	POP DX
ENDM

四、子程序-两位数输出

SCLWS PROC;两位数输出
	PUSH AX
	PUSH BX
	PUSH CX
	
	MOV BL,10
	MOV AH,0
	DIV BL;AX/BL=AL...AH
	ADD AX,3030H
	MOV CX,AX
	
	MOV AH,2
	MOV DL,CL
	INT 21H
	
	MOV AH,2
	MOV DL,CH
	INT 21H
	
	POP CX
	POP BX
	POP AX
RET 
SCLWS ENDP

五、数据段

DATAS SEGMENT
    STR1 DB 100,101 DUP ("$")
    STR2 DB 100 DUP (?) 
    STR3 DB "Please input some numbers:$"
    STR4 DB "After Bubble Sort:$"
    STR5 DB "Output length is:$"
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

六、代码段

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	MOV AX,DATAS
	MOV DS,AX
    
    LEA DX,STR3
    MOV AH,9
    INT 21H
    
    LEA DX,STR1
    MOV AH,10
    INT 21H
   
    PUSH DX
    
    HCHH
    
    LEA DX,STR4
    MOV AH,9
    INT 21H
    
    POP DX
   
    ADD DX,2
    MOV CH,0
    MOV CL,STR1+1
    
    PX
    
    MOV AH,9
    INT 21H
	
	HCHH
    
    LEA DX,STR5
    MOV AH,9
    INT 21H
    
    LEA BX,STR1+1
    MOV DX,[BX]
    MOV DH,0
    MOV AH,2
    MOV AL,DL
    CALL SCLWS
    
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
    
CODES ENDS
    END START

全部代码:

JH MACRO
	PUSH AX
	MOV AL,[SI]
	MOV AH,[DI]
	MOV [SI],AH
	MOV [DI],AL
	POP AX
ENDM 

PX MACRO
	LOCAL PX1,PX2,PX3
	PUSH SI
	PUSH DI
	PUSH AX
	PUSH BX
	PUSH CX
	PUSH DX
	
	DEC CX
	MOV BX,CX
PX3:MOV SI,DX
	MOV DI,SI
	INC DI
	
		MOV CX,BX
	PX2:MOV AL,[SI]
		CMP AL,[DI]
		JA PX1
		JH
	
	PX1:INC SI
		INC DI
		LOOP PX2 
		
	DEC BX
	JNZ PX3
	
	POP DX
	POP CX
	POP BX
	POP AX
	POP DI
	POP SI
ENDM

HCHH MACRO
	PUSH DX
	PUSH AX
	MOV AH,2
	MOV DL,10
	INT 21H
	MOV DL,13
	INT 21H
	POP AX
	POP DX
ENDM
	
DATAS SEGMENT
    STR1 DB 100,101 DUP ("$")
    STR2 DB 100 DUP (?) 
    STR3 DB "Please input some numbers:$"
    STR4 DB "After Bubble Sort:$"
    STR5 DB "Output length is:$"
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
	MOV AX,DATAS
	MOV DS,AX
    
    LEA DX,STR3
    MOV AH,9
    INT 21H
    
    LEA DX,STR1
    MOV AH,10
    INT 21H
   
    PUSH DX
    
    HCHH
    
    LEA DX,STR4
    MOV AH,9
    INT 21H
    
    POP DX
   
    ADD DX,2
    MOV CH,0
    MOV CL,STR1+1
    
    PX
    
    MOV AH,9
    INT 21H
	
	HCHH
    
    LEA DX,STR5
    MOV AH,9
    INT 21H
    
    LEA BX,STR1+1
    MOV DX,[BX]
    MOV DH,0
    MOV AH,2
    MOV AL,DL
    CALL SCLWS
    
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H
    
SCLWS PROC;两位数输出
	PUSH AX
	PUSH BX
	PUSH CX
	
	MOV BL,10
	MOV AH,0
	DIV BL;AX/BL=AL...AH
	ADD AX,3030H
	MOV CX,AX
	
	MOV AH,2
	MOV DL,CL
	INT 21H
	
	MOV AH,2
	MOV DL,CH
	INT 21H
	
	POP CX
	POP BX
	POP AX
RET 
SCLWS ENDP

CODES ENDS
    END START

运行截图:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值