Subversion Repositories Kolibri OS

Rev

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

  1. ; Сортировка dword'ов в количестве ecx по адресу edx, функция сравнения в ebx
  2. ; Разрушает eax, ecx, esi, edi
  3. sort:
  4.         jecxz   .done
  5.         mov     eax, ecx
  6. @@:
  7.         push    eax
  8.         call    .restore
  9.         pop     eax
  10.         dec     eax
  11.         jnz     @b
  12. @@:
  13.         cmp     ecx, 1
  14.         jz      .done
  15.         mov     esi, 1
  16.         mov     edi, ecx
  17.         call    .exchange
  18.         dec     ecx
  19.         mov     eax, 1
  20.         call    .restore
  21.         jmp     @b
  22. .done:
  23.         ret
  24.  
  25. .exchange:
  26.         push    eax ecx
  27.         mov     eax, [edx+esi*4-4]
  28.         mov     ecx, [edx+edi*4-4]
  29.         mov     [edx+esi*4-4], ecx
  30.         mov     [edx+edi*4-4], eax
  31.         pop     ecx eax
  32.         ret
  33.  
  34. .restore:
  35.         lea     esi, [eax+eax]
  36.         cmp     esi, ecx
  37.         ja      .doner
  38.         push    esi
  39.         mov     esi, [edx+esi*4-4]
  40.         mov     edi, [edx+eax*4-4]
  41.         call    ebx
  42.         pop     esi
  43.         ja      .need_xchg
  44.         cmp     esi, ecx
  45.         jae     .doner
  46.         push    esi
  47.         mov     esi, [edx+esi*4]
  48.         mov     edi, [edx+eax*4-4]
  49.         call    ebx
  50.         pop     esi
  51.         jbe     .doner
  52. .need_xchg:
  53.         cmp     esi, ecx
  54.         jz      .do_xchg
  55.         push    esi
  56.         mov     edi, [edx+esi*4-4]
  57.         mov     esi, [edx+esi*4]
  58.         call    ebx
  59.         pop     esi
  60.         sbb     esi, -1
  61. .do_xchg:
  62.         mov     edi, eax
  63.         call    .exchange
  64.         mov     eax, esi
  65.         jmp     .restore
  66. .doner:
  67.         ret
  68.