Пошаговая прогонка
Если бит TF (флаг пошаговой прогонки) установлен в 1,
ловушка исключительной ситуации 1 будет срабатывать после
исполнения каждой следующей инструкции. На практике, обычно,
отладчик устанавливает бит TF образа регистра EFLAG в стеке
отладчика, а затем передает управление целевой программе и
загружает образ регистра EFLAG с помощью единственной инструкции
IRET. Пошаговая ловушка срабатывает после выполнения одной
инструкции целевой программы.
Когда появляется исключительная ситуация 1 в качестве
ловушки, CS:EIP заносятся в стек отладчика, указывающий на
следующую неисполненную инструкцию отлаживаемой программы.
Обработчик исключительной ситуации 1 может таким образом
эффективно осуществлять пошаговую прогонку целевой программы
заканчивающейся просто инструкцией IRET.
Однобайтовым кодом операции контрольной точки является код
ССh. Код операции контрольной точки генерирует исключительную
ситуацию ловушки 3.Инструкция контрольной точки кодируется как
однобайтовая инструкция, поэтому она может быть помещена в любую
позицию без перезаписи более, чем одной команды. Однобайтовая
инструкция контрольной точки является заменителем общей
инструкции программного прерывания INT n, где n равно 3. Однако
инструкция контрольной точки (код операции ССh) нечувствительна
к IOPL, в то время как INT n чувствительна к IOPL в защищенном
режиме и в режиме виртуального 8086.
Обычно отладчик может выработать однобайтовую инструкцию
контрольной точки на всех требуемых контрольных точках
исполняемых инструкций. Инструкции контрольных точек не могут
быть временно записаны в постоянную память, такую как ROM. Также
отметим, что инструкция контрольной точки не может обеспечивать
возможность прерываний по данным. Такие короткие переходы
уничтожаются при использовании отладочных регистров для
выполнения точек прерывания инструкций как описано выше.
32 битный флаговый регистр состоит из 8 полей состояния и 5
полей управления. Неопределенные биты считываются как нули ( за
исключением бита 1, который считывается как 1 ) и игнорируются
при записи в них информации. Младшие 16 бит регистра ЕFLАG (
расширенного регистра FLАG ) могут также быть доступны как FLАG
регистр для 16 битных операций.
Флаговые поля регистра ЕFLАG, определенные ниже, описывают
их поведение во время выполнения инструкций, которые влияют на
эти флаги. Существуют, конечно, некоторые инструкции, которые
оставляют флаги полностью без изменений. В приложении В
инструкции рассмотрены в деталях.
СF - флаг переноса, бит 0
СF устанавливается в 1, если в результате операции
производится перенос старшего бита (сложение) или заем в старший
бит (вычитание). В противном случае СF = 0. Для 8, 16, 32 битных
операций он устанавливается для переноса или заема для битов 7,
15, 31 соответственно.
РF - флаг паритета, бит 2
РF = 1, если 8 младших бит результата операции содержат
четное число единиц ( четный паритет ). РF = 0, если 8 младших
бит имеют нечетное количество единиц ( нечетный паритет ). РF
является функцией только младших 8 бит независимо от размера
операнда.
АF - вспомогательный флаг переноса, бит 4
Вспомогательный флаг переноса применяется для упрощения
сложения и вычитания двоично- десятичных чисел. АF = 0, если в
результате операции происходит перенос бита 3 (сложение) или
заем в бит 3 (вычитание). Иначе АF = 0. АF работает на
перенос/заем битов только для бита 3 независимо от длины
операнда.
ZF - флаг нуля, бит 6
ZF = 1, если все биты результата - нули.
SF - флаг знака, бит 7
SF = 1, если старший бит результата равен 1. Иначе - 0. Для
8, 16, 32 битных операций SF отражает состояние битов 7, 15, 31
соответственно.
ТF - флаг ловушки, бит 8
ТF разрешает пошаговую прогонку. Когда ТF устанавливается в
1 процессор 80386 генерирует исключительную ситуацию ловушки 1
после исполнения следующей инструкции. Когда ТF = 0,
исключительная ситуация 1 генерируется только другими средствами
отладки, обеспечиваемыми отладочными регистрами.
IF - флаг разрешения прерываний, бит 9
Когда бит IF установлен в 1, он разрешает распознавание
внешних прерываний, вызываемых сигналом на выводе INТR
микросхемы. Когда IF сброшен в 0, внешние сигналы, подаваемые на
вывод INТR, не распознаются. IОРL показывает максимальное
значение СРL при котором IF бит может быть изменен, когда новые
значения передаются из стека в ЕFLАG (или FLАG) регистр.
Переключатели задач могут всегда изменять IF бит как новое
состояние ЕFLАG, загруженное из сегмента состоямия задачи (ТSS).
DF - флаг направления, бит 10
DF определяет как ЕSI и/или ЕDI индексные регистры
декрементируются или инкрементируются после каждой итерации
стринговых инструкций. Они инкрементируются, если DF = 0 (стринг
обрабатывается слева направо). Постдекремент производится если
DF = 1 (стринг обрабатывается справа налево).
ОF - флаг переполнения, бит 11
ОF = 1, если в результате операции происходит переполнение
числа со знаком. Знаковое переполнение возникает когда в
результате операции происходит перенос/заем в знаковый бит
результата, но не является результатом переноса/заема из
знакового бита или наоборот. Для 8, 16 и 32 битных операций ОF
устанавливается в соответствии со знаковым битом в разря дах 7,
15 и 31.
IОРL - уровень привлегии ввода - вывода, биты 12 - 13
Это двухбитное флаговое поле применяется в защищенном
режиме. IОРL численно показывет максимальное значение СРL при
котором ввод/вывод может производиться безусловно. При любом
большем значении СРL карта битов разрешения ввода/вывода
автоматически принимается во внимание процессором. Этот флаг
также показывает максимальное значение СРL разрешая изменение IF
(разрешения прерываний) флагового бита когда новые значения
извлекаются из стека в ЕFLАG. Инструкции РОРF и IRЕТ могут
изменить IОРL флаг только когда СРL равен 0. Переключатели задач
всегда изменяют IОРL поле, т.к. новый образ ЕFLАG загружается из
сегмента состояния задачи (ТSS).
NТ - вложенная задача, бит 14
Этот флаг используется в защищенном режиме. Этот бит
устанавливается автоматически процессором 80386 во время
переключения задач. NТ устанавливается процессором, чтобы
показать, что выполнение текущей задачи вложено в родительскую
задачу. Если NТ = 1, он показывает, что сегмент состояния
текущей задачи содержит значащий селектор обратной связи с
родительской задачей. Значение NТ тестируется инструкцией IRЕТ
для того, чтобы определить как она должна выполнять межзадачный
возврат в задачу, указанную обратной связью (NТ = 1) или она
должна выполнить нормальный возврат (NТ = 0). Инструкции РОРF
или IRЕТ могут влиять на установку NТ в соответствии с
извлекаемым из стека образом регистра ЕFLАG при любом СРL.
RF - флаг резюме, бит 16
RF использован в сочетании с точками прерываний регистра
отладки. Он проверяет границы инструкций перед обработкой
обработкой контрольной точки (Вreаkроint).
Когда RF = 1, он вызывает какое - либо отладочное
прерывание (контрольная точка выполнения инструкции), чтобы
игнорировать следующую инструкцию. Затем RF автоматически
сбрасывается при успешном завершении каждой инструкции
(благополучность завершения индицируется отсутствием
исключительных ситуаций), за исключением инструкции IRЕТ,
инструкции РОРF и инструкций, вызывающих переключение задач
(JМР, САLL, INТ 3, INТ n, INТО, ВОUNDS, или IRЕТ). Эти
инструкции устанавливают RF в соответствии с загрузкой регистра
ЕFLАG. Например в конце программы обслуживания контрольных точек
(исключительная ситуация 1), инструкция IRЕТ может извлечь из
стека образ регистра ЕFLАG, имея бит RF = 1 и в результате
выполнения программы по адресу контрольной точки без
генерирования прерывания другой контрольной точки на той же
самой инструкции.
VМ - Режим виртуального 8086, бит 17
Бит VМ обеспечивает режим виртуального 8086 в защищенном
режиме. Если этот бит установливается при работе процессора
80386 в защищенном режиме, то процессор начинает работать в
режиме виртуального 8086, поддерживая загрузки сегментных
регистров как в реальном режиме, но генерируя исключительную
ситуацию 13 на привилегированных кодах операций. Бит VМ может
быть установлен только в защищенном режиме инструкцией IRЕТ если
СРL = 0, или переключателем задач на любом уровне привилегий.
Флаг VМ неизменяется инструкцией РОРF. РUSНF всегда заносит в
стек 0 в этом бите, даже если выполняется в режиме виртуального
8086. Образ регистра ЕFLАG, записанный в стек во время обработки
прерывания или сохрененный во время переключения задач, будет,
однако, содержать 1 в этом флаге, если код прерывания исполнялся
как виртуальная задача 8086.
Содержание