Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
ВнизФункция Move из system.pas Найти похожие ветки
← →
hexone © (2004-03-09 15:46) [0]Подскажите, почему изменяется порядок копирования байт памяти в зависимости от адреса.
procedure Move( const Source; var Dest; count : Integer );
{$IFDEF PUREPASCAL}
var
S, D: PChar;
I: Integer;
begin
S := PChar(@Source);
D := PChar(@Dest);
if S = D then Exit;
if Cardinal(D) > Cardinal(S) then
for I := count-1 downto 0 do
D[I] := S[I]
else
for I := 0 to count-1 do
D[I] := S[I];
end;
← →
ZrenBy © (2004-03-09 15:49) [1]The source and destination blocks may overlap
← →
hexone © (2004-03-09 15:51) [2]!!!!! Ясно
← →
jack128 © (2004-03-09 15:52) [3]А что это за среда? Явно не делфи.. может FreePascal?
Вот код из пятерки
procedure Move( const Source; var Dest; count : Integer );
asm
{ ->EAX Pointer to source }
{ EDX Pointer to destination }
{ ECX Count }
PUSH ESI
PUSH EDI
MOV ESI,EAX
MOV EDI,EDX
MOV EAX,ECX
CMP EDI,ESI
JA @@down
JE @@exit
SAR ECX,2 { copy count DIV 4 dwords }
JS @@exit
REP MOVSD
MOV ECX,EAX
AND ECX,03H
REP MOVSB { copy count MOD 4 bytes }
JMP @@exit
@@down:
LEA ESI,[ESI+ECX-4] { point ESI to last dword of source }
LEA EDI,[EDI+ECX-4] { point EDI to last dword of dest }
SAR ECX,2 { copy count DIV 4 dwords }
JS @@exit
STD
REP MOVSD
MOV ECX,EAX
AND ECX,03H { copy count MOD 4 bytes }
ADD ESI,4-1 { point to last byte of rest }
ADD EDI,4-1
REP MOVSB
CLD
@@exit:
POP EDI
POP ESI
end;
← →
hexone © (2004-03-09 15:53) [4]Тоже самое, но на АСМЕ, Сначала копируется все, что можно по 4 байта, потом по байтам остаток.
← →
hexone © (2004-03-09 15:55) [5]Там два кода, один на паскале, другой на АСМЕ. Одинаковые
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.036 c