Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.15;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.04 c
2-1174909971
tar
2007-03-26 15:52
2007.04.15
Управление клавиатурой


1-1171994788
Andrey.Ru
2007-02-20 21:06
2007.04.15
Как получить первые 4 бита из байта...


5-1151662140
Shuric
2006-06-30 14:09
2007.04.15
ReadComponent


5-1151158278
PRT
2006-06-24 18:11
2007.04.15
DelhiX в Delphi 7


2-1173705002
Евгений Тарабановский
2007-03-12 16:10
2007.04.15
Как зарегистрировать новый тип файлов в Vista?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский