Иллюстрированный самоучитель по Assembler

INT Программное прерывание


Команда hit инициирует в процессоре процедуру прерывания, в результате которой управление передается на обработчик прерывания с номером n, который указан в качестве операнда команды int. В стек текущей программы заносится содержимое регистра флагов, сегментного регистра CS и указателя команд IP, после чего в регистры IP и CS передается содержимое двух слов из вектора прерывания с номером n (расположенных по адресам 0:n*4 и 0:n*4+2). Команда сбрасывает флаги IF и TF в 0. Команда iret, которой всегда завершается обработчик прерывания, восстанавливает исходное состояние этих флагов.

Пример 1

int 60h ;Переход на прикладной

;обработчик прерывания 60h

Пример 2

mov AH,1 ;Функция MS-DOS - ввод с

;клавиатуры кода ASCII символа

int 2h ;Вызов MS-DOS

Пример 3

mov АН, 0 ;Функция BIOS (прерывание

;16h) - ввод с клавиатуры

;кода ASCII и скен-кода символа

int 16h ;Вызов BIOS



INTO Прерывание по переполнению

Команда into, будучи установлена вслед за какой-либо арифметической, логической или строковой командой, вызывает обработчик прерываний через вектор 4, если предшествующая команда установила флаг переполнения OF. Перед использованием команды INTO прикладной программист должен поместить в вектор прерывания 4 двухсловный адрес своей программы обработки прерывания по переполнению. Команда сбрасывает флаги IF и TF в 0. Команда iret, которой всегда завершается обработчик прерывания, восстанавливает исходное состояние этих флагов.

Пример

add AX,BX ;Произвольная команда

into ;Вызов прикладного

;обработчика через вектор 4,

;если OF=1

... ;Продолжение программы, если OF=0

IRET Возврат из прерывания

Команда iret возвращает управление прерванному в результате аппаратного или программного прерывания процессу. Команда извлекает из стека три верхние слова и помещает их в регистры IP, CS и флагов (см. команду int). Командой iret должен завершаться любой обработчик прерываний, как аппаратных, так и программных (от команды int). Команда не воздействует на флаги, однако она загружает в регистр флагов из стека его исходное содержимое, которое было там сохранено процессором в процессе обслуживания прерывания. Если требуется, чтобы после возврата из обработчика программного прерывания командой iret какие-либо флаги процессора были установлены требуемым образом (весьма распространенный прием), их установку надо выполнить в копии флагов в стеке.


386+ IRETD

Возврат из прерывания в 32-разрядном режиме

Команда iretd используется в защищенном режиме для возврата из обработчика прерывания или исключения, а также для переключения на исходную задачу. В отличие от 16-разрядной команды iret, данная команда, завершая обработку прерывания или исключения, снимает со стека 3 двойных слова, содержащие расширенный регистр флагов EFALGS, CS и расширенный указатель команд EIP. В случае переключения задач команда iretd выполняет переключение контекстов задач - сохранение состояния завершающейся задачи в ее сегменте состояния задачи и загрузку регистров процессора из сегмента состояния исходной задачи.

Jcc Команды условных переходов

Команды, обозначаемые (в книгах, не в программах!) Jcc, осуществляют переход по указанному адресу при выполнении условия, заданного мнемоникой команды. Если заданное условие не выполняется, переход не осуществляется, а выполняется команда, следующая за командой Jcc. Переход может осуществляться как вперед, так и назад в диапазоне + 127...-128 байтов.

В составе команд процессора предусмотрены следующие команды условных переходов:

Команда Перейти, если Условие перехода

ja выше CF=0 и ZF=0

jae выше или равно CF=0

jb ниже CF=1

jbe ниже или равно CF=1 или ZF=1

jc перенос CF=1

jcxz CX=0 CX=0

je равно ZF=1

jg больше ZF=0 или SF=OF

jge больше или равно SF=OF

jl меньше SF не равно OF

jle меньше или равно ZF=1 или SF не равно OF

jna не выше CF=1 или ZF=1

jnae не выше и не равно CF=1

jnb не ниже CF=0

jnbe не ниже и не равно CF=0 и ZF=0

jnc нет переноса CF=0

jne не равно ZF=0

jng не больше ZF=1 или SF не равно OF

jnge не больше и не равно SF не равно OF

jnl не меньше SF=OF

jnle не меньше и не равно ZF=0 и SF=OF

jno нет переполнения OF=0

jnp нет четности PF=0

jns знаковый бит равен О SF=0

jnz не нуль ZF=0

jo переполнение OF=1

jp есть четность PF=1

jpe сумма битов четная PF=1

jpo сумма битов нечетная PF=0

js знаковый бит равен SF=1

jz нуль ZF= I

Команды условных переходов, осуществляющие переход по условию "выше - ниже", предназначены для анализа чисел без знака; команды, осуществляющие переход по условию "больше - меньше", предназначены для анализа чисел со знаком.



Пример 1

cmp СХ,0 ;CX=0?

je equal ; Если да, перейти па метку equal

Пример 2

cmp AX,1000 ;Пусть AX=8000h=32768

;(=-32768)

ja above ;32768 > 1000. Переход будет

Пример 3

cmp AX,1000h ;Пусть AX=8000h=-32768

; (=32768)

jg greater ;-32768 < 1000h. Перехода не будет

Пример 4

int 21h ;Вызов системной функции

jc error ;Если CF=1 (ошибка), перейти

; на метку error

Команды условных переходов имеют варианты 16- и 32-разрядной адресации (при тех же мнемонических обозначениях) и могут передавать управление в диапазоне -32768...+32767 байт для сегментов с атрибутом размера 16 и в диапазоне -231...+231-1 байт для сегментов с атрибутом размера 32.


Содержание раздела