0%

8086汇编语言程序设计简要记录(二)

用冒泡排序算法实现对六个数6、8、2、0、16、5从大到小排序。

对于8086汇编语言,冒泡排序算法的关键是如何处理内循环和外循环对计数寄存器CX的争夺(循环体有两个,但用于LOOP循环计数的寄存器只有一个);

其中一种方法可使用其他寄存器来保存一个循环体的计数值,但只有一个循环体可用LOOP指令来实现循环;

另一种方法则可使用堆栈来保存CX的值(相当于CX的值有两个),两个循环体均可使用LOOP指令。

方法一

源程序

DATA SEGMENT
NUM DB 6H,8H,2H,0H,10H,5H
DATA ENDS

CODE SEGMENT
ASSUME DS:DATA,CS:CODE

START:
MOV AX,DATA
MOV DS,AX

MOV CX,5 ;外循环5次

L1: ;外循环
MOV DI,CX ;将CX的值保存于DI,用于内循环L2的计数
MOV BX,0

L2: ;内循环
MOV AL,NUM[BX]
CMP AL,NUM[BX+1]
JNC COM
XCHG AL,NUM[BX+1]
MOV NUM[BX],AL

COM:
INC BX
DEC DI
JNZ L2 ;若DI不为0,则跳转到L2执行
LOOP L1

MOV AH,4CH
INT 21H
CODE ENDS
END START

调试结果

方法二

源程序

DATA SEGMENT
NUM DB 6H,8H,2H,0H,10H,5H
DATA ENDS

CODE SEGMENT
ASSUME DS:DATA,CS:CODE

START:
MOV AX,DATA
MOV DS,AX

MOV CX,5

L1: ;外循环
PUSH CX ;将CX的值压栈,即另外保存,CX原有的值将用于内循环L2的计数
MOV BX,0

L2: ;内循环
MOV AL,NUM[BX]
CMP AL,NUM[BX+1]
JNC COM
XCHG AL,NUM[BX+1]
MOV NUM[BX],AL

COM:
INC BX
LOOP L2
POP CX ;跳出内循环L2后,将弹栈的值赋给CX,用于外循环L1的计数
LOOP L1

MOV AH,4CH
INT 21H

CODE ENDS
END START

调试结果