Аналог функции С memcmp |
Previous Top Next |
Автор: Dennis Passmore
Я создал следующие две функции, существенно повышающие произвотельность в приложениях, активно работающих с данными. Вам нужно всего-лишь обеспечить контроль типов и границ допустимого диапазона, все остальное они сделают с любым типом данных лучше нас :-) .
Code: |
function Keys_are_Equal(var OldRec, NewRec; KeyLn : word): boolean; assembler; asm PUSH DS MOV AL,01 CLD LES DI,NewRec LDS SI,OldRec MOV CX,KeyLn CLI REPE CMPSB STI JZ @1 XOR AL,AL @1: POP DS end;
function First_Key_is_Less(var NewRec, OldRec; Keyln : word): boolean; assembler; asm PUSH DS MOV AL,01 CLD LES DI,NewRec LDS SI,OldRec MOV CX,KeyLn CLI REPE CMPSB STI JZ @5 JGE @6 @5: XOR AL,AL @6: POP DS end; |
©Drkb::00294
Взято с http://delphiworld.narod.ru
Примечание от Jin X
Примеры приведены для 16-битного Pascal'я и не могут использоваться в 32-битном Delphi! Зато можно делать так:
{ Возвращает -1 при X<Y, 0 при X=Y, 1 при X>Y. }
{ Сравнение идёт по DWord'ам, будто сравнивается массив чисел Integer или Cardinal, }
{ т.е. 01 02 03 04 05 06 07 08 > 01 02 03 04 05 06 08 07, }
{ т.к. 04030201 = 04030201, но 08070605 > 07080605 (hex). }
{ Однако, если Size and 3 <> 0, то последние Size mod 4 байт сравниваются побайтно! }
Code: |
function memcmp(const X, Y; Size: DWord): Integer; asm mov esi,X mov edi,Y mov ecx,Size mov dl,cl and dl,3 shr ecx,2 xor eax,eax rep cmpsd jb @@less ja @@great mov cl,dl rep cmpsb jz @@end ja @@great @@less: dec eax jmp @@end @@great: inc eax @@end: end; |
©Drkb::00295