Функция Вставляет значение литерала непосредственно в код.
Синтаксис #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;
}