Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сравнение двух блоков памяти


Страницы:   1 2

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 (очередному) байту из каждого
> участка и сравниваю их.


А как иначе ?)

Сравнение на этом и построено)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо