Subversion Repositories Kolibri OS

Rev

Rev 542 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 542 Rev 3675
Line 1... Line 1...
1
; ‘®àâ¨à®¢ª  dword'®¢ ¢ ª®«¨ç¥á⢥ ecx ¯®  ¤à¥áã edx, äã­ªæ¨ï áà ¢­¥­¨ï ¢ ebx
1
; Sorting bunch of dwords, count = ecx, locating at address = edx,
-
 
2
; comparison function at ebx
2
;  §àãè ¥â eax, ecx, esi, edi
3
; Destroy content of eax, ecx, esi, edi
3
sort:
4
sort:
4
        jecxz   .done
5
        jecxz   .done
5
        mov     eax, ecx
6
        mov     eax, ecx
-
 
7
 
6
@@:
8
    @@:
7
        push    eax
9
        push    eax
8
        call    .restore
10
        call    .restore
9
        pop     eax
11
        pop     eax
10
        dec     eax
12
        dec     eax
11
        jnz     @b
13
        jnz     @b
-
 
14
 
12
@@:
15
    @@:
13
        cmp     ecx, 1
16
        cmp     ecx, 1
14
        jz      .done
17
        jz      .done
15
        mov     esi, 1
18
        mov     esi, 1
16
        mov     edi, ecx
19
        mov     edi, ecx
17
        call    .exchange
20
        call    .exchange
18
        dec     ecx
21
        dec     ecx
19
        mov     eax, 1
22
        mov     eax, 1
20
        call    .restore
23
        call    .restore
21
        jmp     @b
24
        jmp     @b
-
 
25
 
22
.done:
26
    .done:
23
        ret
27
        ret
Line 24... Line 28...
24
 
28
 
25
.exchange:
29
    .exchange:
Line 32... Line 36...
32
        ret
36
        ret
Line 33... Line 37...
33
 
37
 
34
.restore:
38
    .restore:
35
        lea     esi, [eax+eax]
39
        lea     esi, [eax+eax]
36
        cmp     esi, ecx
40
        cmp     esi, ecx
37
        ja      .doner
41
        ja      .donerr
38
        push    esi
42
        push    esi
39
        mov     esi, [edx+esi*4-4]
43
        mov     esi, [edx+esi*4-4]
40
        mov     edi, [edx+eax*4-4]
44
        mov     edi, [edx+eax*4-4]
41
        call    ebx
45
        call    ebx
42
        pop     esi
46
        pop     esi
43
        ja      .need_xchg
47
        ja      .need_xchg
44
        cmp     esi, ecx
48
        cmp     esi, ecx
45
        jae     .doner
49
        jae     .donerr
46
        push    esi
50
        push    esi
47
        mov     esi, [edx+esi*4]
51
        mov     esi, [edx+esi*4]
48
        mov     edi, [edx+eax*4-4]
52
        mov     edi, [edx+eax*4-4]
49
        call    ebx
53
        call    ebx
50
        pop     esi
54
        pop     esi
-
 
55
        jbe     .donerr
51
        jbe     .doner
56
 
52
.need_xchg:
57
    .need_xchg:
53
        cmp     esi, ecx
58
        cmp     esi, ecx
54
        jz      .do_xchg
59
        jz      .do_xchg
55
        push    esi
60
        push    esi
56
        mov     edi, [edx+esi*4-4]
61
        mov     edi, [edx+esi*4-4]
57
        mov     esi, [edx+esi*4]
62
        mov     esi, [edx+esi*4]
58
        call    ebx
63
        call    ebx
59
        pop     esi
64
        pop     esi
-
 
65
        sbb     esi, -1
60
        sbb     esi, -1
66
 
61
.do_xchg:
67
    .do_xchg:
62
        mov     edi, eax
68
        mov     edi, eax
63
        call    .exchange
69
        call    .exchange
64
        mov     eax, esi
70
        mov     eax, esi
-
 
71
        jmp     .restore
65
        jmp     .restore
72
 
66
.doner:
73
    .donerr:
-
 
74
        ret
-
 
75
 
-
 
76
; vim: ft=fasm tabstop=4