"Kovalenko Dmitry" <[EMAIL PROTECTED]> wrote in message > 
> Слушай, я вот все не фтыкаю. Как вы работает на 75 страницах классика?
> Это же ахтунг натуральный.

Гм, там вообще-то файловый кэш ОС во всю работает. Никакаими граблями там и не 
пахнет ;-)

> сподвигул меня к OVERLAPPED-операциям, в расчет не берем - он вне
> конкуренции :)

Вот мне бы кто помог рассчитать задачку: какую мощность я могу передать на 
насос НШ-32 со шкива колневала при заданном количестве ручьёв ремня и усилии на 
натяжителе?!  Вот в чём вопрос, а у тя всё просто ;-) ;-) ;-) ;-) ;-) ;-)

> Пасибо!

Пивом тока запасись :-). Код там местами трудный.....а в дятле вообще 
нечитаемый ;-)

Айм рыдал, бился головй ап стену но продолжал жрать команды асма когда этот 
алгоритм отлаживал. Будешь делать компрессию - будет тоже самое, тока сначала 
на сях ;-);-);-)


BTN BTR_find_leaf (
    BTR  bucket,
    KEY  *key,
    UCHAR *value,
    UCHAR *return_value,
    int  descending,
    BOOLEAN retrieval)
{
/**************************************
 *
 * B T R _ f i n d _ l e a f
 *
 **************************************
 *
 * Functional description
 * Locate and return a pointer to the insertion point.
 * If the key doesn't belong in this bucket, return NULL.
 * A flag indicates the index is descending.
 *
 **************************************/
#if defined _M_IX86 && !defined IGNORE_NULL_IDX_KEY && defined MSC_OPTIMIZE1
UCHAR *p;
_asm
{
 cld
 mov ecx, bucket     
 lea ebx, [ecx]bucket.btr_nodes   ;node = bucket->btr_nodes, now EBX is node
 mov edx, key       ;now EDX is key 
 lea esi, [edx]KEY.key_data    ;p = key->key_data, now ESI is p
    cmp byte ptr [ecx]BTR.btr_level, 0 ;if (bucket->btr_level &&
 setnz al
    cmp byte ptr [ebx]BTN.btn_length, 0     ;!node->btn_length &&
 setz ah
 and al, ah
    cmp descending, 0                       ;descending
 setnz ah
 and al, ah
 jz L1
 movzx edi, [ebx]BTN.btn_length
    lea ebx, [ebx]BTN.btn_data
 add ebx, edi       ;node = (BTN) (node->btn_data + node->btn_length);
L1: movzx edx, word ptr[edx]KEY.key_length  ;key->key_length
 add edx, esi                            ;now EDX is key_end = p + 
key->key_length
 xor eax, eax       ;prefix = 0, now EAX is prefix
 cmp descending, 0
 jz M1
 ;while (1) if (descending)
    cmp retrieval, 0
 jz L2
L0: ;while (1) if (descending && retrieval)
 mov edi, value       ;if(value
 test edi, edi
 jz L3
    movzx ecx, [ebx]BTN.btn_length   ;&& (l=node->btn_length))
 test ecx, ecx
 jz L3
 mov p, esi        ;{ save p
    movzx esi, [ebx]BTN.btn_prefix
 add edi, esi       ;  r = value + node->btn_prefix
 lea esi, [ebx]BTN.btn_data              ;  q = node->btn_data
 rep movsb                               ;  do *r++ = *q++; while (--l), movsd 
optimization ???
 mov esi, p                              ;}
L3: cmp dword ptr[ebx+2], -1                ;if ((*(int*)node->btn_number) == 
-1) goto done;
 jz DN
    mov cl, [ebx]BTN.btn_prefix 
 cmp cl, al              ;if (node->btn_prefix < prefix) goto done;
 jb DN
    jnz L4         ;if (node->btn_prefix == prefix) 
    movzx ecx, [ebx]BTN.btn_length   ;node_end - q
 mov edi, edx       ;key_end
 sub edi, esi       ;key_end - p 
 cmp ecx, edi       ;node_end - q ? key_end - p
 jbe L6
    mov ecx, edi
L6: lea edi, [ebx]BTN.btn_data    ;q = node->btn_data, now EDI is q
 repe cmpsb   
 jbe DN         ;q == node_end || p == key_end || *p++ < *q++ 
    dec esi         ;*p > *q  
    mov edi, key
    mov eax, esi
 lea edi, [edi]KEY.key_data
 sub eax, edi               ;prefix = p - key->key_data
L4: cmp dword ptr[ebx+2], -2                ;if ((*(int*)node->btn_number) == 
-2)
 jz LN                              ;return NULL
 movzx edi, [ebx]BTN.btn_length
    lea ebx, [ebx]BTN.btn_data
 add ebx, edi       ;node = (BTN) (node->btn_data + node->btn_length);
    jmp L0
L2: ;while (1) if (descending && !retrieval)
 mov edi, value       ;if(value
 test edi, edi
 jz K3
    movzx ecx, [ebx]BTN.btn_length   ;&& (l=node->btn_length))
 test ecx, ecx
 jz K3
 mov p, esi        ;{ save p
    movzx esi, [ebx]BTN.btn_prefix
 add edi, esi       ;  r = value + node->btn_prefix
 lea esi, [ebx]BTN.btn_data              ;  q = node->btn_data
 rep movsb                               ;  do *r++ = *q++; while (--l), movsd 
optimization ???
 mov esi, p                              ;}
K3: cmp dword ptr[ebx+2], -1                ;if ((*(int*)node->btn_number) == 
-1) goto done;
 jz DN
    mov cl, [ebx]BTN.btn_prefix 
 cmp cl, al              ;if (node->btn_prefix < prefix) goto done;
 jb DN
    jnz K4
 movzx ecx, [ebx]BTN.btn_length
 test ecx, ecx             ;node->btn_length > 0 ;node_end - q 
 jz K9                           
 mov edi, edx       ;key_end
 sub edi, esi       ;key_end - p 
 cmp ecx, edi       ;node_end - q ? key_end - p
 jbe K8
    mov ecx, edi
 lea edi, [ebx]BTN.btn_data    ;q = node->btn_data, now EDI is q
 repe cmpsb
 jb DN         ;*p++ < *q++ 
 dec esi         ;*p > *q || p == key_end 
K9: mov edi, key
    mov eax, esi
 lea edi, [edi]KEY.key_data
 sub eax, edi               ;prefix = p - key->key_data
    jmp K4
K8: lea edi, [ebx]BTN.btn_data    ;q = node->btn_data, now EDI is q
 repe cmpsb
    jbe DN            ;*p++ < *q++ || q == node_end
    dec esi         ;*p > *q  
K5: mov edi, key
    mov eax, esi
 lea edi, [edi]KEY.key_data
 sub eax, edi               ;prefix = p - key->key_data
K4: cmp dword ptr[ebx+2], -2                ;if ((*(int*)node->btn_number) == 
-2)
 jz LN                              ;return NULL
 movzx edi, [ebx]BTN.btn_length
    lea ebx, [ebx]BTN.btn_data
 add ebx, edi       ;node = (BTN) (node->btn_data + node->btn_length);
    jmp L2
M1: ;while (1) if (!descending)
    mov edi, value       ;if(value
 test edi, edi
 jz M3
    movzx ecx, [ebx]BTN.btn_length   ;&& (l=node->btn_length))
 test ecx, ecx
 jz M3
 mov p, esi        ;{ save p
    movzx esi, [ebx]BTN.btn_prefix
 add edi, esi       ;  r = value + node->btn_prefix
 lea esi, [ebx]BTN.btn_data              ;  q = node->btn_data
 rep movsb                               ;  do *r++ = *q++; while (--l), movsd 
optimization ???
 mov esi, p                              ;}
M3: cmp dword ptr[ebx+2], -1                ;if ((*(int*)node->btn_number) == 
-1) goto done;
 jz DN
    mov cl, [ebx]BTN.btn_prefix 
 cmp cl, al              ;if (node->btn_prefix < prefix) goto done;
 jb DN
    jnz M4         ;if (node->btn_prefix == prefix) 
    movzx ecx, [ebx]BTN.btn_length   ;node_end - q
 test ecx, ecx
 jz M4                                   ;if(node->btn_length > 0)
 mov edi, edx       ;key_end
 sub edi, esi       ;key_end - p 
 cmp ecx, edi       ;node_end - q ? key_end - p
 jb M8
    mov ecx, edi
 lea edi, [ebx]BTN.btn_data    ;q = node->btn_data, now EDI is q
 repe cmpsb
 jbe DN         ;p == key_end || *p++ < *q++ 
 dec esi                        ;*p > *q  
M9: mov edi, key
    mov eax, esi
 lea edi, [edi]KEY.key_data
 sub eax, edi               ;prefix = p - key->key_data
    jmp M4
M8: lea edi, [ebx]BTN.btn_data    ;q = node->btn_data, now EDI is q
 repe cmpsb
    jb DN         ;*p++ < *q++
 jz M5
    dec esi         ;q == node_end || *p > *q  
M5: mov edi, key
    mov eax, esi
 lea edi, [edi]KEY.key_data
 sub eax, edi               ;prefix = p - key->key_data
M4: cmp dword ptr[ebx+2], -2                ;if ((*(int*)node->btn_number) == 
-2)
 jz LN                              ;return NULL
 movzx edi, [ebx]BTN.btn_length
    lea ebx, [ebx]BTN.btn_data
 add ebx, edi       ;node = (BTN) (node->btn_data + node->btn_length);
    jmp M1
LN: xor eax, eax       ;return NULL
 jmp LR
DN: mov ecx, return_value                   ;if (return_value)
    test ecx, ecx
    jz D1
 mov byte ptr [ecx], al                  ;*return_value = prefix
D1: mov eax, ebx                            ;return node 
LR: 
}



P.S. Интле сцуко.....где регистров мала тачка, не поможет даже жвачка...

Ответить