При использовании встроенного ассемблера вы можете писать код непосредственно в модулях Delphi в любой момент. Для этого служит директива asm. .and. Например, код из листинга 2.7 показывает, как можно сложить значения двух переменных, используя встроенный ассемблер.

Листинг 2.7. Сложение с использованием встроенного ассемблера

procedure TAssemblerForm.bSummClick(Sender: TObject): var
iRes. i. j: DWORD: begin
i .- 10: i :- 20:
asm
MOV EAX.i ADD EAX. j MOV iRes. EAX
end:
edResult.Text := IntToStr(iRes):
end:

Ключевое слово asm является началом блока, который заканчивается словом end. Между этими ключевыми словами можно писать код на языке ассемблер.

Вы должны учитывать, что комментарии во встроенном ассемблере надо писать в стиле Delphi. В самом языке ассемблер принято писать комментарии после точки с запятой, а во встроенном варианте это недопустимо и приведет к ошибкам:

asm

MOV EAX, i ; Ошибочный комментарий ADD EAX. j // Это комментарий MOV iRes. EAX

end:

В данном примере используются два оператора ассемблера:

• MOV X, Y - помещает значение Y в X. Это эквивалент присваивания в Delphi. В большинстве случаев в качестве X может выступать только регистр ЕАХ или его более короткие варианты (АХ или AL);

• ADDX, Y - складывает два значения, а результат помещается в регистр X.

Итак, сначала мы помещаем содержимое переменной i в регистр ЕАХ. Регистр - это как переменная внутри процессора. ЕАХ - регистр общего значения, который можно использовать по-разному. Вы должны знать, что результат большинства операций записывается именно в него.

После этого складываем значения регистра ЕАХ и переменной j. А почему сразу нельзя сложить два значения оператором ADD i, j? В ассемблере это запрещено. Во время сложения один из операндов должен быть регистром.

Теперь перемещаем результат из регистра ЕАХ в переменную iRes. Так как ключевое слово asm заменяет begin, благодаря этому можно писать целые процедуры и функции на ассемблере. Посмотрите, как можно написать функцию умножения двух чисел:

function MuKX. Y: Integer): Longint. asm

MOV ЕАХ. X IMUL Y

end:

В данном примере нет begin, потому что его заменяет ключевое слово. Функция должна перемножить два числа и возвратить результат. Сначала в регистр ЕАХ помещается содержимое переменной X. После этого выполняется команда IMUL, которая умножает указанное число (в данном случае переменную Y) на содержимое регистра ЕАХ. Результат вычисления заносится в регистр ЕАХ.

Это функция, а при выходе из нее в результате должно быть содержимое переменной Resul t, зарезервированной для данных целей В примере мы не задаем для этой переменной значения, так что же будет в результате? Ответ прост - содержимое регистра ЕАХ, где у нас как раз и находится результат умножения.

Теперь вы знаете, что функции в Delphi возвращают результат своей работы через регистр-аккумулятор ЕАХ.

ПРИМЕЧАНИЕ -

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге Sources\ch02\Assembler.

2.14. Оптимизация с помощью ассемблера || Оглавление || 2.14.2. Внешний ассемблер


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Январь
    2022
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс