Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

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

 
niko_   (2007-03-23 16:26) [0]

Подскажите пожалуйста нет ли каких низкоуровневых (ну или каких других) функций для быстрого сравнение двух участков памяти.
Щас я делаю так: беру по 1 (очередному) байту из каждого участка и сравниваю их. Как то это мне не очень нравится.


 
Eraser ©   (2007-03-23 16:28) [1]

> [0] niko_   (23.03.07 16:26)

CompareMem


 
niko_   (2007-03-23 16:35) [2]

Штож, это здорово.
Ну а API"шного не чего нет?

Просто мне это в С++ надо, а так тогда этот код перелапачу.


 
Сергей М. ©   (2007-03-23 16:35) [3]


> Щас я делаю так: беру по 1 (очередному) байту из каждого
> участка и сравниваю их.


А как иначе ?)

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


 
niko_   (2007-03-23 16:37) [4]

Сергей М. ©   (23.03.07 16:35) [3]

не ну я как раз и имел ввиду какой нить вариант на Assembler"е или может что нить API"ишное (уже для этого дела сделаное).


 
Сергей М. ©   (2007-03-23 16:39) [5]


> niko_   (23.03.07 16:37) [4]


> какой нить вариант на Assembler"е


А ты, надо понимать, "шаришь на Assembler"е" ?)


 
niko_   (2007-03-23 16:41) [6]

надо понимать - шарю.

Но в "ботаны" не рвусь :)


 
Сергей М. ©   (2007-03-23 16:46) [7]


> niko_   (23.03.07 16:41) [6]
>
> надо понимать - шарю


И ?
Что мешает "сбацать сабж" самому, скромный "нервущийсявботаны" ты наш ?)


 
Eraser ©   (2007-03-23 16:47) [8]

> [4] niko_   (23.03.07 16:37)


> не ну я как раз и имел ввиду какой нить вариант на Assembler"е

[1] там как раз на ассемблере ) в BDS2006 эта ф-ция за авторством Aleksandr Sharahov"a, кстати посетителя данного форума.


 
niko_   (2007-03-23 16:54) [9]

Сергей М. ©   (23.03.07 16:46) [7]

Да не что и не мешает.

Было предположение что такого рода функция есть в API.


 
Сергей М. ©   (2007-03-23 16:55) [10]


> niko_   (23.03.07 16:41) [6]
>
> надо понимать - шарю.


rep movs - для "шарящих")


 
Сергей М. ©   (2007-03-23 16:57) [11]


> niko_   (23.03.07 16:54) [9]



> Было предположение что такого рода функция есть в API.


Ну есть такие, предположим ..

Но чем тебе их дельфийские рапперы не угодили ?)


 
niko_   (2007-03-23 16:57) [12]

Eraser ©   (23.03.07 16:47) [8]
> [1] там как раз на ассемблере )

потому то я и сказал - перелапачу

> в BDS2006 эта ф-ция за авторством Aleksandr Sharahov"a, кстати посетителя данного форума

У меня 7-я делфя, а не 9-я, так что надеюсь Aleksandr Sharahov будет не против.


 
niko_   (2007-03-23 16:59) [13]

Сергей М. ©   (23.03.07 16:57) [11]
> Но чем тебе их дельфийские рапперы не угодили ?)

Я пишу на С++ в среде VS2005


 
Rouse_ ©   (2007-03-23 17:14) [14]


> я как раз и имел ввиду какой нить вариант на 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;


 
Чапаев ©   (2007-03-23 22:24) [15]

> jz    @LengthMismatch
jle может?


 
Rouse_ ©   (2007-03-24 13:10) [16]


> jle может?

А смысл?


 
Чапаев ©   (2007-03-24 19:30) [17]

> [16] Rouse_ ©   (24.03.07 13:10)
Integer может содержать отрицательное значение.


 
Rouse_ ©   (2007-03-26 10:15) [18]


> Integer может содержать отрицательное значение.

:)) не подумал что-то об этом :)


 
Evgeny V ©   (2007-03-26 13:26) [19]


> niko_   (23.03.07 16:26)

Для С есть функция сравнения массиовов memcmp, на асм поcмотри CMPS, если память не подводит было такое, посмотри справочник по командам ассемблера


 
DevilDevil ©   (2007-03-26 15:34) [20]

> Сергей М. ©   (23.03.07 16:55) [10]
> > niko_   (23.03.07 16:41) [6]> > надо понимать - шарю.rep
> movs - для "шарящих")


Гы :)


 
Fredy314 ©   (2007-03-26 18:40) [21]

movs по идее перемещает
а тебе cmps сравнение нуно.


 
niko_ ©   (2007-03-27 15:03) [22]


> Fredy314 ©   (26.03.07 18:40) [21]
> movs по идее перемещает

Это человек (Сергей М.) шутит так.
На скока я знаю rep cmps не опримальна и тут лучше обойтись циклом (хотя может я и ошибаюсь).
Ну да ладно, этот вопрос уже в прошлом.



Страницы: 1 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.049 c
15-1174437630
Riply
2007-03-21 03:40
2007.04.15
Неправильный Hint :)


1-1171620919
Kolan
2007-02-16 13:15
2007.04.15
Программа + пакет = AV при инициализации. Наоборот все Ок...


15-1174554995
Andy BitOff
2007-03-22 12:16
2007.04.15
А кто что может сказать про Debian?


3-1169558058
tytus
2007-01-23 16:14
2007.04.15
Подключение к Oracle 10g в библиотеке


8-1148486568
anton773
2006-05-24 20:02
2007.04.15
Подскажите алгоритм