![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сравнение двух блоков памяти
niko_ © (2007-03-23 16:26:00)Подскажите пожалуйста нет ли каких низкоуровневых (ну или каких других) функций для быстрого сравнение двух участков памяти.
Щас я делаю так: беру по 1 (очередному) байту из каждого участка и сравниваю их. Как то это мне не очень нравится.
niko_ (2007-03-27 15:03:00) [1]
> Fredy314 © (26.03.07 18:40) [21]
> movs по идее перемещает
Это человек (Сергей М.) шутит так.
На скока я знаю rep cmps не опримальна и тут лучше обойтись циклом (хотя может я и ошибаюсь).
Ну да ладно, этот вопрос уже в прошлом.
Fredy314 (2007-03-26 18:40:00) [2]movs по идее перемещает
а тебе cmps сравнение нуно.
DevilDevil (2007-03-26 15:34:00) [3]> Сергей М. © (23.03.07 16:55) [10]
> > niko_ (23.03.07 16:41) [6]> > надо понимать - шарю.rep
> movs - для "шарящих")
Гы :)
Evgeny V (2007-03-26 13:26:00) [4]
> niko_ (23.03.07 16:26)
Для С есть функция сравнения массиовов memcmp, на асм поcмотри CMPS, если память не подводит было такое, посмотри справочник по командам ассемблера
Rouse_ (2007-03-26 10:15:00) [5]
> Integer может содержать отрицательное значение.
:)) не подумал что-то об этом :)
Чапаев (2007-03-24 19:30:00) [6]> [16] Rouse_ © (24.03.07 13:10)
Integer может содержать отрицательное значение.
Rouse_ (2007-03-24 13:10:00) [7]
> jle может?
А смысл?
Чапаев (2007-03-23 22:24:00) [8]> jz @LengthMismatch
jle может?
Rouse_ (2007-03-23 17:14:00) [9]
> я как раз и имел ввиду какой нить вариант на Assembler'е
Вот тебе слегка модернизированный вариант кода Александра Шарахова.
Добавлена проверка размера...
function CompareMemEx(P1, P2: Pointer; Length: Integer): Boolean; assembler;
asm
test ecx, ecx
jz @LengthMismatch
add eax, ecx
add edx, ecx
xor ecx, -1
add eax, -8
add edx, -8
add ecx, 9
push ebx
jg @Dword
mov ebx, [eax+ecx]
cmp ebx, [edx+ecx]
jne @Ret0
lea ebx, [eax+ecx]
add ecx, 4
and ebx, 3
sub ecx, ebx
jg @Dword
@DwordLoop:
mov ebx, [eax+ecx]
cmp ebx, [edx+ecx]
jne @Ret0
mov ebx, [eax+ecx+4]
cmp ebx, [edx+ecx+4]
jne @Ret0
add ecx, 8
jg @Dword
mov ebx, [eax+ecx]
cmp ebx, [edx+ecx]
jne @Ret0
mov ebx, [eax+ecx+4]
cmp ebx, [edx+ecx+4]
jne @Ret0
add ecx, 8
jle @DwordLoop
@Dword:
cmp ecx, 4
jg @Word
mov ebx, [eax+ecx]
cmp ebx, [edx+ecx]
jne @Ret0
add ecx, 4
@Word:
cmp ecx, 6
jg @Byte
movzx ebx, word ptr [eax+ecx]
cmp bx, [edx+ecx]
jne @Ret0
add ecx, 2
@Byte:
cmp ecx, 7
jg @Ret1
movzx ebx, byte ptr [eax+7]
cmp bl, [edx+7]
jne @Ret0
@Ret1:
mov eax, 1
pop ebx
ret
@Ret0:
pop ebx
@LengthMismatch:
xor eax, eax
end;
niko_ (2007-03-23 16:59:00) [10]Сергей М. © (23.03.07 16:57) [11]
> Но чем тебе их дельфийские рапперы не угодили ?)
Я пишу на С++ в среде VS2005
niko_ (2007-03-23 16:57:00) [11]Eraser © (23.03.07 16:47) [8]
> [1] там как раз на ассемблере )
потому то я и сказал - перелапачу
> в BDS2006 эта ф-ция за авторством Aleksandr Sharahov'a, кстати посетителя данного форума
У меня 7-я делфя, а не 9-я, так что надеюсь Aleksandr Sharahov будет не против.
Сергей М. (2007-03-23 16:57:00) [12]
> niko_ (23.03.07 16:54) [9]
> Было предположение что такого рода функция есть в API.
Ну есть такие, предположим ..
Но чем тебе их дельфийские рапперы не угодили ?)
Сергей М. (2007-03-23 16:55:00) [13]
> niko_ (23.03.07 16:41) [6]
>
> надо понимать - шарю.
rep movs - для "шарящих")
niko_ (2007-03-23 16:54:00) [14]Сергей М. © (23.03.07 16:46) [7]
Да не что и не мешает.
Было предположение что такого рода функция есть в API.
Eraser (2007-03-23 16:47:00) [15]> [4] niko_ (23.03.07 16:37)
> не ну я как раз и имел ввиду какой нить вариант на Assembler'е
[1] там как раз на ассемблере ) в BDS2006 эта ф-ция за авторством Aleksandr Sharahov'a, кстати посетителя данного форума.
Сергей М. (2007-03-23 16:46:00) [16]
> niko_ (23.03.07 16:41) [6]
>
> надо понимать - шарю
И ?
Что мешает "сбацать сабж" самому, скромный "нервущийсявботаны" ты наш ?)
niko_ (2007-03-23 16:41:00) [17]надо понимать - шарю.
Но в "ботаны" не рвусь :)
Сергей М. (2007-03-23 16:39:00) [18]
> niko_ (23.03.07 16:37) [4]
> какой нить вариант на Assembler'е
А ты, надо понимать, "шаришь на Assembler'е" ?)
niko_ (2007-03-23 16:37:00) [19]Сергей М. © (23.03.07 16:35) [3]
не ну я как раз и имел ввиду какой нить вариант на Assembler'е или может что нить API'ишное (уже для этого дела сделаное).
Сергей М. (2007-03-23 16:35:00) [20]
> Щас я делаю так: беру по 1 (очередному) байту из каждого
> участка и сравниваю их.
А как иначе ?)
Сравнение на этом и построено)