MoveMemory, 在Windows.pas单元中是这样的{$EXTERNALSYM CopyMemory}
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;
而move,在system中是这样的:
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;
我想这就是copymemory为什么一次只能移动一个值的原因。
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
Move(Source^, Destination^, Length);
end;
而move,在system中是这样的:
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;
我想这就是copymemory为什么一次只能移动一个值的原因。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货