Описание функций Си

       

__Emit__



     __emit__

Функция Вставляет значение литерала непосредственно в код.

Синтаксис #include

void __emit__(argument,...);

Файл, содержащий dos.h прототип

Описание Функция __emit__ позволяет вам вставить значение литерала непосредственно в объектный код, как если бы он был откомпилирован. Она используется для ге- нерирования машинных инструкций без использования встроенных операторов ассемблера.

Обычно аргументы __emit__ вызывают однобайтовые машинные команды. Однако возможности данной функ- ции позволяют строить более сложные команды, вплоть до ссылок на переменные Си.

Предупреждение! Этой функцией могут воспользовать- ся только программисты, хорошо ориентирующиеся в машинном языке процессоров семейства 80х86. Вы мо- жете использовать данную функцию для помещения произвольных байтов в машинный код функции. Если эти байты будут неправильными, то это может при- вести к неисправимой ошибке. Turbo C++ не анализи- рует код, помещаемый таким образом. Если эти ма- шинные команды изменяют значение регистров или пе- ременных, то Turbo C++ не знает об этом и не сох- раняет их перед использованием данного кода, как он делает это при работе со встроенным ассембле- ром, где он, например, распознает использование регистров SI и DI и сохраняет их. Здесь же вы пре- доставлены сами себе.

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

Имеется специальное ограничение формы аргументов __emit__. Они должны иметь форму константных выра- женй, т.е. чтобы их можно было использовать для инициализации статических объектов. Это означает, что в выражениях можно использовать целые констан- ты, константы с плавающей точкой и адреса стати- ческих объектов. Значение записывается в точке вы- зова функции также, как если они используются для инициализации данных. Можно также использовать ад- реса параметров и автоматических переменных, плюс или минус константное смещение. Для этих аргумен- тов запоминается смещение переменной в BP.


Количество байт, помещаемых в объектный код, опре- деляется типом аргумента, за исключением следующих случаев:

- знаковая целая константа (например 0х90) значе- ние которой лежит в диапазоне от 0 до 255 рассмат- ривается как символ.

- Когда используется адрес автоматической перемен- ной или параметра, то если смещение переменной в BP лежит в диапазоне от -128 до 127 то записывает- ся байт, иначе слово.

Просто байты записываются следующим образом:

__emit__(0x90);

Если вы хотите записать слово, однако его значение меньше 255, то просто преобразуйте его в unsigned:

__emit__(0xB8,(unsigned)17);

или

__emit__(0xB8, 17u);

Двух- или четырехбайтовые адреса можно прямо ука- зать с помощью типов: void near * и void far *, соответственно.

Возвращаемое Нет. значение

Переносимость __emit__ уникальна для семейства машин 80х86.

Пример:

#include

int main() { /* вставить код, который генерирует печать экрана, через прерывание int 5 */ __emit__(0xcd,0x05); /* INT 05h */ return 0; }


Содержание раздела