刚学汇编,于是用汇编编写了选择排序算法,初学真是各种心累啊。
(选择排序思想即为每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。)
DATA SEGMENT
BUF DB 03H,02H,01H,05H,04H
COUNT EQU $-BUF
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATA
MOV DS,AX
MOV SI,OFFSET BUF ;取BUF偏移地址送SI
MOV CX,COUNT ;设置循环计数器
LOOP1: ;外层循环
CALL LOOP2 ;调用子函数LOOP2进行内层循环,两层循环实现选择排序
INC SI ;地址指针加1
DEC CX ;计数器减1
JNZ LOOP1
MOV SI,OFFSET BUF
MOV CX,COUNT
LP: CALL OUTPUT ;(27-32)调用子函数OUTPUT输出排序结果
INC SI
DEC CX
JNZ LP
MOV AH,4CH ;退出
INT 21H
LOOP2 PROC NEAR ;子函数LOOP2
PUSH CX ;CX进栈保护现场
MOV DI,SI ;选择排序,令内外层偏移值相等
MOV AX,DI
SUB AX,OFFSET BUF
MOV DX,COUNT
SUB DX,AX
MOV CX,DX ;(44-48行)调整好计数器的值
AGAIN: ;内层循环
MOV AL,[SI]
MOV BL,[DI]
CMP AL,BL ;选择排序思想,每次将第i小的数放到第i个位置
JA SWAP ;调用交换子函数
JMP CONTINUE
SWAP: MOV AL,[SI] ;(56-59行)交换
XCHG AL,[DI]
XCHG AL,[SI]
JMP CONTINUE
CONTINUE:
INC DI
DEC CX
JNZ AGAIN
POP CX ;CX出栈回复现场
RET
LOOP2 ENDP
OUTPUT PROC NEAR ;输出单个数的子程序
MOV DL,30H ;DL初始值30H,因为数字0的ASCII值为30H
MOV AH,02H
ADD DL,[SI]
INT 21H
RET
OUTPUT ENDP
CODE ENDS
END START
#include<cstdio>
int main()
{
int buf[]={3,2,1,5,4};
int len=5;
for(int i=0;i<len;i++)
{
for(int j=i;j<len;j++)
{
if(buf[i]>buf[j])
{
int temp=buf[i];
buf[i]=buf[j];
buf[j]=temp;
}
}
}
for(int i=0;i<len;i++)
printf("%d ",buf[i]);
return 0;
}
汇编代码运行结果截图(运行环境为DOSBOX):