有没有更简单的方法来编写masm模块化样式的冒泡排序算法?

时间:2015-04-24 22:58:23

标签: algorithm sorting assembly masm

我在汇编中写了一个冒泡排序算法,我为自己感到自豪,但与此同时我觉得我的泡泡排序错了。

有人可以告诉我它是否正确?如何使我的程序更加模块化,以便以后可以重复使用?

 .386
.model flat,stdcall
.stack 100h

printf proto c arg1:ptr byte, printlist:vararg

.data

array dword 8,9,10,40,80,0
fmtmsg2 db 0dh,0ah,0
fmtmsg1 db "%d ",0

.code


public main

main proc

      mov ecx,0
      mov edx,0
      mov esi,offset array
innerloop:

      inc ecx            
      cmp ecx,5          
      je outerloop       
      mov eax,[esi]      
      cmp eax,[esi + 4]  
      Jge noexchange        

      ;exchange values   
      xchg eax,[esi+4]   
      mov [esi],eax      
  noexchange:
      add esi,4           
      jmp innerloop          

outerloop:
     mov esi,offset array

     ;inner loop counter
     mov ecx,0 

     ;outer loop counter
     inc edx     

     cmp edx,5
     jne innerloop

     ;loop 3 counter
     mov edx,0

     ;load array offset
     mov esi,offset array

loop3:

     mov eax,[esi]
     push edx
     invoke printf,addr fmtmsg1,eax
     pop edx

     add esi,4
     inc edx
     cmp edx,5
     jne loop3

     invoke printf,addr fmtmsg2

     ret
main endp

end main

1 个答案:

答案 0 :(得分:0)

您的原始算法效果很好(祝贺)。它按降序对数组进行排序,例如,如果数组为[1,2,3,4,5],则结果为[5,4,3,2,1]。如果您想按升序排列,只需更改一条指令即可。我使用的是Visual Studio 2010,但代码是相同的(我的更改由箭头指向,但您只需要进行一次更改:" jbe"):

void death_reverse () {
int array[5] = { 5,4,3,2,1 };        // <=====================
__asm {          mov ecx,0
                  mov edx,0
                  lea esi, array        // <=====================
            innerloop:

                  inc ecx            
                  cmp ecx,5          
                  je outerloop       
                  mov eax,[esi]      
                  cmp eax,[esi + 4]  
                  Jbe noexchange         // <=============== ASCENDING ORDER.

                  ;exchange values   
                  xchg eax,[esi+4]   
                  mov [esi],eax      
              noexchange:
                  add esi,4           
                  jmp innerloop          

            outerloop:
                 lea esi, array        // <=====================

                 ;inner loop counter
                 mov ecx,0 

                 ;outer loop counter
                 inc edx     

                 cmp edx,5
                 jne innerloop

                 ;loop 3 counter
                 mov edx,0

                 ;load array offset
                 lea esi, array        // <=====================

            loop3:

                 mov eax,[esi]
                 push edx
                 invoke printf,addr fmtmsg1,eax
                 pop edx

                 add esi,4
                 inc edx
                 cmp edx,5
                 jne loop3

                 invoke printf,addr fmtmsg2
}
}