Форум: "Основная";
Текущий архив: 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