Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Использования прерываний в ассеемблер-программахСтр 1 из 12Следующая ⇒ Система прерываний любого компьютера является его важнейшей частью, позволяющей быстро реагировать на события, обработка которых должна выполнятся немедленно: сигналы от машинных таймеров, нажатия клавиш клавиатуры или мыши, сбои памяти и пр. Рассмотрим в общих чертах компоненты этой системы. Рис. 1.11. Аппаратная организация прерываний. Два контроллера используются для увеличения допустимого количества внешних устройств. Дело в том, что каждый контроллер прерываний может обслуживать сигналы лишь от 8 устройств. Для обслуживания большего количества устройств контроллеры можно объединять, образуя из них веерообразную структуру. В современных машинах устанавливают два контроллера, увеличивая тем самым возможное число входных устройств до 15 (7 у ведущего и 8 у ведомого контроллеров). Рис. 1.12. Процедура обслуживания прерывания. Самое начало оперативной памяти от адреса 0000h до 03FFh отводится под векторы прерываний - четырехбайтовые области, в которых хранятся адреса обработчиков прерываний (ОбрПр на рис. 1.12). В два старшие байта каждого вектора записывается сегментный адрес обработчика, в два младшие - смещение (относительный адрес) точки входа в обработчик. Векторы, как и соответствующие им прерывания, имеют номера, причем вектор с номером 0 располагается, начиная с адреса 0, вектор 1 - с адреса 4, вектор 2 - с адреса 8 и т.д. Вектор с номером п занимает, таким образом, байты памяти от n*4 до n*4+3. Всего в выделенной под векторы области памяти помещается 256 векторов. int 13h то процессор выполняет ту же процедуру прерывания, используя в качестве номера вектора операнд команды int. Программные прерывания применяются в первую очередь для вызова системных обслуживающих программ - функций DOS и BIOS. С командой int 2In вызова DOS мы уже сталкивались в примере 1-1 и будем встречаться еще многократно. В дальнейшем будут также приведены примеры использования команды int для вызова прикладных обработчиков программных прерываний. 00h -внутреннее прерывание, деление на 0; Как видно из таблицы, векторы прерываний можно условно разбить 5)Команды передачи управления: безусловные переходы. Адресация в переходах Безусловный переход — это переход, который выполняется всегда. Безусловный переход осуществляется с помощью команды JMP. У этой команды один операнд, который может быть непосредственным адресом (меткой), регистром или ячейкой памяти, содержащей адрес. Примеры безусловных переходов: jmp metka;Переход на метку jmp bx;Переход по адресу в BX jmp word[bx];Переход по адресу, содержащемуся в памяти по адресу в BX
Безусловные переходы осуществляются с помощью команды jmp, которая может использоваться в 5 разновидностях. Переход может быть: прямым коротким (в пределах -128... + 127 байтов); прямым ближним (в пределах текущего сегмента команд): прямым дальним (в другой сегмент команд); косвенным ближним (в пределах текущего сегмента команд через ячейку с адресом перехода); косвенным дальним (в другой сегмент команд через ячейку с адресом перехода). Прямой короткий (short) переход. Прямым называется переход, в команде которого в явной форме указывается метка, на которую нужно перейти. Прямой ближний (near), или внутрисегментный переход. Этот переход отличается от предыдущего только тем, что под смещение к точке перехода отводится целое слово. Это дает возможность осуществить переход в любую точку 64-кбайтного сегмента. Прямой дальний (far), или межсегментный переход. Этот переход позволяет передать управление в любую точку любого сегмента. Косвенный ближний (внутрисегментный) переход. В отличие от команд прямых переходов, команды косвенных переходов могут использовать различные способы адресации и, соответственно, иметь много разных вариантов. Косвенный дальний (межсегментный) переход. Как и в случае ближнего перехода, переход осуществляется по адресу, который содержится в ячейке памяти, однако эта ячейка имеет размер 2 слова, и в ней содержится полный (сегмент плюс смещение) адрес точки перехода.
6) Команды передачи управления: организация циклов Циклом называется повторяющееся выполнение последовательности команд. Синтаксис объявления меток Метка представляет собой символическое имя, вместо которого компилятор подставляет адрес. В программе на ассемблере можно присвоить имя любому адресу в коде или данных. Обычно метки используются для организации переходов, циклов или каких-то манипуляций с данными. По сути имена переменных, объявленных с помощью директив объявления данных, тоже являются метками. Но с ними компилятор дополнительно связывает размер переменной. Метка объявляется очень просто: достаточно в начале строки написать имя и поставить двоеточие Команда LOOP Для организации цикла предназначена команда LOOP. У этой команды один операнд — имя метки, на которую осуществляется переход. В качестве счётчика цикла используется регистр CX. Команда LOOP выполняет декремент CX, а затем проверяет его значение. Если содержимое CX не равно нулю, то осуществляется переход на метку, иначе управление переходит к следующей после LOOP команде. Содержимое CX интерпретируется командой как число без знака. В CX нужно помещать число, равное требуемому количеству повторений цикла. Понятно, что максимально может быть 65535 повторений. Ещё одно ограничение связано с дальность перехода. Метка должна находиться в диапазоне -127…+128 байт от команды LOOP Пример цикла use16;Генерировать 16-битный код org 100h;Программа начинается с адреса 100h mov ah,02h;Для вызова функции DOS 02h - вывод символа mov dl,'A';Первый выводимый символ mov cx,26;Счётчик повторений цикла metka: int 21h;Обращение к функции DOS inc dl;Следующий символ loop metka;Команда цикла mov ah,09h;Функция DOS 09h - вывод строки mov dx,press;В DX адрес строки int 21h;Обращение к функции DOS mov ah,08h;Функция DOS 08h - ввод символа без эха int 21h;Обращение к функции DOS mov ax,4C00h;\ int 21h;/ Завершение программы ;------------------------------------------------------- press: db 13,10,'Press any key...$'
7) Команды передачи управления: условные переходы Условные переходы Условный переход осуществляется, если выполняется определённое условие, заданное флагами процессора (кроме одной команды, которая проверяет CX на равенство нулю). Как вы помните, состояние флагов изменяется после выполнения арифметических, логических и некоторых других команд. Если условие не выполняется, то управление переходит к следующей команде. Существует много команд для различных условных переходов. Также для некоторых команд есть синонимы JB/JNAE Перейти, если меньше / перейти, если CF = 1 не больше или равно JAE/JNB Перейти, если больше или равно / пе- CF = 0 рейти, если не меньше JBE/JNA Перейти, если меньше или равно / пе- CF = 1 или ZF = 1 рейти, если не больше JA/JNBE Перейти, если больше / перейти, если CF = 0 и ZF = 0 не меньше или равно JE/JZ Перейти, если равно ZF = 1 JNE/JNZ Перейти, если не равно ZF = 0 JL/JNGE Перейти, если меньше чем / перейти, SF = OF если не больше чем или равно JGE/JNL Перейти, если больше чем или равно / SF = OF перейти, если не меньше чем JLE/JNLE Перейти, если меньше чем или равно / ZF = 1 или SF = OF перейти, если не больше, чем JG/JNLE Перейти, если больше чем / перейти, ZF = 0 или SF = OF если не меньше чем или равно JP/JPE Перейти по четности PF = 1 JNP/JPO Перейти по нечетности PF = 0 JS Перейти по знаку SF = 1 JNS Перейти, если знак не установлен SF = 0 JC Перейти при наличии переноса CF = 1 JNC Перейти при отсутствии переноса CF = 0 JO Перейти по переполнению OF = 1 JNO Перейти при отсутствии переполнения OF = 0
|