Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
542 | diamond | 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 |