Преобразование встроенного ассемблера GCC в встроенный ассемблер delphi - PullRequest
7 голосов
/ 24 февраля 2012

пожалуйста, у меня есть фрагмент кода встроенного ассемблера GCC

int   src = 0;
dword n;
__asm(
            "sar %%cl,%%edx"
            : "=d" (n) // saves in eax,edx
            : "c" (src), "d" (n) // the inputs
            );

и моя попытка delphi:

asm
mov ecx, &src
mov edx, &n
sar cl,edx
mov eax,edx
end;

пожалуйста, это правильно?

1 Ответ

10 голосов
/ 24 февраля 2012

Встроенный ассемблер не работает в 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...