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

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


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





Рассмотрим еще один пример, в котором необходимо целиком передать строку из процедуры на ассемблере в основную программу. Для этого скопируем содержимое массива символов вызываемой процедуры в буфер памяти вызывающей программы. Разработаем приложение на Delphi. Процедура на ассемблере (назовем ее rets) представлена в листинге 3.43.
Листинг 3.43. Ассемблерная процедура, копирующая строку в основную программу
.386
.model flat
public rets
.data
TESTSTR DB "TEST STRING FROM ASM PROC !", 0
LENSTR EQU $-TESTSTR
. code
rets proc
push ESI
push EDI
push EBP
mov EBP, ESP
eld
mov ECX, LENSTR
mov ESI, offset TESTSTR
mov EDI, DWORD PTR [EBP+16]
rep movsb
pop EBP
pop EDI
pop E S I
ret 4
rets endp
end

В качестве параметра процедура получает адрес буфера вызывающей программы, куда нужно скопировать строку. Предполагается, что буфер вызывающей программы имеет достаточный размер для помещения всей строки. Для копирования строк будем использовать команду ассемблера movsb.
В регистр ЕСХ помещается размер строки в байтах. Регистр EST. содержит адрес строки-источника TESTSTR, а регистр EDI — адрес строки-получателя в основной программе. Копирование осуществляется командой rep movsb.

Компиляция ассемблерного модуля выполняется командой:
tasm32 /ml rets.asm rets.obj
Основная программа на Delphi должна выводить строку из буфера в рабочую область приложения. Сначала опишем переменные, которые использует программа:
Forml: TForml;
Rect: TRect;

Затем объявим внешнюю функцию rets В секции implementation:
implementation
{$R *.dfm}
{$L rets.obj}
procedure rets(si:PChar); stdcaii; external;

Обратите внимание на то, что процедура в качестве параметра принимает указатель на строку с завершающим нулем. В наших процедурах на ассемблере мы будем в основном использовать строки такого типа.
var
Разместим на нашей форме кнопку и напишем для нее обработчик нажатия (листинг 3.44).
Листинг 3.44. Обработчик нажатия кнопки в программе на Delphi
procedure TForml.ButtonlClick(Sender: TObject);
var
P I : array[ 0 . . 6 4 ] of Char;
begin
rets(PI) ;
Canvas.Font.Color := clYellow;
Canvas.TextOut(Rect.Left + 2 0 , Rect.Top + 4 0 , P I ) ;
end;


 
 
 

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