Команды условной передачи управления для прочих проверок
l JE/JZ (Jump if Equal/Zero) — переход, если равно/нуль (ZF = 1).
l JNE/JNZ (Jump if Not Equal/Not Zero) — переход, если не равно/не нуль (ZF = 0).
l JS (Jump if Sign) — переход, если есть знак (отрицательно) (SF = 1).
l JNS (Jump if Not Sign) — переход, если нет знака (положительно) (SF = 0).
l JC (Jump if Carry)—переход, если есть перенос (аналог JB) (CF = 1).
l JNC(Jump if Not Carry) — переход, если нет переноса (аналог JNB) (CF = 0).
l JO (Jump if Overflow) — переход, если есть переполнение (OF = 1).
l JNO (Jump if Not Overflow) — переход, если нет переполнения (OF = 0).
l JP/JPE (Jump if Parity/Parity Even) — переход, если есть четность (PF = 1).
l JNP/JPO (Jump if No Parity/Parity Odd) — переход, если нет четности (PF = 0).
l JCXZ (Jump if CX is Zero) — переход, если содержимое регистра CX равно 0 (CX = 0).
Команды управления циклами
Используются для повторения цикла известное число раз. Количество повторений предварительно записывается в регистр CX (счетчик циклов). Каждый цикл автоматически уменьшает показание CX на 1.
Основная команда: LOOP метка.
Циклы повторяются до обнуления CX. Команда уменьшает значение в регистре CX на единицу и передает управление по прямому адресу — метке, если значение в регистре CX не равно нулю; в противном случае выполняется следующая по порядку команда. Флаги не меняет. Существуют еще 4 альтернативные команды, в которых можно поставить дополнительные условия. Передачи управления командами типа LOOP только ближние и короткие (метки near и short).
Команды прерывания
У команд прерывания есть некоторая аналогия с командами вызова процедуры CALL: прекращается выполнение текущей программы и осуществляется переход к подпрограмме обработки прерывания; но при прерываниях нет деления на процедуры near или far, так как начальный адрес подпрограммы обработки прерывания (вектор прерывания) берется из таблицы векторов ОЗУ и он всегда 32-битовый; кроме того, при вызове процедуры в стеке сохраняется только адрес возврата, а при прерывании еще и флаги.
Имеются три команды прерывания.
l INT opr
Прервать ( INTerrupt) выполнение программы и передать управление по одному из 256 адресов (векторов прерывания), определяемых номером прерывания — opr. По этой команде микропроцессор:
l помещает в стек содержимое регистров: FL (флагов), CS (сегмента команд), IP (указателя команд);
l обнуляет флаги TF и IF (флаги системного прерывания и блокировки прерывания);
l загружает в CS и IP, соответственно, второе и первое слова вектора прерываний, считанного из таблицы векторов в ОЗУ по адресу 4×opr (4×номер прерывания); вся таблица векторов занимает 1024 байта, то есть всего может быть 256 различных векторов прерывания. Например, команда INT 1Ah считает из ОЗУ вектор, находящийся по адресу 68h = 4·1Ah, то есть в регистр CS будет загружен адрес сегмента из слова по адресу 6Ah, а в регистр IP — из слова по адресу 68h смещение программы обработки этого прерывания.
Команда сбрасывает флаги IF = 0 и TF = 0.
l INTO
Прервать по переполнению (INTerrupt if Overflow),.при возникновении переполнения флаг OF = 1 и управление передается по адресу 10H (аналог команды INT 4). Команда сбрасывает флаги IF = 0 и TF = 0.
l IRET
Возврат из обработки прерывания (interrupt return) обеспечивает возврат из программы обработки прерывания. IRET — последняя команда подпрограммы обработки прерывания, по этой команде из стека извлекаются 3 последние слова и загружаются в регистры IP, CS и FL, при этом содержимое SP увеличивается на 6. Команда устанавливает значения всех флагов.
Дата добавления: 2021-09-25; просмотров: 306;