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

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.012 c
14-93657
Ivolg
2004-01-09 11:57
2004.01.29
Ешник


1-93538
Godness
2004-01-15 20:38
2004.01.29
ХР стиль


3-93403
Desdechado
2003-12-25 17:42
2004.01.29
странный пользователь, подключенный к БД


1-93449
den74
2004-01-19 11:05
2004.01.29
Печать DBChart


3-93348
raptorus
2004-01-04 10:10
2004.01.29
Здравствуйте, Мастера. Подскажите как перерисовывавать ячейки