3.1. Использование ассемблера в исходных кодах

На верх  Назад  Вперёд

Существует два способа вставить код ассемблера в исходный текст Pascal. Первый способ простой – использование блока asm:

Var
  I : Integer;
begin
  I:=3;
  asm
    movl I, %eax
  end;
end;

Всё, что находится между asm и end – это блок, который вставляется как ассемблер в генерируемый код. В зависимости от режима ассемблера, компилятор выполняет замену имён их адресами.

Второй способ – это использование функции или процедуры на языке ассемблера. Это делается путём добавления модификатора assembler в заголовок функции или процедуры:

function geteipasebx : pointer; assembler;
asm
  movl (%esp),%ebx ret
end;

Также можно объявлять переменные в ассемблерной процедуре:

procedure Move(const source; var dest; count:SizeInt);assembler;
var
  saveesi,saveedi : longint;
asm
  movl %edi,saveedi
end;

Компилятор резервирует место в стеке для этих переменных, для чего он вставляет некоторые команды.

Учтите, что ассемблерное имя ассемблерной функции будет «искалечено» компилятором, то есть метка для этой функции будет иметь не такое имя, как указано при объявлении функции. Чтобы изменить это, нужно использовать модификатор Alias:

function geteipasebx : pointer; assembler; [alias:'FPC_GETEIPINEBX'];
asm
  movl (%esp),%ebx ret
end;

Чтобы сделать функцию доступной в ассемблерном коде вне текущего модуля, нужно добавить модификатор Public:

function geteipasebx : pointer;assembler; [public, alias:'FPC_GETEIPINEBX'];
asm
  movl (%esp),%ebx ret
end;