Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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.


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru