ich eine asm-Funktion in Delphi 7 geschrieben, aber es verwandelt sich der Code etwas anderes:Delphi Label und Asm Seltsamkeit?
function f(x: Cardinal): Cardinal; register;
label err;
asm
not eax
mov edx,eax
shr edx, 1
and eax, edx
bsf ecx, eax
jz err
mov eax, 1
shl eax, cl
mov edx, eax
add edx, edx
or eax, edx
ret
err:
xor eax, eax
end;
// compiled version
f:
push ebx // !!!
not eax
mov edx,eax
shr edx, 1
and eax, edx
bsf ecx, eax
jz +$0e
mov eax, 1
shl eax, cl
mov edx, eax
add edx, edx
or eax, edx
ret
err:
xor eax, eax
mov eax, ebx // !!!
pop ebx // !!!
ret
// the almost equivalent without asm
function f(x: Cardinal): Cardinal;
var
c: Cardinal;
begin
x := not x;
x := x and x shr 1;
if x <> 0 then
begin
c := bsf(x); // bitscanforward
x := 1 shl c;
Result := x or (x shl 1)
end
else
Result := 0;
end;
Warum es push ebx
und pop ebx
generiert? Und warum tut es mov eax, ebx
?
Es scheint, dass es den Teilstapelrahmen wegen der mov eax, ebx
erzeugt.
Dieser einfache Test erzeugt mov eax, edx
aber erzeugt nicht, dass der Stapelrahmen:
function asmtest(x: Cardinal): Cardinal; register;
label err;
asm
not eax
and eax, 1
jz err
ret
err:
xor eax, eax
end;
// compiled
asmtest:
not eax
and eax, $01
jz +$01
ret
xor eax, eax
mov eax, edx // !!!
ret
Es scheint, dass es etwas mit den label err
zu tun hat. Wenn ich das entferne, bekomme ich den mov eax, *
Teil nicht.
Warum passiert das?
Einen Fehlerbericht auf Quality Central gemacht.
Bitte melden Sie dies als einen Fehler bei http://qc.embarcadero.com/wc/qcmain.aspx –
@Jeroen sicher bekam. .. no prob ... – Egon
Sie haben hier einige "Warum" -Fragen gestellt, aber keine davon wurde mit Ihrer Antwort beantwortet. Es sieht so aus, als wolltest du wirklich nur wissen, wie man zu einer neuen Anweisung in Delphi Assembler springt, ohne Rücksicht darauf, warum deine eigenen Versuche gescheitert sind. Ist das genau? –