Habs mir jetzt mal näher angeschaut..
folgender Delphi-Code (das begin-end der for-Schleife ist unnötig, aber ganz bewusst gesetzt):
Delphi-Quellcode:
var
i: Integer;
begin
for i := 1 to 20 do
begin
Inc(PInteger(@i)^);
end;
end;
wird in folgenden
ASM-Code übersetzt:
Code:
Unit1.pas.30: for i := 1 to 20 do
mov [eax], $00000001
Unit1.pas.32: Inc(PInteger(@i)^);
inc dword ptr [eax]
Unit1.pas.33: end; // <- das end der Schleife
inc dword ptr [eax]
Unit1.pas.30: for i := 1 to 20 do
cmp dword ptr [eax], $15
jnz -$09
In Zeile 32 wird die Zählvariable manuell erhöht, während in Zeile 33 (daher der unnötige begin-end Block) die "echte" Inkrementierung der Schleifenvariable stattfindet - beide Zeilen erzeugen denselben
ASM-Code.
eax enthält eine Referenz in den Stack wo die eigentliche Zählvariable liegt.