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

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


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Изменим предыдущий пример так, чтобы в программе можно было использовать
встроенный ассемблер. Вариантов может быть несколько, поэтому
рассмотрим их по порядку.
Одним из решений может быть замена в обработчике нажатия кнопки
Buttonl оператора суммирования:
I R E S := II + 12
на ассемблерный блок команд:
asm
mov EAX, DWORD PTR II
add EAX, DWORD PTR 12
mov ' DWORD PTR I R E S , EAX
end;

В этом фрагменте кода целочисленные переменные и , 12 и I R E S определены
как двойные слова. В остальном текст ассемблерного блока несложен.
Сложение двух чисел выполняется в регистре ЕАХ С использованием команды
add, а результат помещается в переменную I R E S .
Обработчик нажатия кнопки с учетом этих изменений приведен в листинге 6.5.
Листинг 6.5. Суммирование двух целых чисел с использованием ассеблерного блока команд в обработчике нажатия кнопки
procedure TForml.ButtonlClick(Sender: TObject);
begin
asm
mov EAX, DWORD PTR II
Встроенный ассемблер языков высокого уровня: принципы использования 435
add ЕАХ, DWORD PTR 12
mov DWORD PTR IRES, EAX
end;
Edit3.Text := IntToStr(IRES);
end;
Обратите внимание, что оператор:
Edit3.Text := IntToStr(IRES);
корректно обрабатывает двойное слово IRES как переменную типа integer.

Операцию суммирования можно оформить и в виде процедуры. В "классическом"
варианте приложения исходный текст будет выглядеть так, как
представлено в листинге 6.6.
Листинг 6.6. Использование процедуры для вычисления суммы двух чисел
unit basmlpas;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForml = class(TForm)
Buttonl: TButton;
Editl : TEdit;
Labell : TLabel;
Edit2 : TEdit;
Edit3 : TEdit;
Label2 : TLabel;
Label3 : TLabel;
procedure ButtonlClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Forml: TForml ;
II, 12, IRES: Integer;
Implementation
{$R *.dfm}
procedure AddTwo;
begin
IRES := II + 12;
end;
procedure TForml.ButtonlClick(Sender: TObject);
begin
11 := StrToInt(Editl.Text);
12 := StrToInt(Edit2.Text);
AddTwo;
Edit3.Text := IntToStr(IRES);
end;
end.

В этом варианте программы операция суммирования выделена в отдельную
процедуру AddTwo. Процедура не имеет входных параметров и не возвращает
значение. Ее довольно легко модифицировать при помощи встроенного ассемблера
(листинг 6.7).
Листинг 6.7. Суммирование двухчисел в ассемблерном блоке процедуры
procedure AddTwo;
begin
asm
mov
mov
add
EAX, DWORD PTR II
EAX, DWORD PTR 12
DWORD PTR IRES, EAX
end;
end;

Встроенный ассемблер языков высокого уровня: принципы использования 437
Как видно из исходного текста, процедура, написанная на встроенном
ассемблере, использует переменные программы для вычислений и возврата
значения. В этом варианте не используется механизм передачи параметров
и не требуется отдельный оператор для возврата результата.
При всей простоте реализации таких процедур их применение лучше ограничить.
Если в программе присутствует несколько процедур, использующих
одни и те же переменные, то будет очень трудно отслеживать
изменения таких переменных. Обычно это приводит к ошибкам в работе
приложения.


 
 
 

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