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

Вниз

CopyMemory-копирование памяти   Найти похожие ветки 

 
AllDer   (2004-01-16 01:01) [0]

понял,возник вопрос написать свою
CopyMemoryEx,но даже CopyMemory немогу написать
в Dll system искал - ненашел чтоб dizассемблить.
собственно CopyMemory(Dest,Source:pointer;Length:dword)
источник и приемник и длина.

парился с
procedure ImitationCopy(Start,Finish:poiter;Len:dword);
var
a:dword;
begin
for a:=0 to len do begin
asm
push start {Inkeme address pointer }
pop a
inc a // +1
push a
pop start

push finish
pop a
inc a // +1
push a
pop finish
end;
Finish:=Start; // присваиваем
{
Но здесь видать по адресу Finish содержимое не меняется,меняется лишь
указатель на ту ячейку и указатель затирается следующим for^ом}
{пробуем так -репа! var^им -> b:^byte;\ byt:byte;\ c:pointer;
c:=Start; // copy pointer
b:=c; // copy в типиз указатель
byt:=b^; // отбираем байт
Finish:=b;//его присваваем
end;
}
Где взять исходник CopyMemory() ?


 
VMcL   (2004-01-16 01:20) [1]

Посмотри System.Move.


 
AllDer   (2004-01-16 01:23) [2]

А что это System.Move?
есть API func MoveMemory


 
VMcL   (2004-01-16 01:36) [3]

А есть Delphi"s Move. F1.


 
VMcL   (2004-01-16 01:38) [4]

Насчет исходника CopyMemory: вставь в Delphi-прогу вызов CopyMemory и отладчиком. Но я бы брал всё-таки Move.


 
AllDer   (2004-01-16 01:42) [5]

procedure Move(const Source; var Dest; Count: Integer);
а она с pointer^ми работает?проверю

var

A: array[1..4] of Char;
B: Integer;
begin
Move(A, B, SizeOf(B)); { SizeOf = safety! }
end;


 
Andy BitOff   (2004-01-16 03:24) [6]

procedure TForm1.Button1Click(Sender: TObject);
var FromMem,ToMem:Pointer;
Size:Integer;
begin
asm
push edi
push esi
mov esi,[FromMem]
mov edi,[ToMem]
mov ecx,[Size]
repne movsb
pop esi
pop edi
end;
end;


 
AKul   (2004-01-16 13:23) [7]


> AllDer (16.01.04 01:01)
> for a:=0 to len do begin
> asm
> push start {Inkeme address pointer }
> pop a
> inc a // +1
> push a
> pop start
>
> push finish
> pop a
> inc a // +1
> push a
> pop finish
> end;
> Finish:=Start; // присваиваем


Не в обиду будет сказано, но что это за бред? Кто тебя на ассемблере учил программировать? Что это за алгоритм такой?
Если перевести это на Delphi, то выглядеть будет приблизительно так:
for a:=0 to len do begin
a:=Start+1; //Зачем здесь ипользовать переменную цикла?
Start:=a;
a:=Finish+1;
Finish:=a;

Finish:=Start;

Алгоритм на Delphi должен быть бризительно следующий:
procedure Copy(var Src,Dest;Count:integer);
Type ArrayType=Array [0..$7FFFFFFE] of byte;
var i:integer;
S,D:^ArrayType;
begin
S:=@Src;D:=@Dest;
for i:=0 to Count do
D^[i]:=S^[i];
end;


При вызове CopyMemory Delphi вызывает не API-функцию с таким именем, а свою, исходный код которой можно найти в Windows.pas:
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;


Что касается исходного кода API-функции CopyMemory, то он приблизительно такой, как написал Andy BitOff © (16.01.04 03:24) [6] (за исключением того, что следует обнулить флаг направления копирования данных (cld) и он оптимизирован - копируются не байты, а двойные слова).

Еще, CopyMemory (API) используется только не для перекрывающихся диапазонов! Для перекрывающихся диапазонов следует использовать MoveMemory.


 
mrcat   (2004-01-16 13:28) [8]

>Andy BitOff © (16.01.04 03:24) [6]
>repne movsb
на 32-х битных не оптимально, гораздо быстрее в купе с repne movsd


 
Тимохов   (2004-01-16 13:53) [9]

Хочу сказать, имхо:
Моve быстрее чем api функции. Проверял.


 
MBo   (2004-01-16 14:00) [10]

>[9]
http://dennishomepage.gugs-cats.dk/Libraries.htm
еще раза в полтора быстрее


 
Тимохов   (2004-01-16 14:10) [11]

Посмотрел.
Плохо то, что нет достаточных знаний асма - проверить не могу.


 
MBo   (2004-01-16 14:15) [12]

>Тимохов ©
этот модуль просто вставить в uses - при старте программы заменяется адрес стандартной Move на процессорозависимый вариант.
Код, конечно, монструозный ;)))


 
AllDer   (2004-01-17 00:50) [13]

procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;

а Move определено в system.pas
Разобраллся !!!Спасибо
Осталось присабачить,чтоб в чужих процессах
могло пахать.
Тема ЗАКРЫТА


 
Andy BitOff   (2004-01-17 01:52) [14]

/mrcat © (16.01.04 13:28) [8]

>Andy BitOff © (16.01.04 03:24) [6]
>repne movsb
на 32-х битных не оптимально, гораздо быстрее в купе с repne movsd/

Согласен. Но я ведь привел общий случай. А вопрошающему дорабатывать, я же не буду за него все писать.


 
VMcL   (2004-01-18 11:48) [15]

>>AKul © (16.01.04 13:23) [7]

В соответствии с соглашениями сбрасывать флаг направления (CLD) не нужно - он сброшен по умолчанию, и после выхода из любой функции/процедуры должен оставаться сброшенным.



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

Форум: "Основная";
Текущий архив: 2004.01.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.008 c
3-93404
BlackCat
2003-12-30 08:35
2004.01.29
Страное поведение MS Access....


1-93560
Urvin
2004-01-17 18:50
2004.01.29
Проблема с DLL


1-93524
Chlavik
2004-01-18 13:25
2004.01.29
ListView и Background (ListView_SetBkImage не работает)...


9-93323
Xandr
2003-07-14 08:03
2004.01.29
DelphiX MIDI


14-93632
Goida
2004-01-08 18:27
2004.01.29
Глюки





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский