Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей
|
При вызове процедуры AddTwo следует указывать тип параметра явным
образом. Как мы знаем из главы 3, для указания адреса переменной необходимо
поместить перед ее идентификатором оператор "0" или функцию
Addr. В нашем случае используется оператор "0".
Рассмотрим теперь пример, в котором результат выполнения процедуры
возвращается в виде адреса переменной. В качестве прототипа будем использовать
все ту же процедуру AddTwo. Исходный текст процедуры приведен
в листинге 6.13.
Листинг 6.13. Процедура, возвращающая адрес переменной, содержащей сумму двух целых чисел .
function AddTwo(il, i2: PInteger): PInteger;
var
ires: Integer;
begin
asm
push ESI
mov EAX, DWORD PTR il
lea ESI, DWORD PTR ires
mov EAX, [EAX]
mov ECX, DWORD PTR i2
add EAX, [ECX]
mov DWORD PTR [ESI], EAX
mov •0Result, ESI
pop ESI
end;
end;
Передача параметров в эту процедуру выполняется так же, как и в предыдущем
примере. Процесс суммирования понятен, а вот каким образом результат
выполнения процедуры возвращается основной программе, имеет
смысл рассмотреть более подробно. Для того чтобы вернуть адрес целочисленной
переменной, вначале нужно ее объявить. В нашей процедуре такой
переменной является ires, объявленная в секции var.
Адрес этой переменной загружается в регистр E S I с помощью команды:
lea ESI, DWORD PTR ires
После всех вычислений помещаем результат сложения в ячейку памяти, соответствующую
переменной ires, и возвращаем адрес самой переменной в
основную программу. Эти действия выполняются следующими командами:
mov DWORD PTR [ESI], EAX
mov @Result, ESI
Этот пример очень важен, поэтому в листинге 6.14 приведен полный текст
программы.
Листинг 6.14. Программа, использующая для вычисления суммы чисел
процедуру с указателями
unit basmlpas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForml = class(TForm)
Buttonl: TButton;
Editl : TEdit;
Label1 : TLabel;
Edit2 : TEdit;
Edit3 : TEdit;
Label2 : TLabel;
Label3 : TLabel;
procedure ButtonlClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
push ESI
mov EAX, DWORD PTR il
lea * ESI, DWORD PTR ires
mov EAX, [EAX]
mov ECX, DWORD PTR i2
add EAX, [ECX]
mov DWORD PTR [ESI], EAX
mov @Result, ESI
pop ESI
end;
end;
procedure TForml.ButtonlClick(Sender: TObject);
begin
11 := StrToInt(Editl.Text) ;
12 := StrToInt(Edit2.Text);
Edit3.Text := IntToStr(AddTwo(@II, @12)л);
end;
end.
Как мы используем возвращаемое процедурой значение? Рассмотрим строку
обработчика нажатия кнопки:
Edit3.Text := IntToStr(AddTwo(@II, @12)Л);
Процедура AddTwo принимает в качестве параметров адреса переменных и
и 12. Возвращаемый процедурой результат, как мы знаем, является указателем на переменную ires, объявленную в теле процедуры
var
Forml:. TForml;
II, 12: Integer;
implementation
{$R *.dfm}
function AddTwo(il, i2: PInteger): PInteger;
var
ires: Integer;
begin
asm
Однако процедура
IntToStr в качестве параметра требует не адреса, а значения целочисленной
переменной. Поэтому необходимо выполнить операцию разыменования
(dereferencing) указателя переменной ires. Для выполнения этой операции
необходимо поместить символ ,,л" после идентификатора процедуры
AddTwo. В результате такой операции мы получаем значение переменной,
находящееся по заранее определенному адресу.
Рассмотренные примеры представляют собой простые программы и демонстрируют
технику применения BASM. Следующие примеры намного сложнее и
требуют знания дополнительных возможностей встроенного ассемблера.
Поскольку ассемблер прекрасно оптимизирует вычисления в массивах данных,
то целесообразно рассмотреть пример, в котором присутствуют операции
над такими данными. Пусть требуется найти сумму элементов массива
целых чисел и отобразить результат в поле редактирования. Зададим размерность
массива равной 7.
<< Назад В начало Далее >> |
|