No więc assembler mnie opanował.
Tym razem postanowiłem stworzyć funkcję do kopiowania łańcuchów. Skończyło się na tym, że stworzyłem dwie. Testowałem na łańuchach ponad 7 MB, jednak tickCount zwracał zawsze zero, więc nie wiem co o tym mysleć. Pytanie do mądrzejszych: która funkcja będzie szybsza na dużych i małych łańcuchach(pisane w Delphi):
Numero uno:
function copy_str(str: string; startPos: integer; count: integer): string;
var
s: string;
begin
setLength(s, count);
asm
mov ESI, str {ustawiam sourceIndex}
add ESI, startPos {ustawiam pozycję, od której kopiować}
mov EDI, s {i dest index}
mov ECX, count {ustawiam ilość powtórzeń}
rep movsb {kopiuję bajt po bajcie}
end;
result:=s;
end;
Numero duo:
function copy_str(str: string; startPos: integer; count: integer): string;
var
s: string;
begin
setLength(s, count);
asm
mov ESI, str {ustawiam sourceIndex}
add ESI, startPos {ustawiam pozycję, od której kopiować}
mov EDI, s {gdzie kopiować}
mov ECX, count {ustawiam licznik - ilość pozostałych znaków}
@check:
cmp ECX, 4 {jeśli zostało więcej niż 3 znaki, kopiuj po 4 bajty}
jae @b4
cmp ECX, 2 {jeśli zostało więcej niż 1 znak, kopiuj po 2 bajty}
jae @b2
cmp ECX, 0 {jeśli już wszystko skopiowano, zakończ}
je @end
@b1: {kopiowanie ostatniego bajtu}
movsb
dec ECX;
jmp @end
@b2: {kopiowanie dwóch bajtów}
movsw
sub ECX, 2
jmp @check
@b4: {kopiowanie 4 bajtów}
movsd
sub ECX, 4
jmp @check
@end:
end;
result:=s;
end;