怎麼使用彙編語言實現冒泡排序
我們先想想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
這樣就大功告成了。