Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
180 heavyiron 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