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