怎么使用汇编语言实现冒泡排序
我们先想想C语言里是怎么实现的冒泡排序
#include<stdio.h>
int main()
{
int arr[10];
int brr[10];
int a,c,d,s,i;
for(a=0; a<10; a++)
scanf("%d",&arr[a]);
for (c=0; c<9; c++)
{
for(d=0; d<9-c; d++)
{
if(arr[d]>arr[d+1])
{
s=arr[d];
arr[d]=arr[d+1];
arr[d+1]=s;
}
}
}
for(i=0; i<10; i++)
printf("%d\n",arr[i]);
return 0;
}
我么可以仿照C语言来实现我们的排序
首先cx值为外层循环变量,进入第二层循环时,cx的值入栈,保留其值。
再将cx的值置为内层循环次数的值。完成双层循环。
具体实现如下
Assume cs:code,ds:data,ss:stack
data segment
dw 123h,5h,9h,11h,33h,6h,9h,76h;数据段初始化
dw 100h,3h,6 dup(0);[14]内存存放外层已经循坏了多少次
data ends
stack segment;栈段初始化
dw 0,0,0,0,0,0,0,0
stack ends
code segment;代码段
start:
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,10h
mov cx,9
mov bx,0
mov dx,0
L: ;外层循坏,固定为9次
push cx;外层循坏cx值入栈
mov ax,9
sub ax,word ptr ds:[14h];内层循坏次数9-ds:[14]次
mov cx,ax;将循坏次数mov到cx中
mov ax,0
mov bx,0
s:;内存循坏开始,每次将第da:[14]+1大的数放到最后面
mov ax,ds:[bx];取出第一个数值
mov dx,ds:[bx+2];取出第二个数值
cmp ax,dx;进行比较
jna next;如果ax<=dx就转到next,否则就继续
push ax;实现两个数的交换
push dx
pop ds:[bx]
pop ds:[bx+2]
next:nop
add bx,2;将bx往后移一个字
loop s
pop cx;外层循坏cx出栈
mov ax,0;
mov ax,word ptr ds:[14h];这里三行实现ds:[14]计数功能计算外层循坏次数
inc ax
mov word ptr ds:[14h],ax
loop L
mov ax,4c00h
int 21h
code ends
end start