Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Генерация программных прерыванийДля этих целей в Турбо-Си имеется целый ряд функций. Функция генерации программного прерывания: int int86(int int_num, union REGS *inregs, union REGS *outregs);Функция выполняет прерывание с номером int_num, причем, перед выдачей команды INT содержимое полей объединения inregs копируется в регистры микропроцессора, а после возврата из прерывания - содержимое регистров - в поля объединения outregs. Функция обращения к DOS: int intdos(union REGS *inregs, union REGS *outregs);Вызов этой функции эквивалентен вызову функции int86 со значением параметра int_num = 0x21. В приведенных выше функциях для передачи параметров используются только регистры общего назначения. Если для передачи параметров требуется использовать также и сегментные регистры, то можно воспользоваться функциями: int int86x(int int_num, union REGS *inregs, union REGS *outregs, struct SREGS *segregs); int intdosx(union REGS *inregs, union REGS *outregs, struct SREGS *segregs);Здесь структура segregs, на которую указывает дополнительный параметр, служит для задания и входных, и выходных значений сегментных регистров. Наконец, наиболее полный набор регистров передается прерыванию функцией: void intr(int int_num, struct REGPACK *regs); Структура regs также содержит и входные, и выходные значения. Но использование этой функции нами, к сожалению, ограничено ошибкой, имеющейся в системе программирования Турбо-Си 2.0. Ошибка заключается в том, что значение регистра BP, передаваемое в составе структуры regs, функция не отрабатывает. Поэтому в наших примерах мы в случаях, когда необходимо передать регистр BP, пользуемся функцией geninterrupt: void geninterrupt(int int_num);geninterrupt представляет собой функцию, основное содержание которой составляет единственная команда Ассемблера INT int_num. Значения регистров можно передать прерыванию через псевдорегистры - _AX, _BX и т.д., из них же получить и результаты. Но применение этой функции требует большой осторожности: во-первых, при формировании входных регистров имеется риск в процессе формирования второго и последующих испортить содержимое регистров, сформированных ранее, во-вторых, при выполнении прерывания может быть изменено содержимое регистров - в первую очередь DS и ES, а также и BP, DI, SI (поэтому мы всегда, применяя geninterrupt, сохраняем их содержимое в статической памяти). Еще несколько подобных функций мы опускаем, так как они не используются в программах нашего пособия.
|