实现n个双字型元素的排序,需要增设一个标记变量,来实现不重复操作。 .386 .model flat,stdcall option casemap:none includelib msvcrt.lib printf proto c:dword,:vararg scanf proto c:dword,:vararg .data darray dword 65535 dup(?) ;由于无法预知数组的大小,开辟一个65535大小的缓冲区 szFmt byte 'darray[%d]=%d',0ah,0 Tips byte 'N=',0,0ah Input byte '%d',0,0ah Msg byte 'count=%d',0ah,0 temp dword ? N dword ? flag byte 0 ;定义一个标志变量 count dword 0 ;定义一个监视交换次数的变量 .code start: invoke printf,offset Tips invoke scanf,offset Input,offset N ;输入一个代表数组大小的数 i00: invoke scanf,offset Input,offset temp ;输入数组各个元素 mov eax,temp mov dword ptr [darray+esi*4],eax ;降临时存储起来的数给数组 inc esi cmp esi,N ;比较是数组是否已经满 jb i00 ;loop没能实现,不知道为什么 mov eax,N ;初始化循环变量ecx dec eax mov ecx,eax xor eax,eax ;eax清零 i10: xor esi,esi mov flag,0 ;内循环开始的时候,值为0 i20: mov eax,darray[esi*4] ;内循环相邻的两个数 mov ebx,darray[esi*4+4] ; cmp eax,ebx ; jg i30 ;由于是降序,如果eax大,那么不进行交换 mov darray[esi*4],ebx ;进行交换 mov darray[esi*4+4],eax mov flag,1 ;如果发生了交换,那么flag=1,此时不会终止外循环 i30: inc esi ;内循环变量 cmp esi,ecx ;判断内循环是否已经终止 jb i20 cmp flag,1 ;判断是否发生了交换 jb i40 ;如果此次内循环没交换,那么退出外循环 inc count ;计数器+1 loop i10 i40: xor edi,edi i50: invoke printf,offset szFmt,edi,darray[edi*4] ;循环输出 inc edi cmp edi,N jb i50 invoke printf,offset Msg,count ;输出交换次数来验证 ret end start 原来的代码是书上的,但是需要自己想办法增加标记变量,然后运行就OK了! 呵呵!