在数据区,给出了学生人数及汇编语言课程的成绩,请将成绩排序并保存在原数据区。
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;
}