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

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


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





Сейчас мы рассмотрим, как работает наш интерфейс, если использовать передачу параметров cdeci (листинг 3.16). Отличие этого метода передачи параметров от stdcaii в том, что вызывающая процедура должна сама восстанавливать стек. Параметры передаются справа налево, как и в stttcaii.
Листинг 3.16. Процедура на ассемблере с передачей параметров cdecl
.386
.model flat
public Addints
.data
.code
Addints proc
push EBP
mov EBP, ESP
mov EAX, DWORD PTR [EBP+8]
add EAX, DWORD PTR [EBP+12]
pop EBP
ret
Addints endp
end

Команда ret выхода из процедуры используется здесь без параметров. Посмотрим, как изменится наша основная программа на Delphi. Фрагмент кода, который претерпел изменения по сравнению с предыдущим примером: implementation
{$R *.dfm}
{$L ADDINTS.OBJ}
function Addints(XI: Integer; X2: Integer): Integer; cdecl; external;

В остальном исходный текст Delphi-приложения не изменился. Для корректной работы ассемблерного модуля в С + + мы опять должны внести изменения в имя процедуры (листинг 3.17). Для работы с директивой cdecl необходимо добавить символ подчеркивания в начало имени. Команда ret в процедуре вызывается без параметров.
Листинг 3.17. Ассемблерная процедура с передачей параметров cdecl для использования в С++
.386
.model flat
public _AddInts
.data
. code
Addints proc
push EBP
mov EBP, ESP
mov
add EAX,
EAX, DWORD PTR [EBP+8]
DWORD PTR [EBP+12]
pop EBP
ret
_AddInts endp
end

Что касается исходного текста программы на Visual С + + , то здесь, как и в Delphi-приложении, изменения минимальны и касаются лишь раздела деклараций, где мы должны поменять директиву stdcaii на cdecl:
extern " С " int _cdecl Addints(int il, int i2);

И, наконец, рассмотрим довольно широко применяемый регистровый метод передачи параметров в вызываемую функцию, представленный директивой register (fastcaii в С + + ) . Аргументы передаются через регистры ЕАХ, EDX и ЕСХ слева направо. Если имеется больше 3-х аргументов, то, начиная с 4- го, остальные передаются через стек. Посмотрим, как изменится наша процедура Addints при использовании такого метода передачи аргументов (листинг 3.18).
Листинг 3.18. Ассемблерная процедура с передачей параметров register
. 3 8 6
.model flat
public Addints
.data
. code
Addints proc
sub EAX, EDX
ret
Addints endp
end

Как видим, исходный текст процедуры упростился по сравнению с другими вариантами. Этот метод действительно ускоряет работу процедур, т. к. не требуется инициализация стека и его восстановление, как при других методах передачи параметров. Однако злоупотреблять им не стоит, потому что интенсивное использование регистров процессора в процедурах будет препятствовать оптимизации программы компилятором. Как известно, для оптимизации программ многие компиляторы языков высокого уровня используют регистры процессора.

Для работы Delphi-приложения с процедурой Addlnts необходимо в определении внешней функции указать параметр register:
implementation
{$R *.dfm}
{$L ADDINTS.OBJ}
function Addlnts(Xl: Integer; X2: Integer): Integer; register; external;
В Microsoft Visual С + + аналогом соглашения register является fastcaii.

Первые два параметра передаются через регистры ЕСХ И EDX, остальные аргументы передаются справа налево через стек. Например, исходный текст программы на ассемблере, выполняющей операцию и + 12 - 13 - 1 4 , где il, 1 2 , 13 и 14 — целые числа, представлен в листинге 3.19.

Листинг 3.19. Ассемблерная процедура с передачей параметров fastcaii для использования в С++
.386
.model flat
public @AddIntsR@16
.data
. code
@AddIntsR@16 proc
push EBP
mov EBP, ESP
add ECX, EDX
mov EAX, ECX
sub EAX, DWORD PTR [EBP+12
sub EAX, DWORD PTR [EBP+8]
pop EBP
ret 8
@AddIntsR@16 endp
end


 
 
 

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