El ensamblador en línea no funciona de la misma manera en Delphi que en GCC. Para empezar, no tienen el mismo tipo de soporte de macros y la plantilla de Delphi, por lo que si desea utilizar una rutina de ensamblador fin de declarar una vez en general, hay que declararlo como una función:
function ShiftArithmeticRight(aShift: Byte; aValue: LongInt): LongInt;
{$IFDEF WIN64}
asm
sar edx,cl
mov eax,edx
end;
{$ELSE}
{$IFDEF CPU386}
asm
mov cl,al
sar edx,cl
mov eax,edx
end;
{$ELSE}
begin
if aValue < 0 then
Result := not (not aValue shr aShift)
else
Result := aValue shr aShift;
end;
{$ENDIF}
{$ENDIF}
En Delphi, el ensamblador en línea debe implementarse en el lugar donde se usa, y solo es compatible con 32 bits. En tales bloques de ASM, puede usar EAX, ECX, EDX libremente, más cualquier identificador en el código circundante. Por ejemplo:
var
lValue: LongInt;
lShift: Byte;
begin
// Enter pascal code here
asm
mov cl,lShift
sar lValue,cl
end;
// Enter pascal code here
end;
Mi consejo sería convertir este código en Pascal en lugar de ensamblador. –