求注释汇编冒泡排序代码

2025-02-25 03:17:52
推荐回答(1个)
回答1:

你给的代码是对一个结构数据数组的冒泡排序,不太容易看懂。下面的程序是对word数组的冒泡排序,要简单得多,也好理解。
程序中还附有选择排序的汇编代码,编制这个程序是为了比较是汇编快,还是pascal语言快!
供参考。
{$G+} {$R-,S-}
uses dos;
const 
n=32000;
type
arr=array[1..n] of word;
var
a:arr;
b:^arr;
i,j,maxi,max,num,t:word;
h0,m0,s0,ss0,h,m,s,ss:word;
t1,t2:longint;
begin
new(b);
randomize;
num:=n-1;
for i:=1 to n do a[i]:=random(10000)+1; 
b^:=a;

{以下为pascal冒泡排序}
a:=b^;
gettime(h0,m0,s0,ss0);
for i:=1 to n-1 do
for j:=1 to n-i do 
if (a[j] begin t:=a[j]; a[j]:=a[j+1]; a[j+1]:=t; end;
gettime(h,m,s,ss);
t1:=(h0*3600+m0*60+s0)*100+ss0;
t2:=(h*3600+m*60+s)*100+ss;
writeln('pascal冒泡=',t2-t1);
{for i:=1 to n do writeln(a[i]);}
writeln;

{以下为pascal选择排序}
a:=b^;
gettime(h0,m0,s0,ss0);
for i:=1 to n-1 do begin
maxi:=i;
max:=a[i];
for j:=i+1 to n do 
if (a[j]>max) then begin maxi:=j; max:=a[j]; end;
if (i<>maxi) then begin t:=a[i]; a[i]:=a[maxi]; a[maxi]:=t; end;
end;
gettime(h,m,s,ss);
t1:=(h0*3600+m0*60+s0)*100+ss0;
t2:=(h*3600+m*60+s)*100+ss;
writeln('pascal选择=',t2-t1);
{for i:=1 to n do writeln(a[i]);}
writeln;

{以下为汇编冒泡排序}
a:=b^;
gettime(h0,m0,s0,ss0);
asm
mov ax,seg a
mov ds,ax
mov es,ax
{dec word ptr[num] }  {数num减一,因为从0开始}
mov cx,num
       lea di,a
@1:
       push cx
mov bx,0
@2: mov ax,word ptr[di][bx] 
       cmp ax,word ptr[di][bx+2]
       jge @3
       mov dx,word ptr[di][bx+2]
       mov word ptr[di][bx+2],ax
       mov word ptr[di][bx],dx
@3: inc bx
inc bx
     loop @2
pop cx
loop @1
end;
gettime(h,m,s,ss);
t1:=(h0*3600+m0*60+s0)*100+ss0;
t2:=(h*3600+m*60+s)*100+ss;
writeln('汇编冒泡=',t2-t1);
{for i:=1 to n do writeln(i:6,a[i]:6);}
writeln;

{以下为汇编选择排序}
a:=b^;
gettime(h0,m0,s0,ss0);
asm
mov ax,seg a
mov ds,ax
mov es,ax
mov cx,num
       lea di,a
mov bx,0
@@1:
       push cx
mov si,di
inc si
inc si             {si=di+2}
push di            {保存di }
mov ax,[di][bx]    {假设max 为第一个}
@@2:    mov dx,[si][bx]    {存储器到寄存器,节省时间}
cmp ax,dx
       jge @@3
mov di,si          {小于时,将si替换di,即将j替换i, 保存maxi}
mov ax,dx          {保存max 到ax}
@@3: inc si
inc si
     loop @@2
mov si,di          {还原si,即将i替换j} 
pop di             {取出栈中保存的i}
cmp di,si          {与j 比较}
je @@4             {相同时不交换}
mov ax,[di][bx]    {在内循环之外交换}
xchg ax,[si][bx]
       mov [di][bx],ax
@@4: inc bx
inc bx
pop cx
loop @@1
end;
gettime(h,m,s,ss);
t1:=(h0*3600+m0*60+s0)*100+ss0;
t2:=(h*3600+m*60+s)*100+ss;
writeln('汇编选择=',t2-t1);
{for i:=1 to n do writeln(i:6,a[i]:6);}
writeln;
dispose(b);
end.

==============================
计算结果:

pascal冒泡=900

pascal选择=275

汇编冒泡=560

汇编选择=302