- Код: Выделить всё
procedure Swap1(Len: ptrUInt; P1, P2: Pointer); nostackframe; inline;
assembler;
asm
DEC RCX
@L:
MOV AL,[RDX+RCX]
MOV BL,[R8+RCX]
MOV [RDX+RCX],BL
MOV [R8+RCX],AL
LOOP @L
end ['RCX', 'RDX', 'R8', 'AX'];
- Код: Выделить всё
procedure Swap2 (Len: ptrUInt; P1, P2: Pointer); inline;
var
j: byte;
i: ptrUInt;
begin
Dec(Len);
for i := Len downto 0 do
begin
j := byte(P1^);
byte(P1^) := byte(P2^);
byte(P2^) := j;
Inc(P1);
Inc(P2);
end;
end;
Результаты 5000000 прогонов на sizeof(shortstring) байт
1. 2218 мс
2. 907 мс
ИМХО по моему что-то не так с ассемблером в FPC...


