Встроенный ассемблер не работает в Delphi так же, как в GCC. Для начала, у вас нет такой же поддержки макросов и шаблонов в Delphi, поэтому, если вы хотите использовать процедуру ассемблера общего назначения, которая объявляется один раз, вы должны объявить ее как функцию:
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}
В Delphi встроенный ассемблер должен быть реализован в том месте, где он используется, и он поддерживается только в 32-разрядной версии. В таких блоках asm вы можете свободно использовать EAX, ECX, EDX, а также любые идентификаторы в окружающем коде. Например:
var
lValue: LongInt;
lShift: Byte;
begin
// Enter pascal code here
asm
mov cl,lShift
sar lValue,cl
end;
// Enter pascal code here
end;