CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник по функциям C/C++
__emit__
__emit__
Функция Вставляет значение литерала непосредственно в код. Синтаксис #include<dos.h> void __emit__(argument,...); Файл, содержащий dos.h прототип Описание Функция __emit__ позволяет вам вставить значение литерала непосредственно в объектный код, как если бы он был откомпилирован. Она используется для генерирования машинных инструкций без использования встроенных операторов ассемблера. Обычно аргументы __emit__ представляют из себя однобайтовые машинные команды. Однако возможности данной функции позволяют строить более сложные команды, вплоть до ссылок на переменные С. Предупреждение! Этой функцией могут воспользоваться только программисты, хорошо ориентирующиеся в машинном языке процессоров семейства 80х86. Вы можете использовать данную функцию для помещения произвольных байтов в машинный код функции. Если эти байты будут неправильными, то это может привести к неисправимой ошибке. Borland C++ не анализирует код, помещаемый таким образом. Если эти машинные команды изменяют значение регистров или переменных, то Borland 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<dos.h> int main() { /* вставить код, который генерирует печать экрана, через прерывание int 5 */ __emit__(0xcd,0x05); /* INT 05h */ return 0; }