
- •Лекция 24
- •Необходимость сочетания языков высокого и низкого
- •Проблемы использования
- •Правила
- •Соглашения о вызове процедур
- •Соглашения о вызове процедур
- •Способы использования Ассемблерных вставок
- •Ассемблерные вставки
- •Ассемблерные вставки
- •Ассемблерные вставки
- •Пример 1
- •Реализация (вариант 1)
- •Реализация (вариант 2)
- •Реализация (вариант 3)
- •Цикл тестирования
- •Пример 2
- •Ассемблерные модули
- •Ассемблерные модули
- •Пример 3
- •Пример 3 – модуль на Ассемблере в Pelles C
- •Пример 3 – Основная программа в PellesC
- •Пример 3 – модуль на Ассемблере в Visual Studio
- •Настройка компилятора в Visual Studio 2010
- •Пример 4
- •Пример 5
- •;Вызываемая функция file2.asm

Лекция 24
Интерфейс с языками высокого уровня

Необходимость сочетания языков высокого и низкого
Необходимостьуровней сочетания языков высокого уровня с языком Ассемблер обусловлена, как правило, следующими причинами:
необходима реализация какого-либо специального алгоритма, который требует не тривиальной обработки данных и который трудно создать средствами языка высокого уровня;
необходимо обеспечить высокое быстродействие какого- либо алгоритма обработки данных или фрагмента программы.

Проблемы использования
Снижение переносимости программного обеспечения
Отсутствие единого стандарта на синтаксис языка Ассемблер
Зависимость от конкретной среды разработки
Visual Studio C++ – MASM
C++ Builder – TASM32
Pelles C – poasm.exe

Правила
Правила, которые необходимо соблюдать, при вызове Ассемблерных подпрограмм из программ на языках высокого уровня:
соглашение о присвоении имен;соглашение об используемой модели памяти;соглашение о вызове подпрограмм;
соглашение об именовании внешних идентификаторов;соглашение об именовании сегментов.

Соглашения о вызове процедур
Какие регистры должны сохраняться в вызываемых подпрограммах;
Метод передачи параметров в подпрограмму;
Порядок передачи параметров в подпрограмму;
Способ передачи аргументов: по значению или по ссылке;
Метод восстановления стека после вызова подпрограммы;
Способ передачи результата в вызывающую программу.

Соглашения о вызове процедур
Обозначени |
Передача параметров |
Восстановление |
Декорирование |
е |
|
стека |
|
__fastcall |
Первые два параметра |
Подпрограмма |
@funcname@numbytes |
|
через ECX и EDX, |
|
|
|
остальные справа |
|
|
|
налево |
|
|
__pascal |
Слева направо |
Подпрограмма |
Преобразование к |
|
|
|
заглавным |
__cdecl |
Справа налево |
Вызывающая |
_funcname |
|
|
программа |
|
__stdcall |
Справа налево |
Подпрограмма |
_funcname@numbytes |

Способы использования Ассемблерных вставок
Использование встроенного Ассемблера
Подключение Ассемблерного модуля

Ассемблерные вставки
Вариант 1 |
Вариант 2 |
__asm команда1 параметры |
__asm{ |
__asm команда2 параметры |
команда1 параметры |
… |
команда2 параметры |
__asm команда3 параметры |
… |
|
команда3 параметры |
|
} |

Ассемблерные вставки
Возможности:
использовать любой из регистров, предусмотренный в архитектуре IA-32;
обращаться к параметру функции по имени;
обращаться к меткам и переменным, которые были объявлены за пределами Ассемблерного блока;
использовать числовые константы, заданные или в стиле языка Ассемблер, или в стиле языка С;
использовать оператор ptr;использовать директивы EVEN и ALIGN.

Ассемблерные вставки
Ограничения:
Нельзя использовать директивы определения данных (DB, DW, …)
Нельзя использовать операторы Ассемблера (кроме PTR);
Нельзя использовать директивы STRUC, RECORD, WIDTH и MASK.
Нельзя использовать директивы препроцессора;
Нельзя обращаться к сегментами по имени (но можно через сегментные регистры)