Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 有没有一种更简单的方法来编写masm模块化风格的冒泡排序算法?_Algorithm_Sorting_Assembly_Masm - Fatal编程技术网

Algorithm 有没有一种更简单的方法来编写masm模块化风格的冒泡排序算法?

Algorithm 有没有一种更简单的方法来编写masm模块化风格的冒泡排序算法?,algorithm,sorting,assembly,masm,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

我在汇编中编写了一个冒泡排序算法,我为自己感到自豪,但同时我认为我的冒泡排序是错误的

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

 .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,2,3,4,5],则结果为[5,4,3,2,1]。如果您希望它按升序排列,只需更改一条指令。我使用了Visual Studio 2010,但代码是相同的(我的更改由箭头指示,但您只需要一个更改:“jbe”):

void death\u反向(){

int array[5]={5,4,3,2,1};//“如果正确,请告诉我”-我们不是来为您进行测试的。发布数组声明。如果您希望获得代码反馈而不是代码帮助,我建议将此迁移到codereview
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
}
}