Я написал функцию ассемблера в Delphi 7, но он преобразует свой код на что-то другое:Маркировка Delphi и странность?
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;
Почему это генерировать push ebx
и pop ebx
? И почему он делает mov eax, ebx
?
Кажется, что он генерирует частичный стек кадров из-за mov eax, ebx
.
Этот простой тест генерирует mov eax, edx
, но не генерирует этот кадр стека:
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
Кажется, что у него есть что-то делать с label err
. Если я удалю, я не получу часть mov eax, *
.
Почему это происходит?
Сообщить об ошибке Quality Central.
пожалуйста, сообщите об этом как об ошибке в http://qc.embarcadero.com/wc/qcmain.aspx –
@Jeroen уверен. . no prob ... – Egon
Вы задали несколько вопросов «почему», но ни один из них не ответил на ответ, который вы приняли. Похоже, вы просто хотели узнать, как перейти к новой инструкции в ассемблере Delphi, не учитывая, почему ваши собственные попытки не удались. Это точно? –