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 |