Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. ; Sort array of unsigned dwords in non-decreasing order.
  2. ; ecx = array size, edx = array pointer.
  3. ; Destroys eax, ecx, esi, edi.
  4. sort:
  5.         test    ecx, ecx
  6.         jz      .done
  7.         mov     eax, ecx
  8. @@:
  9.         push    eax
  10.         call    .restore
  11.         pop     eax
  12.         dec     eax
  13.         jnz     @b
  14. @@:
  15.         cmp     ecx, 1
  16.         jz      .done
  17.         mov     esi, 1
  18.         mov     edi, ecx
  19.         call    .exchange
  20.         dec     ecx
  21.         mov     eax, 1
  22.         call    .restore
  23.         jmp     @b
  24. .done:
  25.         ret
  26.  
  27. .exchange:
  28.         push    eax ecx
  29.         mov     eax, [edx+esi*4-4]
  30.         mov     ecx, [edx+edi*4-4]
  31.         mov     [edx+esi*4-4], ecx
  32.         mov     [edx+edi*4-4], eax
  33.         pop     ecx eax
  34.         ret
  35.  
  36. .restore:
  37.         lea     esi, [eax+eax]
  38.         cmp     esi, ecx
  39.         ja      .doner
  40.         mov     edi, [edx+eax*4-4]
  41.         cmp     [edx+esi*4-4], edi
  42.         ja      .need_xchg
  43.         cmp     esi, ecx
  44.         jae     .doner
  45.         mov     edi, [edx+eax*4-4]
  46.         cmp     [edx+esi*4], edi
  47.         jbe     .doner
  48. .need_xchg:
  49.         cmp     esi, ecx
  50.         jz      .do_xchg
  51.         mov     edi, [edx+esi*4-4]
  52.         cmp     [edx+esi*4], edi
  53.         sbb     esi, -1
  54. .do_xchg:
  55.         mov     edi, eax
  56.         call    .exchange
  57.         mov     eax, esi
  58.         jmp     .restore
  59. .doner:
  60.         ret
  61.