汇编语言能实现冒泡排序等排序算法吧?当然可以,排序可不是什么复杂的东东。就在第7周,给大家补充一下cmp、jxxx、xchg指令,下面的冒泡就出来了。
可以对照着附后的C语言排序实现理解。
assume cs:cseg, ds:dseg, ss:sseg
sseg segment stack
dw 10H dup (?)
sseg ends
dseg segment
dw 123,5,9,11,33,6,9,76,100,3
dseg ends
cseg segment
start: mov ax, dseg
mov ds, ax
mov cx, 9 ;外层循环9趟
sort: push cx ;保存外层循环次数
;注意到外层第1次循环,内循环执行9次,外层第2次循环,内循环执行8次,...控制外循环的cx值恰就是内层循环次数
mov si, 0 ;相当于内层循环时j=0
inner: mov ax, [si] ;(ax)即a[j]
cmp ax, [si+2] ;a[j]与a[j+1]比较
jbe noswap ;a[j]<=a[j+1]时不交换,等同于a[j]>a[j+1]时交换
xchg ax, [si+2] ;交换
mov [si], ax ;最终效果是a[j]与a[j+1]交换了
noswap: add si, 2 ;要到下一个数了,相当于j++
loop inner ;内层循环
pop cx ;恢复外层循环的cx
loop sort ;外层循环
mov ax, 4c00h
int 21h
cseg ends
end start
上面的汇编程序,对应下面的C语言程序。可以对照着阅读:
#include <stdio.h>
#define n 10
int main( )
{
int i,j,t,a[n]= {123,5,9,11,33,6,9,76,100,3};
for (i=0; i<n-1; i++)
for(j=0; j<n-i-1; j++)
if (a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}