"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. Интле сцуко.....где регистров мала тачка, не поможет даже жвачка...