Флаговый регистр: Регистр флагов

Содержание

Регистр флагов

Главная / Ассемблер / Для чайников / Введение / Представление данных /

Регистр флагов – это очень важный регистр процессора, который используется при выполнении большинства команд. Регистр флагов носит название EFLAGS. Это 32-разрядный регистр. Однако старшие 16 разрядов используются при работе в защищённом режиме, и пока мы их рассматривать не будем. К младшим 16 разрядам этого регистра можно обращаться как к отдельному регистру с именем FLAGS. Именно этот регистр мы и рассмотрим в этом разделе.

Каждый бит в регистре FLAGS является флагом. Флаг – это один или несколько битов памяти, которые могут принимать двоичные значения (или комбинации значений) и характеризуют состояние какого-либо объекта. Обычно флаг может принимать одно из двух логических значений. Поскольку в нашем случае речь идёт о бите, то каждый флаг в регистре может принимать либо значение 0, либо значение 1. Флаги устанавливаются в 1 при определённых условиях, или установка флага в 1 изменяет поведение процессора. На рис. 2.4 показано, какие флаги находятся в разрядах регистра FLAGS.

Бит 1514131211109876543210
Флаг 0NTIOPLOFDFIFTFSFZF0AF0PF1CF

Рис. 2.4. Регистр флагов FLAGS.

Флаг установлен, если значение соответствующего ему бита равно 1.

Флаг сброшен, если значение соответствующего ему бита равно 0.

В таблице 2.6 приведено описание флагов регистра FLAGS.

Таблица 2.6. Описание флагов регистра FLAGS.

Бит Обозначение Название Описание
0 CF Carry Flag Флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приёмнике и произошёл перенос из старшего бита или если требуется заём (при вычитании). Иначе установлен в 0. Например, этот флаг будет установлен при переполнении, рассмотренном в предыдущем разделе.
1 1 Зарезервирован.
2 PF Parity Flag Флаг чётности. Устанавливается в 1, если младший байт результата предыдущей команды содержит чётное количество битов, равных 1. Если количество единиц в младшем байте нечётное, то этот флаг равен 0.
3 0 Зарезервирован.
4 AF Auxiliary Carry Flag Вспомогательный флаг переноса (или флаг полупереноса). Устанавливается в 1, если в результате предыдущей операции произошёл перенос (или заём) из третьего бита в четвёртый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
5 0 Зарезервирован.
6 ZF Zero Flag Флаг нуля. Устанавливается 1, если результат предыдущей команды равен 0.
7 SF Sign Flag Флаг знака. Этот флаг всегда равен старшему биту результата.
8 TF Trap Flag Флаг трассировки (или флаг ловушки). Он был предусмотрен для работы отладчиков в пошаговом выполнении, которые не используют защищённый режим. Если этот флаг установить в 1, то после выполнения каждой программной команды управление временно передаётся отладчику (вызывается прерывание 1).
9
IF
Interrupt Enable Flag Флаг разрешения прерываний. Если сбросить этот флаг в 0, то процессор перестанет обрабатывать прерывания от внешних устройств. Обычно его сбрасывают на короткое время для выполнения критических участков программы.
10 DF Direction Flag Флаг направления. Контролирует поведение команд обработки строк. Если установлен в 1, то строки обрабатываются в сторону уменьшения адресов, если сброшен в 0, то наоборот.
11 OF Overflow Flag Флаг переполнения. Устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное. И наоборот.
12
13
IOPL I/O Privilege Level Уровень приоритета ввода/вывода.
14 NT Nested Task Флаг вложенности задач.
15 0 Зарезервирован.

Значения некоторых флагов можно изменять напрямую с помощью специальных команд. Однако нет инструкций, которые бы позволяли обращаться к регистру флагов как к обычному регистру по имени. Некоторые флаги устанавливаются автоматически и предназначены только для чтения.

Сейчас вам будет понятно далеко не всё из того, что описано в таблице 2.4. Например, вы пока не знаете, что такое прерывания. Но всему своё время. Пока просто запомните страницу с описанием регистра флагов и возвращайтесь к ней по мере необходимости.

Системные флаги IOPL предназначены для управления операционной средой в защищённом режиме. Они не используются в прикладных программах.


Флаговый регистр (flags) — Студопедия

Этот регистр содержит 16 бит. Регистр используется побитно, т.е. каждый бит имеет определенное функциональное назначение, который называется флагом. Флаги управляются различными командами для индикации состояния операции. Во всех случаях флаги сохраняют свое значение до тех пор, пока другая команда не изменит его.

Рис. 7. 1. Флаговый регистр flags.

Рассмотрим флаги регистра flags в последовательности справа налево.

CF (Carry Flag) — флаг переноса. Содержит значение «переносов» (0 или 1) из старшего разряда при арифметических операциях и некоторых операциях сдвига и циклического сдвига.

PF (Parity Flag) — флаг четности. Проверяет младшие восемь бит результатов операций над данными. Нечетное число бит приводит к установке этого флага в 0, а четное — в 1.

AF (Auxiliary Carry Flag) — дополнительный флаг переноса. Устанавливается в 1, если арифметическая операция приводит к переносу четвертого справа бита (бит номер 3) в регистровой однобайтовой команде. Данный флаг имеет отношение к арифметическим операциям над символами кода ASCII и к десятичным упакованным полям.

ZF (Zero Flag) — флаг нуля. Устанавливается в качестве результата арифметических команд и команд сравнения. Как это ни странно, ненулевой результат приводит к установке нулевого значения этого флага, а нулевой — к установке единичного значения. Команды условного перехода JE и JZ проверяют этот флаг.


SF (Sign Flag) — знаковый флаг. Устанавливается в соответствии со знаком результата (старшего бита) после арифметических операций: положительный результат устанавливает 0, а отрицательный — 1. Команды условного перехода JG и JL проверяют этот флаг.

TF (Trap Flag) — флаг пошагового выполнения. Если этот флаг установлен в единичное состояние, то процессор переходит в режим пошагового выполнения команд или в отладочный режим.

IF (Interrupt Flag) — флаг прерывания. При нулевом состоянии этого флага прерывания запрещены, при единичном — разрешены.

DF (Direction Flag) — флаг направления. Используется в строковых операциях для определения направления передачи данных. При нулевом состоянии команда увеличивает содержимое регистров SI и DI, вызывая передачу данных слева направо, при нулевом — уменьшает содержимое этих регистров, вызывая передачу данных справа налево.

OF (Overflow Flag) — флаг переполнения. Фиксирует арифметическое переполнение, т.е. перенос вниз старшего (знакового) бита при знаковых арифметических операциях.

IOPL (Input/Output Privilege Level) — флаг уровня привилегий ввода-вы–вода. Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи.

NT (Nested Task) — флаг вложенности задачи. Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую.


Два последних флага мы рассматривать не будем по той причине, что наши примеры выполняются не в защищенном режиме, а в режиме реальных адресов.

В качестве примера возьмем команду CMP, которая сравнивает два операнда и воздействует на флаги AF, CF, OF, PF, SF, ZF. Однако нет необходимости проверять все эти флаги по отдельности. В следующем примере проверяется, содержит ли регистр BX нулевое значение:

CMP BX,00 ;Сравнение BX с нулем

JZ B50 ;Переход на B50 если нуль

. (действия при не нуле)

B50: … ;Точка перехода при BX=0

Если BX содержит нулевое значение, команда CMP устанавливает флаг нуля ZF в единичное состояние, и возможно изменяет другие флаги. Команда JZ (переход, если нуль) проверяет только флаг ZF. При единичном значении ZF, обозначающее нулевой признак, команда передает управление на адрес, указанный в ее операнде, т.е. на метку B50.

Внутренние регистры: Регистр флагов — Club155.ru

 

Регистр флагов EFLAGS отражает текущее состояние процессора, многие из его битов устанавливаются после выполнения операций и индицируют тип, полученного результата. Формат регистра флагов приведен на рис. 1.3.

 

Рис. 1.3. Формат регистра флагов

 

CF (Флаг переноса, бит 0)

Флаг переноса фиксирует значение переноса (заема), возникающего при сложении (вычитании). Иногда используется и в других ситуациях.

 

PF (Флаг четности, бит 2)

Флаг четности фиксирует наличие четного числа единиц в младшем байте результата операции, может быть использован, например, для контроля правильности передачи данных.

 

AF (Флаг вспомогательного переноса, бит 4)

Флаг вспомогательного переноса фиксирует перенос (заем) из младшей тетрады, т.е. из бита 3 в старшую тетраду при сложении (вычитании). Используется только для двоично-десятичной арифметики, которая оперирует исключительно младшими байтами.

 

ZF (Флаг нуля, бит 6)

Флаг нуля сигнализирует о получении нулевого (ZF = 1) или ненулевого (ZF = 0) результата операции.

 

SF (Флаг знака, бит 7)

Флаг знака дублирует значение старшего бита результата, который при использовании дополнительного кода соответствует знаку числа (0 – положительное число, 1 – отрицательное).

 

TF (Флаг трассировки, бит 8)

При установке флага трассировки TF = 1, микропроцессор переходит в пошаговый режим работы, применяемый при отладке программ, когда автоматически генерируется особая ситуация отладки (#DB) после выполнения каждой команды. Прерывание отладки начнет генерироваться, если прикладная программа установит флаг TF с помощью команд POPF/POPFD или IRET/IRETD.

 

IF (Флаг разрешения прерываний, бит 9)

При установке флага разрешения прерываний IF = 1, микропроцессор воспринимает (распознает) и соответственно реагирует на запрос прерывания по входу INTR# (внешние маскируемые прерывания). При IF = 0, прерывания по этому входу запрещаются и микропроцессор игнорирует поступающие запросы прерываний.

Значение флага IF не влияет на восприятие внешних немаскируемых прерываний по входу NMI#, а также внутренних программных прерываний, выполняемых по команде INT.

Изменение этого флага командами CLI, STI, POPF/POPFD и IRET/IRETD возможно не всегда и определяется текущими:

 

При обычной обработке прерываний (CR4.PVI = 0 в защищенном режиме или CR4.VME = 0 в режиме V86), когда IOPL < CPL ( IOPL < 3 в режиме V86), все попытки изменения флага IF командами STI, CLI, POPF/POPFD и IRET/IRETD вызывают генерацию ошибки общей защиты (#GP).

Когда же виртуальные прерывания инициализированы (CR4.PVI = 1 в защищенном режиме или CR4.VME = 1 в режиме V86) при выполнении того же условия IOPL < CPL ( IOPL < 3 в режиме V86) команды CLI и STI оказывают влияние на флаг EFLAGS.VIF, а флаг IF при этом остается неизменным. Флаг VIF используется всеми командами (в т.ч. PUSHF, POPF), которые пытаются изменять или считывать значение флага IF. Только значение флага VIF будет всякий раз изменяться и считываться программой. При поступлении внешнего маскируемого прерывания процессор производит стандартное обращение к обработчику прерываний защищенного режима через таблицу дескрипторов прерываний (IDT). При этом, при записи в стек значения регистра EFLAGS процессор записывает поле IOPL равным 3 и флаг IF равным VIF.

 

DF (Флаг направления, бит 10)

Флаг направления определяет порядок обработки цепочек в соответствующих командах (строковые команды: STOS, LODS, CMPS, OUTS и т.д.) — от меньших адресов к большим (DF = 0) или от больших к меньшим (DF = 1).

 

OF (Флаг переполнения, бит 11)

Флаг переполнения сигнализирует о потере старшего бита результата в связи с переполнением разрядной сетки при работе со знаковыми числами. При сложении этот флаг устанавливается в 1, если происходит перенос в старший бит и нет переноса из старшего бита, или имеется перенос из старшего бита, но отсутствует перенос в него; в противном случае, флаг OF устанавливается в 0. При вычитании он устанавливается в 1, когда возникает заем из старшего бита, но заем в старший бит отсутствует, либо имеется заем в старший бит, но отсутствует заем из него.

 

IOPL (Уровень привилегий ввода/вывода, биты 13 и 12: Intel286 …)

Поле уровня привилегий ввода/вывода (Input/output Privilege Level – IOPL) используется механизмом защиты для управления доступом к адресному пространству ввода/вывода и программным прерываниям. Ряд команд, называемых IOPL-чувствительными командами (IOPL-sensitive instructions), могут выполняться по-разному в зависимости от текущего режима работы процессора и значения поля IOPL.

В защищенном режиме к IOPL-чувствительным командам относятся команды IN, OUT, INS/NSB/INSW/INSD, OUTS/OUTSB/OUTSW/OUTSD, CLI, STI и префикс LOCK (только на процессоре Intel286). Всякий раз, когда программа осуществляет чтение/запись в порты ввода/вывода либо разрешение/запрещение прерываний указанными командами, процессор осуществляет специальную проверку привилегий. В зависимости от текущего значения поля IOPL и текущего уровня привилегий (CPL), механизмом защиты может генерироваться особая ситуация общей защиты (#GP). Если CPLIOPL, то команда исполняется в соответствии со своим назначением (как и в режиме реальной адресации). Если CPL > IOPL в защищенном режиме (а также всегда в режиме V86), производится дополнительная проверка доступности соответствующего порта ввода/вывода при любых операциях с ним. Такая проверка использует специальную карту разрешения ввода/вывода, которая расположена в верхней части сегмента состояния задачи TSS и определяет доступность всех портов ввода/вывода. В случае недоступности порта или при попытках разрешения/запрещения прерываний командами CLI, STI, когда CPL > IOPL, процессор генерирует ошибку общей защиты (#GP).

Изменение уровня привилегий ввода/вывода IOPL возможно командами POPF/POPFD и IRET/IRETD в защищенном режиме и только при выполнении команды на уровне привилегий, по крайней мере таком же (а для команды POPF/POPFD только на нулевом), как и текущий уровень привилегий ввода/вывода (режим реальной адресации эквивалентен нулевому уровню привилегий).

При работе в режиме V86 (EFLAGS.VM = 1) IOPL-чувствительными являются команды CLI, STI, POPF/POPFD, PUSHF/PUSHFD, IRET/IRETD, INT n. У каждой из этих команд имеется аналогичная зависимость от текущего значения поля IOPL. Например, команда INT n вызывает генерацию особой ситуации общей защиты (#GP), если IOPL < 3, или выполняется программное прерывание (при IOPL = 3).

В защищенном режиме команда POPF/POPFD является одновременно зависимой и от уровня привилегий ввода/вывода IOPL, и от текущего уровня привилегий (CPL), позволяя изменять поле IOPL только при выполнении на нулевом уровне привилегий (CPL = 0), а флаг разрешения прерываний IF — только при условии CPL ≤ IOPL. Однако, если эта команда не может изменить указанное поле или флаг из-за недостаточности текущих привилегий, то генерации особой ситуации общей защиты (#GP) не происходит — продолжается выполнение последующих команд. Это поведение меняется в режиме V86 — здесь попытка использования команды POPF/POPFD при IOPL < 3 (кроме режима EV86) всегда вызывает генерацию особой ситуации общей защиты (#GP).

В процессорах, начиная с Pentium, имеется специальный режим EV86 (включается установкой флага CR4.VME = 1 в режиме V86), в котором возникает дополнительная специфика для IOPL-чувствительных команд. Во-первых, команда IRET в этом режиме вообще перестает быть IOPL-чувствительной и не генерирует особую ситуацию общей защиты (#GP) при IOPL < 3. Команды CLI, STI при IOPL <  3, вместо генерации указанной особой ситуации, оказывают влияние на флаг виртуального прерывания VIF (также как и команда POPF), а для команды INT n вообще возникает несколько режимов, которые зависят от текущего контекста конкретной задачи V86. И наконец, команда PUSHF (16-битная), выполняемая в режиме EV86 при IOPL < 3, также не генериует особую ситуацию общей защиты (#GP), а записывает в стек образ регистра флагов FLAGS, у которого биты, соответствующие полю IOPL, устанавливаются равными 3, а бит IF записывается из текущего значения флага VIF.

В ранних моделях процессоров до Intel286 (8086/8088, Intel186) биты 12 и 13 регистра флагов FLAGS, соответствующие полю IOPL, считались зарезервированными, а их значения всегда были равны единице. В процессоре Intel286 в режиме реальной адресации невозможно изменять значения этих битов — они всегда остаются нулевыми (они сбрасываются в момент инициализации процессора), а вот более поздние модели процессоров, начиная с Intel386, такого ограничения уже не имеют, то есть поле IOPL можно изменять и в режиме реальной адресации. Указанная особенность использовалась в процедурах идентификации процессоров вплоть до появления команды CPUID в процессоре Pentium.

 

NT (Вложенная задача, бит 14: Intel286 …)

Процессор устанавливает и проверяет флаг вложенной задачи для контроля за прерванными задачами (задачи, во время исполнения которых имело место прерывание) и при вызове процедур. Флаг NT влияет на действия, производимые командой IRET/IRETD. Этот флаг может быть изменен командой POPF/POPFD и IRET/IRETD. Некорректные изменения этого флага могут привести к возникновению различных особых ситуаций в прикладных программах.

 

RF (Флаг возобновления, бит 16: Intel386 …)

Флаг возобновления RF временно выключает обработку особых ситуаций отладки (DB#) для того, чтобы команда, вызвавшая такую ситуацию, могла быть перезапущена и не стала бы причиной новой особой ситуации. Отладчик устанавливает этот флаг командой IRETD при возврате в прерванную программу. Команды POPF, POPFD (в режиме V86) и IRET на этот флаг не влияют.

 

VM (Виртуальный режим, бит 17: Intel386 …)

Установка флага виртуального режима VM переключает процессор в режим виртуального-8086 (специальный случай защищенного режима).

 

AC (Режим контроля выравнивания, бит 18: Intel486 …)

Установка флага режима контроля выравнивания (AC = 1) и бита AM регистра CR0 (CR0.AM = 1) включает контроль выравнивания при обращении к памяти. При этом только при текущем уровне привилегий равном 3 (CPL = 3) генерируется особая ситуация контроля выравнивания (#AC), если происходит обращение к невыровненному операнду (например, к слову по нечетному адресу или к двойному слову по адресу не кратному четырем).

Таблица 3.5. Условия контроля выравнивания

Тип данных

Адрес должен быть кратен

WORD (Слово) – m16, m16int, moffs16

2

DWORD (Двойное слово) – m32, m32int, moffs32

4

QUADWORD (Учетверенное слово) – m64, m64int

8

DOUBLE QUADWORD (Двойное учетверенное слово) – m128

16

Short-real (Короткое вещественное – 32 бита) – m32real

4

Long-real (Длинное вещественное – 64 бита) – m64real

8

Temp-real (Временное вещественное – 80 бит) – m80real

8

Селектор

2

32-битный дальний указатель – m16:16

2

32-битный указатель – m16:16

4

48-битный дальний указатель – m16:32

4

Содержимое GDTR, IDTR, LDTR или TR – m16&32

4

Область сохранения для FSTENV/FNSTENV/FLDENV – mNbyte

4 или 2 – определяется размером операнда

Область сохранения для FSAVE/FNSAVE/FRSTOR – mNbyte

4 или 2 – определяется размером операнда

Строка бит

4 или 2 – определяется размером операнда

 

VIF (Виртуальное прерывание, бит 19: Pentium …)

Флаг виртуального прерывания VIF используется совместно с флагом VIP и позволяет обеспечить нормальное выполнение старого ПО, использующего команды управления внешними маскируемыми прерываниями (векторы от 32 до 255), в современной мультипроцессорной и мультизадачной программно-аппаратной среде.

Для этого в процессорах, начиная с Pentium, поддерживаются специальные расширенные режимы обработки прерываний:

 

В этих режимах флаг виртуального прерывания VIF выступает виртуальным подобием флага IF. При условии, что виртуальные прерывания инициализированы (CR4.PVI = 1 в защищенном режиме, CR4.VME = 1 в режиме V86), команды CLI и STI оказывают влияние на флаг EFLAGS.VIF, а флаг IF при этом остается неизменным. При поступлении внешнего маскируемого прерывания процессор производит стандартное обращение к обработчику прерываний защищенного режима через таблицу дескрипторов прерываний (IDT). При этом, при записи в стек значения регистра EFLAGS процессор записывает поле IOPL равным 3 и флаг IF равным VIF.

 

VIP (Ожидание виртуального прерывания, бит 20: Pentium …)

Флаг ожидания виртуального прерывания VIP используется совместно с флагом VIF и позволяет прикладным программам в режиме поддержки виртуальных прерываний отслеживать внешние вызовы прерываний даже тогда, когда программа замаскирует их выполнение (индикация отложенных виртуальных прерываний). За дополнительной информацией по использованию этих флагов обратитесь к описанию прерываний и особых ситуаций.

 

ID (Флаг идентификации, бит 21: Pentium …)

Флаг идентификации ID предназначен для проверки — поддерживается ли процессором команда CPUID. Если в программе можно установить и сбросить этот флаг, значит команда CPUID данным процессором поддерживается.

 

 

< Предыдущая   Следующая >

CPU Observation

Процессор Intel 80386. Учебный курс.

Часть 1.1. Описание регистров.

Микропроцессор Intel 80386 cостоит из центрального процессора, блока управления памятью и шины интерфейса:

Сердце микропроцессора — главный процессор, включает в себя исполнительный блок, содержащий 8 32-х разрядных регистров общего назначения, которые используются как для вычисления адреса, так и для операций с данными. Исполнительный блок также включает 64-х разрядное барабанное устройство, используемое для ускорения многих операций.
Устройство обработки команд дешифрует коды операций команд и помещает их в очередь для немедленного выполнения исполнительным блоком.
Устройство управления памятью состоит из блока сегментации и устройства замещения страниц или подкачки.
Сегментация позволяет управлять пространством логического адреса.
Механизм подкачки работает «внизу» и параллелен процессу сегментации, что позволяет управлять пространством физического адреса. Одна его страница составляет 4 килобайта.
Для использования системы виртуальной памяти 80386 поддерживает полную восстанавливаемость для всех ошибок на странице и в сегменте. Память может быть разделена на один или несколько сегментов различной длины (до 4 гигабайт).
Любое задание на 80386 может иметь 16381 сегмент, до 4 гигабайт каждый, т.е. обеспечивается 64 терабайта виртуальной памяти для каждой задачи.
Блок сегментации обеспечивает четыре уровня защиты для изоляции и защиты устройств и операционных систем друг от друга. Конструкция микропроцессора позволяет все системы соединять в единое целое.
Процессор 80386 имеет 2 режима работы:

  1. РЕЖИМ РЕАЛЬНОЙ АДРЕСАЦИИ
  2. РЕЖИМ ЗАЩИЩЕННОЙ ВИРТУАЛЬНОЙ АДРЕСАЦИИ

В реальном режиме 80386 работает как очень быстрый 8086, но с 32-х разрядным расширением. Реальный режим также используется для подготовки микропроцессора к работе в защищенном режиме.
Виртуальный режим обеспечивает доступ к очень сложному способу управления памятью, подкачку (замещение) страниц и другие возможности микропроцессора.
В виртуальном режиме программное обеспечение 80386 может решать задачи по степени сложности такие же, как у 8086 и 80286 в режиме виртуальной памяти. Это позволяет выполнять програмное обеспечение 8086.
Виртуальные задачи 80386 могут защищаться одна от другой и главной ОС 80386 путем использования замещения страниц и эмуляции команд ввода-вывода.
Для совмещения компьютера с высокоэффективными системами интерфейс шины 80386 имеет конвеерную обработку данных, динамическое резервирование шины данных и прямые сигналы BYTE ENABLE.

ОБЗОР РЕГИСТРОВ.

80386 имеет 32 програмно-доступных регистра в следующих категориях:

  1. РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ
  2. РЕГИСТРЫ СЕГМЕНТАЦИИ
  3. РЕГИСТР ФЛАГОВ
  4. РЕГИСТРЫ УПРАВЛЕНИЯ
  5. РЕГИСТРЫ СИСТЕМНОГО АДРЕСА
  6. РЕГИСТР ТЕСТОВ
  7. РЕГИСТР ОТЛАДКИ

Эти регистры являются также набором 8086, 80286, поэтому все 16-и разрядные регистры всех процессоров более ранних выпусков «покрываются» 32-х разрядными регистрами 80386.

На рисунке представлены все регистры базовой архитектуры микропроцессора, которые включают: регистры общего адреса и данных, указатель команд, регистр флагов. Данные регистры при включении новой задачи загружаются новым содержимым.
Базовая архитектура содержит 6 прямо доступных сегмента, каждый размером до 4 гигабайт. Сегменты указываются значениями селектора, помещенными в регистр сегмента.
Селекторы автоматически загружаются при операции включения задач.
Другой тип регистров — это регистры управления, системного адреса, отладки и тестов. Они используются для отладки операционных систем.

ОПИСАНИЕ РЕГИСТРОВ.

РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ.
Микропроцессор имеет 8 32-х разрядных регистров общего назначения. Они поддерживают 16, 32-х разрядные адресные операнды, 1, 8, 16, 32, 64 операнды данных и битовые поля от 1 до 32 битов. Они называются: EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP.
Младшие 16 разрядов каждого регистра могут использоваться по отдельности, они называются: AX, BX, CX, DX, SI, DI, BP, SP.
Также могут индивидуально использоваться младший (0-7) и старший (8-15) байты регистров общего назначения AX, BX, CX, DX, соответственно их называют: AL, BL, CL, DL и AH, BH, CH, DH.
Индивидуальная доступность байтов регистров общего назначения обеспечивает дополнительную гибкость для операций с данными, но не используется при адресации.

УКАЗАТЕЛЬ КОМАНД (IP).
Регистр указателя команд представляет собой 32-х разрядный регистр, который называют EIP. Он содержит смещение следующей команды, которую нужно выполнить. Смещение всегда определяется относительно сегмента кода. Его младшие 16 бит называются IP и используются при шестнадцатиразрядной адресации.
РЕГИСТР ФЛАГОВ.
Регистр флагов является 32-х разрядным и называется EFLAGS. Определенные биты EFLAGS, как показанно на рисунке (ниже), управляют некоторыми операциями и подчеркивают статус 80386. Младшие 16 разрядов EFLAGS представляют собой регистр FLAGS, который может использоваться при выполнении операций с 8086.

Наилучший способ изучения регистра флагов - описание его побитно. Структура регистра флагов показана на рисунке. Заметим, что на рисунке не определяется каждый бит. Неопределенные биты являются зарезервированными, т.е. в 80386 они не имеют значения, однако могут быть использованы для специальных целей в последующих версиях микропроцессора.
Все флаги младшего байта регистра устанавливаются арифметическими или логическими операциями процессора. За исключением флага переполнения, все флаги старшего байта младшего слова отражают состояние микропроцессора и влияют на характер выполнения программ.
Флаг знака SF показывает, положительным или отрицательным был результат последней арифметической или логической операции.
Флаг нуля ZF показывает что результат последней операции был равен нулю.
Флаг четности PF показывает, четно или нечетно число единиц результата. Он устанавливается в 1 если результат операции имеет четное число единиц, иначе — в 0.
Флаг четности СF используется при вычислениях повышенной точности, логических операциях и других командах. Он показывает, был ли перенос из старшего разряда операнда или нет. И, соответственно, устанавливается в 1 или 0.
Флаг AUX позволяет микропроцессору выполнять команды десятичной арифметики. Он показывает правильно ли выполнилась команда десятичной арифметики или нет, и, соответственно, устанавливается в 0 или 1.
Флаг переполнения OF показывает, произошло переполнение при выполнении операций или нет, т.е. показывает правильность результата. Устанавливается в 0 если переполнения не было, иначе — в 1.
Флаг специального прерывания TF помогает отлаживать программы. Этот флаг не устанавливается в результате работы микропроцессора, а устанавливается программой с помощью специальной команды. Его также называют флагом трассировки или пошаговой работы. Когда он установлен, после выполнения каждой команды возникает прерывание по трассировке. Во время процедуры прерывания микропроцессор сбрасывает флаг трассировки. Это позволяет выполнять обработку перывания по трассировке без прерывания после каждой команды. После стандартной обработки флаги устанавливаются в исходное состояние. Т.е. после выполнения следующей команды программы снова возникнет прерывание по трассировке. Этот процесс будет продолжаться до тех пор, пока программа пользователя не сбросит флаг TF или не завершится выполнение задачи.
Флаг прерываний IF управляет внешними прерываниями. Пока флаг прерываний сброшен в 0, никакие внешние прерывания не будут обрабатываться микропроцессором (за исключением немаскируемых). Когда он установлен в 1, будет производиться обработка любых возникающих прерываний.
Флаг направления DF используется микропроцессором при работе со строками, которые работают с большими блоками данных для определения направления продвижения по блоку, т.е. в сторону увеличения адресов или уменьшения. Когда флаг установлен в 1, команды обработки строк работают в сторону уменьшения адресов после обработки единицы информации, если флаг сброшен в 0, — в сторону увеличения.
Рассмотренные биты EFLAGS полностью совпадают с битами регистра FLAGS микропроцессора 8086/8088. А теперь, рассмотрим биты EFLAGS, которые показывают специфику микропроцессора 80386.
Флаг виртуального режима VM (бит 17) обеспечивает виртуальный 8086 режим в пределах защищенного. Если он установлен, в то время, когда 80386 находится в защищенном режиме, 8086 включается в виртуальную 8086 операцию, манипулируя загрузкой сегментов, как это делает 8086, генерируя 13 прерывание привилегированных операционных кодов. Бит VM может быть установлен в защищенном режиме командой IRET, если текущий привилегированный уровень равен 0, и путем включения задач на любом уровне привилегий. Бит VM не подчиняется действию команды POPF. PUSHF всегда посылает 0 в этот разряд, даже, если работает в виртуальном 8086 режиме. Образ EFLAGS, сохраненный в стеке во время обработки прерывания или во время включения задачи, будет содержать единицу в этом бите, если прерывание обрабатывалось как виртуальная 8086 задача.
Флаг возобновления (RF) используется при пошаговом режиме или совместно с точками прерываний регистров отладки. Он проверяется на границе команды, перед обработкой точки останова. Если RF установлен, то любая ошибка отладки будет игнорирована на следующей команде. RF автоматически сбрасывается при успешном окончании каждой команды (ошибки не сигнализируются), кроме команд IRET, POPF, JMP, CALL, INTER, которые вызывают включение задачи. Эти команды устанавливают RF в соответствии с определенным образом памяти.
Например:
В конце обслуживания программы прерываний команда IRET может вытолкнуть образ EFLAGS имеющего RF установленным и возобновляет выполнение программы в адресе точки прерывания без генерирования другого прерывания в том же месте.
Флг признака вложения задач — NT (разряд 14) используется в защищенном режиме. NT устанавливается, чтобы показать, что выполнение данной задачи вложено в пределах другой задачи. Если он установлен, то сегмент состояния текущей вложенной задачи имеет достоверную обратную связь с сегментом состояния предыдущей задачи. Данный бит устанавливается или сбрасывается командами передающими управление другим задачам. Значение NT в EFLAGS проверяется командой IRET. Чтобы его установить следует выполнять внутризадачное возвращение или внешнезадачное возвращение. Команды POPF или IRET будут оказывать воздействие на установку данного бита согласно образу EFLAGS на любом уровне привилегий.
БИТ ОПРЕДЕЛЕНИЯ УРОВНЯ ПРИВИЛЕГИЙ ВВОДА/ВЫВОДА (I/O P/L) — разряды 12,13.
Данное двухбитовое поле также относится к защищенному режиму. Уровень привилегий ввода/вывода (I/O P/L) указывает максимальное значение текущего уровня привилегий. Для максимально допустимого значения текущего уровня привилегий, при выполнении команд ввода/вывода без генерирования прерывания по 13 исключению, он также указывает максимальное значение текущего уровня привилегий, позволяющее изменить бит IF, когда новые значения загружаются из стека в регистры FLAGS или EFLAGS. Команды POPF и IRET могут изменять поле I/O P/L, когда выполняются при уровне привилегий 0. Операции включения задач всегда изменяют поле I/O P/L, когда новый образ флага загружается из сегмента состояния задачи.
СЕГМЕНТНЫЕ РЕГИСТРЫ.
Шесть 16-ти разрядных сегментных регистров содержат базовые адреса сегментов, определяющие сегменты памяти текущей адресации.

В защищенном режиме, каждый сегмент может иметь размеры от одного байта, до целого линейного и физического пространства машины (до 4Гб), в режиме реальной адресации, максимальный размер сегмента ограничен до 64Кб. Шесть сегментов, адресуемых в любой момент времени, определяются содержимым регистров CS, SS, DS, ES, FS и GS. Значение в CS указывает на текущий сегмент кода; содержимое SS указывает на текущий сегмент стека; а значения в DS, ES, FS, GS — на сегменты данных.
РЕГИСТРЫ ДЕСКРИПТОРА СЕГМЕНТА.
Регистры дескриптора сегмента невидимы для програмиста, однако их содержание очень полезно знать. В 80386, регистр дескриптора, невидимый для программиста, соотнесен с каждым видимым регистром селектора, как показано на рисунке выше.
Каждый из них содержит 32-х битовый базовый адрес сегмента, его границу (предел) и другие необходимые признаки сегмента. Когда адрес сегмента загружается в сегментный регистр, ассоциативный (соотнесенный) регистр дескриптора автоматически модифицируется в соответствии с новой информацией. В режиме реальной адресации только базовый адрес модифицируется напрямую, путем сдвига его значения на четыре разряда влево, поскольку максимальная граница и признаки сегмента фиксированы. В защищенном режиме базовый адрес, граница, все признаки модифицируются содержимым регистра дескриптора сегмента, индексированного селектором. Каждый раз, когда происходит ссылка на ячейку памяти, регистр дескриптора сегмента, автоматически вовлекается с сылкой на ячейку памяти. 32-х битовый базовый адрес сегмента становится компонентом вычисления линейного адреса, 32-х битовое значение границы используется для операций контроля границы, а признаки проверяются на соответствие типу ссылки на ячейку памяти, которая запрашивается.
УПРАВЛЯЮЩИЕ РЕГИСТРЫ.
80386 имеет три управляющих регистра по 32 бита: CR0, CR2 и CR3, которые поддерживают состояние машины в глобальном характере, т.е. от специфической до индивидуальной задачи. Эти регистры, наряду с регистрами системного адреса, которые будут описаны в следующем разделе, поддерживают состояние машины и воздействуют на все задачи в системе.
CR 0: УПРАВЛЯЮЩИЙ РЕГИСТР МАШИНЫ (включает 80286 слово состояние машины).
CR 0, представленный на рисунке (ниже), содержит 6 определенных разрядов для целей управления и определения состояния. 16 разрядов младшего порядка CR0 также известны как СЛОВО СОСТОЯНИЯ МАШИНЫ (MSW), для совместимости с защищенным режимом 80286. Команды LMSW и SMSW используются как специальные псевдонимы операций загрузки и хранения в памяти CR0, где используются только его младшие 16 бит. Для совместимости с операционными системами 80286, эти команды 80386 работают аналогично командам 80286, т.е. новые разряды CR0 игнорируются. Новые операционные системы микропроцессора Intel 80386 должны использовать команды для загрузки регистра CR0 полностью: MOV CR0.

Теперь опишем все разряды регистра CR0.
PG (разбиение на страницы, бит 31).
PG бит устанавливается, чтобы разблокировать устройство замещения страниц, выполненное на кристале. PG устанавливается в 0 для его блокировки.
ET (тип расширения процессора, бит 4).
ET показывает тип расширения процессора (80287 или 80387), который определяется уровнем ERROR ввода, следующего за сбросом 80386. При желании, ET бит может также быть сброшен путем загрузки CR0 при выполнении программы. Когда ET установлен в 1, то применяется 32-х битный протокол, иначе — 16-ти битный. Следует обратить внимание, что для строгой совместимости с 80286 бит ЕТ не подвергается воздействию команды LMSW.
TS (переключение задачи, бит 3).
TS автоматически устанавливается каждый раз, когда выполняеся операция переключения задачи. Когда TS установлен в 1, операционный код сопроцессора приводит к операционному прерыванию (исключение 7) «Сопроцессор не готов», при условии, что бит MP тоже установлен. Обработчик прерывания обычно сохраняет контекст 80287/80387, принадлежащий текущей задаче и очищает бит TS перед тем, как возвратиться к ошибочному коду операции сопроцессора.
EM (сопроцессор эмуляции).
Бит EM устанавливается для того, чтобы заставить все коды операций сопроцессора вырабатывать прерывание (исключение7) «Сопроцессор не готов». EM устанавливается в 0, чтобы позволить выполнение кодов операций на фактическом 80287 или 80387 сопроцессоре (случай умолчания после сброса). Обратите внимание, что код операции WAIT не подвержен влиянию бита EM.
MP (монитор сопроцессора, бит 1).
MP бит используется вместе с TS битом для определения, вырабатывает ли код операции WAIT ошибку (исключение 7) «Сопроцессор не готов», когда TS=1. Когда MP=1 и TS=1 код операции WAIT вырабатывает исключение 7. В других случаях этого не происходит. Обратите внимание, что TS устанавливается автоматически каждый раз когда выполняется операция переключения задачи.
PE (защищенный режим, бит 0).
PE бит устанавливается для создания возможности работы в защищенном режиме. Когда PE сбрасывается, процессор работает в реальном режиме. PE может быть установлен путем загрузки CR0 или MSW. PE может быть сброшен только при загрузке в CR0. Обратите внимание, что для строгой совместимости с 80286, PE не может быть сброшен командой LMSW.
CR 1: резерв.
CR 1 зарезирвирован для использования в будущих моделях процессоров INTEL.
CR 2: ЛИНЕЙНЫЙ АДРЕС ПРЕРЫВАНИЯ ИЗ-ЗА ОТСУТСТВИЯ СТРАНИЦЫ.
CR 2, представлен на рисунке (ниже). Он содержит 32-х битовый адрес, который определяет наличее ошибки на последней странице. Код ошибки обработанной страницы, помещенный в стек по запросу может представить дополнительрую информацию о статусе ошибки на странице.

CR 3: БАЗОВЫЙ АДРЕС ТАБЛИЦЫ СТРАНИЦ.
CR 3 (см. рисунок выше) содержит физический базовый адрес таблицы страниц. Таблица страниц 80386 всегда постранично выравнена (т.е располагается через 4 Кбайта). Поэтому самые младшие 12 бит CR 3 игнорируются и всегда помещаются в память как неопределенные.
Включение задачи через TSS, которое изменяет значение в CR 3, или очевидная загрузка CR 3 любым дгугим значением, сделает неверным (недоступным) все вводные таблицы страниц, помещенные в кэш.
РЕГИСТРЫ СИТЕМНОГО АДРЕСА.
Существуют четыре специальных регистра  для обращения к таблицам или сегментам, поддерживаемым 80286/80386 моделью защиты. Данные таблицы или сегменты следующие:

  • GDT (Таблица Глобального Дескриптора)
  • IDT (Таблица Дескриптора Прерывания)
  • LDT (Таблица Локального Дескриптора)
  • TSS (Сегмент Состояния Задачи)

Адреса данных таблиц и сегментов помещены в память специальных регистров, РЕГИСТРОВ СИСТЕМНОГО АДРЕСА и РЕГИСТРОВ СИСТЕМНОГО СЕГМЕНТА (см.рисунок ниже). Называются данные регистры соответственно GDTR, IDTR, LDTR, TR. Использование данных регистров описывается в главе «АРХИТЕКТУРА ЗАЩИЩЕННОГО РЕЖИМА».

GDTR и IDTR.
Эти регистры содержат 32-х битовый линейный базовый адрес и 16-и битовый предел таблицы глобального дескриптора и таблицы дескриптора прерывания соответственно.
Сегменты GDT и IDT, поскольку они глобальны для всех задач в системе, определяются 32-х битовыми линейными адресами (предмет для трансляции страниц если имеется возможность для подкачки) и 16-и битовыми значениями пределов.
LDTR и TR.
Эти регистры содержат 16-и битовые адреса сегментов для LDT и TSS. Сегменты LDT и TSS, поскольку они являются сегментами специфических задач, определяются адресом, помещенным в регистры системного сегмента. Обратите внимание, что регистр дескриптора сегмента (невидимый для программиста) соотносится с каждым регистром системного сегмента.
РЕГИСТРЫ ОТЛАДКИ И ТЕСТОВЫЕ РЕГИСТРЫ.
РЕГИСТРЫ ОТЛАДКИ: Шесть доступных для программиста регистров отладки обеспечивают поддержку (на кристалле) отладки. Регистр отладки CRO-3 классифицирует четыре линейных останова. DR6 используется для установки точек останова и Регистра Статуса Отладки DR7, а также отображает текущее состояние точек останова. Использование регистров отладки будет подробно описано далее в разделе «ПОДДЕРЖКА ОТЛАДКИ».

ТЕСТОВЫЕ РЕГИСТРЫ.
Два регистра микропроцессора используются для управления и тестирования RAM/CAM в буфере предыстории трансляции 80386. TR6-регистр тестирования команд, а TR7-регистр данных, который хранит результат тестирования буфера предыстории трансляции. Их использование также будет рассмотрено позже в разделе «ТЕСТИРУЕМОСТЬ».
ДОСТУПНОСТЬ РЕГИСТРОВ.
Имеются определенные различия в доступах к регистрам в РЕАЛЬНОМ и ЗАЩИЩЕННОМ режимах. В таблице суммированы все эти различия:

Регистры: Использование в реальном режиме Использование в защищенном режиме Использование в виртуальном режиме
загрузка память загрузка память загрузка память
Общие Да Да Да Да Да Да
Сегментные Да Да Да Да Да Да
EFLAGS Да Да Да Да I/O PL I/O PL
Управляющие Да Да PL = 0 PL = 0 Нет Да
GDTR Да Да PL = 0 Да Нет Да
IDTR Да Да PL = 0 Да Нет Да
LDTR Нет Нет PL = 0 Да Нет Нет
TR Нет Нет PL = 0 Да Нет Нет
Управление отладкой Да Да PL = 0 PL = 0 Нет Нет
Тестовые Да Да PL = 0 PL = 0 Нет Нет

Примечания:
PL = 0: Регистры могут использоваться только когда текущий уровень привелегий равен нулю.
I/O PL: команды PUSHF и POPF делают уровень привилегий I/O чувствительным в виртуальном режиме.

Для дальнейших деталей обратитесь к разделу «АРХИТЕКТУРА РЕАЛЬНОГО РЕЖИМА».
СОВМЕСТИМОСТЬ.
При изучении описания регистров следует обратить внимание на то, что некоторые биты регистров 80386 не определены. Когда вызываются неопределенные биты, обращайтесь с ними как с полностью неопределенными. Это необходимо для совместимости программного обеспечения с будущими моделями процессоров. Для этого следуйте следующим рекомендациям:

  1. При тестировании значений битов определенных регистров, избегайте зависимости от состояний неопределенных битов. Замаскируйте их при тестировании.
  2. Избегайте зависимости от состояний любого из неопределенных битов при помещении их в память или в другой регистр.
  3. Следет избегать зависимости от возможности содержать информацию, записанную в любом из неопределенных разрядов.
  4. При загрузке регистров всегда загружайте их как нули.
  5. Однако, регистры ранее помещенные, могут быть перезагружены без маскировки.

Зависимость от значений неопределенных разрядов регистров сделает Ваше программное обеспечение зависимым от непредусмотренной 80386 обработки данных битов, что подвергает вас риску несовместимости с будущими процессорами. ПОЭТОМУ ИЗБЕГАЙТЕ ЛЮБОЙ ЗАВИСИМОСТИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ОТ СОСТОЯНИЯ НЕОПРЕДЕЛЕННЫХ БИТОВ РЕГИСТРОВ МИКРОПРОЦЕССОРА INTEL 80386.

Специальные регистры назначения

 

* IP — указатель команды.

* Flags Register (Флаговый Регистр) — определяет текущее состояние процессора.

 

IP регистр всегда работает вместе с регистром сегмента СS, и это указывает в настоящее время выполнение команды.

Flags Register (Флаговый Регистр), автоматически изменяется микропроцессором после математических операций, это позволяет определять тип результата, и определить состояние передачи управление к другим частям программы.

Вообще, Вы не можете непосредственно обращаться к этим регистрам.

Арифметическо-логическое устройство — выполняет арифметические и логические операции под воздействием устройства управления.

Регистры общего назначения размерностью в один байт обозначаются B, C, D, E, H, L. Они используются для хранения данных и промежуточных результатов вычислений, выполняемых с помощью арифметическо-логического устройства.

Аккумулятор — специальный регистр, обозначаемый А. При выполнении арифметических и логических операций служит источником одного из операндов и местом запоминания результата выполнения операции.

Регистр команд — регистр, в котором хранится код выполняемой команды. Этот регистр непосредственно пользователю недоступен. Это означает, что не существует команды, которая бы явным образом могла изменить его содержимое. После выполнения очередной команды в регистр команд автоматически записывается код следующей команды из ячейки оперативной памяти, адрес которой содержится в счетчике команд.

Счетчик команд — двухбайтовый (шестнадцатиразрядный) регистр, обозначаемый РС. Этот регистр хранит адрес следующей команды, которая должна быть выполнена вслед за предыдущей. Счетчик команд автоматически получает приращение хранимого в нем адреса в зависимости от того, какую по длительности команду (в один, два или три байта) микропроцессор считывает из памяти, указывая всегда на 1-й байт следующей команды. На содержимое этого регистра пользователь может повлиять только с помощью команд, изменяющих последовательное выполнение программы (например, команд безусловного перехода), а также с помощью некоторых специальных команд.

Указатель стека — двухбайтовый (шестнадцатиразрядный) регистр, обозначаемый SР. Этот регистр хранит адрес вершины стека. Стеком называется специально ориентированная область памяти, используемая для временного хранения данных или адресов. Особенностью работы стека является то, что число, записанное в стек последним, извлекается из него первым. Используя стек, легко в программах организовывать переходы, вызов подпрограмм и выполнение прерываний работы микропроцессора.

Флаговый регистр представляет собой набор флагов. Каждый флаг предназначен для хранения одного признака результата выполнения операции.

Большинство арифметических и логических команд затрагивает регистр состояния процессора (или Flags)

Микропроцессор 8086 содержит флаговый регистр, состоящий из следующих флагов:

Поскольку Вы можете видеть, что имеются 16 битов в этом регистре, каждый бит называется flag (флажком) и может принимать значение 1 или 0.

 

Carry Flag (Флажок Переноса) (CF) — этот флажок установлен в 1, когда там — переполнение без знака. Например, когда Вы добавляете, что байты 255 + 1 (результат не в диапазоне 0 … 255). Когда не имеется никакого переполнения, этот флажок установлен в 0.

 

Zero Flag (Нулевой Флажок) (ZF) — этот флажок установлен в 1, когда результат нулевой. Для ни одного нулевой результат этот флажок не установлен в 0.

 

Sign Flag (Флажок Признака) (SF) — этот флажок установлен в 1, когда результат отрицательный. Когда результат положителен, что это установлено в 0. Фактически этот флажок берет значение наиболее существенного бита.

 

Overflow Flag (Флажок Переполнения) (ОF) — этот флажок установлен в 1, когда имеется переполнение числа со знаком. Например, когда вы добавляете, что байты 100 + 50 (результат не в диапазоне -128 … 127).

 

Parity Flag (Флажок Четности) (PF) — этот флажок установлен в 1, когда там – четное число битов в результате, и 0, когда имеется нечетное число битов. Даже если результат — слово, только 8 младших битов проанализированы!

 

Auxiliary Flag (Вспомогательный Флажок) (AF) — этот флажок установлен в 1, когда имеется переполнение без знака для младшего бита, тетраэда (4 бита).

 

Interrupt enable Flag (Прерывание допускает Флажок) (IF)— когда этот флажок установлен в 1 микропроцессора, реагирует на прерывания от внешних устройств.

 

Direction Flag (Флажок направления) (DF) — этот флажок используется некоторыми командами, чтобы обработать цепочки данных, когда этот флажок установлен в 0 — обработка сделана вперед, когда этот флажок установлен в 1, обработка сделана назад.

 

Флаги всегда устанавливаются или сбрасываются автоматически после выполнения очередной команды, влияющей на флаги, в зависимости от результата операции. При этом флаг считается установленным, если флаговый разряд принимает значение 1, и сброшенным, если значение разряда 0. Состояния флагов используются в командах условного перехода.

 

Лекция 38

2.1. Краткие теоретические сведения

Директивы Типа Файла Вывода:

#MAKE_COM#

#MAKE_BIN#

#MAKE_BOOT#

#MAKE_EXE#

Вы можете вставлять эти директивы в исходном тексте, чтобы определить требуемый тип вывода файла. Только, если компилятор не может находить любую из этих директив, это спросит Вас относительно типа вывода перед созданием файла.

Описание типа Файла Вывода:

#MAKE_COM# — самый старый и самый простой формат исполняемого файла, такие файлы загружены 100h приставкой (256 байтов). Выберите Clean от меню New, если Вы планируете собирать COM файл. Директива Компилятора ORG 100h должна быть добавлена перед кодом. Выполнение всегда начинается от первого байта файла.

Поддержанный DOS и командной строкой Windows.

 

#MAKE_EXE# — более расширенный формат исполняемого файла. Не ограниченный размером и числом сегментов. Сегмент Стека должна быть определена в программе. Вы можете выбирать Шаблон EXE от меню New в создать простую программу EXE с определенными данными, стеком, и сегментами кода.

Точка входа (запуски выполнения) определены программистом.

 

#MAKE_BIN# — простой исполняемый файл. Вы можете определять значения всех регистров, сегментов и смещения для области памяти, где этот файл будет загружен. При загрузке «MY.BIN» файл к эмулятору это будет искать «MY.BINF» файл, и загружать «MY.BIN» файл к местоположению, указанному в «MY.BINF» файле, регистры также установлены, используя информацию о том файле (открывают этот файл в текстовом редакторе, чтобы редактировать или исследовать).

В случае, если эмулятор не способен найти «MY.BINF» файл, используются текущие значения регистра, и «MY.BIN» файл загружен в потоке CS:IP.

Выполнение начинается от значений в CS:IP.

Этот тип файла уникален к Emu8086 эмулятору.

«.BINF файл автоматически создается компилятором, если находит директиву#MAKE_BIN#.

ПРЕДУПРЕЖДЕНИЕ! Любой существующий «.binf» файл записыватеся поверх!

#LOAD_SEGMENT=1234# #LOAD_OFFSET=0000# #AL=12# #AH=34# #BH=00# #BL=00# #CH=00# #CL=00# #DH=00# #DL=00# #DS=0000# #ES=0000# #SI=0000# #DI=0000# #BP=0000# #CS=1234# #IP=0000# #SS=0000#

#SP=0000#

Значения должны быть в HEX!

Когда не указаны эти значения, установлены по умолчанию:

LOAD_SEGMENT = 0100

LOAD_OFFSET = 0000

CS = ES = SS = DS = 0100

IP = 0000

 

Если LOAD_SEGMENT и LOAD_OFFSET не определены, то используются значения CSиIP и наоборот.

В случае, если значение загрузка смещения — не ноль (0000), ORG???? H должен быть добавлен к источнику a .BIN файл где???? Hсмещение загрузки, это должно быть сделано, чтобы позволить компилятор, вычисляют правильные адреса.

Обработка Ошибок

Компилятор сообщает об ошибках, в отдельном информационном окне:

MOV DS, 100 — является не корректной командой, потому что регистры сегментов не могут быть установлены непосредственно, должны использоваться регистры общего назначения:

MOV AX, 100
MOV DS, AX

MOV AL, 300 — является корректной командой, потому что регистр AL имеет только 8 битов, и таким образом максимальное значение для этого — 255 (или 11111111b), и минимум — -128.

 

Компилятор делает несколько проходов, перед созданием правильного машинного кода, и если находит ошибку и не завершает требуемый число, проходит, это может показывать неправильным сообщениям об ошибках. Например:

#make_COM#ORG 100h MOV AX, 0MOV CX, 5m1: INC AXLOOP m1 ; not a real error!MOV AL, 0FFFFh ; error is here. RET

Список полученных ошибок:

(7) Условие выходит из диапазона!: LOOP m1

(9) параметров Wrong: MOV AL, 0FFFFh

(9) Операнд не соответствует: Второй операнд — более чем 8 битов!

 

Первое сообщение об ошибке (7) неправильно, компилятор не закончил вычислять смещения для меток, так что это предполагает, что смещение метки m10000, тот адрес находится из диапазона, потому что мы запускаем в 100h — смещении.

Делайте исправление в этой строке: MOV AL, 0FFFFh (AL не может иметь значение 0FFFFh). Это устраняет обе ошибки! Например:

#make_COM#ORG 100h MOV AX, 0MOV CX, 5m1: INC AXLOOP m1 ; same code no error! MOV AL, 0FFh ; fixed!RET

 

Для экономии компилируемого файла, компилятор также сохраняет 2 других файла, которые используются для Эмулятора, чтобы показать фактическому источнику, когда Вы выполняете это, и выбор соответствующие линии.

* *. ~ asm — этот файл содержит первоначальный исходный текст, который использовался, чтобы делать исполняемый файл.

* *.debug — этот файл имеет информацию, которая допускает линиям выбора эмулятора первоначального исходного текста при выполнении машинного кода.

*.symbol — Таблица Символа, содержит информацию, которая допускает, чтобы показать окну » Variables». Это — текстовый файл, так что Вы можете рассматривать его в любом текстовом редакторе.

*.binf — этот файл содержит информацию, которая используется эмулятором, чтобы загрузить файл BIN в указанном местоположении, и устанавливать регистр, оценивает предшествующее выполнение; (создавал только, если выполнимый — файл BIN.

 

Лекция 39

Доступ к памяти

Цель работы: изучение основ программирования микропроцессора, исследование выполнения отдельных команд и простых программ, использование переменных, массивов, прерываний, различных методов адресации в программах, запись программ в память микроЭВМ и их выполнение.

2.1. Краткие теоретические сведения

Чтобы обращаться к памяти, мы можем использовать эти четырех регистра: BX, SI, DI, BP.

Объединяя эти регистры внутри символа[], мы можем получить различные местоположения памяти. Эти комбинации — поддерживаемые способы адресации:

[BX + SI] [BX + DI] [BP + SI] [BP + DI] [SI] [DI] d16 (variable offset only) [BX] [BX + SI] + d8 [BX + DI] + d8 [BP + SI] + d8 [BP + DI] + d8
[SI] + d8 [DI] + d8 [BP] + d8 [BX] + d8 [BX + SI] + d16 [BX + DI] + d16 [BP + SI] + d16 [BP + DI] + d16 [SI] + d16 [DI] + d16 [BP] + d16 [BX] + d16

D8 — остается для 8 разрядного смещения.

D16 — остается для 16 разрядного смещения.

 

Смещение может быть непосредственное значение или возмещенное переменной, или даже оба. Это — до компилятора, чтобы вычислить одиночное непосредственное значение.

Смещение может быть внутри или вне символа [], компилятор производят тот же самый машинный код для обоих путей.

Смещение — значение число со знаком, так что это может быть оба положительны или отрицательны.

Вообще компилятор заботится относительно различия между d8 и d16, и производит требуемый машинный код.

 

Например, давайте принимать что DS = 100, BX = 30, SI = 70.

Следующий способ адресации: [BX + SI] + 25

Рассчитанный процессором физический адрес: 100 * 16 + 30 + 70 + 25 = 1725.

 

По умолчанию DS регистр сегмента используется для всех режимов, кроме тех с регистром BP, поскольку этот регистр сегмента используется с SS.

Имеется простой способ помнить все те возможные комбинации, использующие эту диаграмму:

Вы можете формировать все допустимые комбинации, беря только один элемент от каждого столбца или пропуская столбец, не беря что-нибудь от этого. Поскольку Вы видите BX, и BP никогда не идут вместе. SI и DI также не идут вместе. Имеется пример допустимого способа адресации: [BX+5].

 

Значение в регистре сегмента (СS, DS, SS, ES) называется «сегментом», и значение в регистре цели (BX, SI, DI, BP) называется «смещением».

Когда DS содержит значение, и SI содержит значение, это может быть также зарегистрировано как 1234:7890. Физический адрес будет 1234h * 10h + 7890h = 19BD0h.

 

Чтобы говорить компилятор относительно типа данных, должны использоваться эти приставки:

BYTE PTR — для байта.

WORD PTR — для слова (два байта).

Например:

BYTE PTR [BX]; доступ байта.

Или

WORDPTR [BX]; доступ слова.

 

Emu8086 поддерживает более короткие приставки также:

b. — для BYTE PTR

w. — для WORD PTR

Иногда компилятор может вычислять тип данных автоматически, но Вы не можете и не должны полагаться на это, когда один из операндов — непосредственное значение.

 

MOV команда

* Копирует второй операнд (источник) к первому операнду (адресат).

* Исходный операнд может быть непосредственное значение, регистр общего назначения или местоположение памяти.

* Регистр адресата может быть регистр общего назначения, или местоположение памяти.

* Оба операнда должны быть тот же самый размер, который может быть байт или слово.

Эти типы операндов поддержаны:

MOV REG, memory
MOV memory, REG
MOV REG, REG
MOV memory, immediate
MOV REG, immediate

REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory (Память): [BX], [BX+SI+7], variable, etc…
immediate(Непосредственный): 5, -24, 3Fh, 10001101b, etc…

 

Поскольку сегментные регистры только эти типы MOV, поддержаны:

MOV SREG, memory
MOV memory, SREG
MOV REG, SREG
MOV SREG, REG

SREG: DS, ES, SS, and only as second operand: CS.
REG: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
memory: [BX], [BX+SI+7], variable, etc…

 

Команда MOV не может использоваться, чтобы установить значение РЕГИСТ IP и CS.

 

Создадим небольшую программу, которая демонстрирует использование команды MOV и работу с памятью:

#MAKE_COM# ; инструктируйте компилятор делать COM файл.

ORG 100h ; директива, требуемая для программы COM.

MOV АX, 0B800h ; набор АX в значению hexadecimal B800h.

MOV DS, АX ; копируйте значение АX в DS.

MOV CL, ‘A’ ; набор CL к коду ASCII ‘A’, это — 41h.

MOV CH, 01011111b ; набор CH к двоичному значению.

MOV BX, 15Eh ; набор в BX -15Eh.

MOV [BX], CX ; копируйте содержание CX в память B800:015E

RET ; возвращение в операционную систему

 

Окно Эмулятора должно открыться с этой загруженной программой, щелкаем по кнопке [Single Step] и наблюдаем значения регистра.

 

Если используется комментарии «;», то любые символы после «;» игнорируется компилятором.

Вы должны увидеть, когда программа закончится:

Фактически вышеупомянутая программа пишет непосредственно видеопамяти, так что Вы можете видеть, что MOV — очень мощная команда.

Переменные

Переменная — местоположение памяти. Для программиста намного более легкое иметь некоторое значение сохраняться в переменной, названной «var1» тогда в адресе 5A73:235B, особенно, когда Вы имеете 10 или большее количество переменных.

Наш компилятор поддерживает два типа переменных: BYTE и WORD.

 

Синтаксис для переменной декларации:

имя DB Значение

имя DW Значение

DB — остается для, определяютБайт.

DW — остается для, определяютСлово.

 

Имя — может быть любой символ или комбинация цифры, хотя это должно начаться с символа. Возможно объявить, что неназванные переменные, не определяя имя (эта переменная будут иметь адрес, но никакого имени).

Значение — может быть любое числовое значение в любой поддержанной системе нумерации (hexadecimal, двоичный, или десятичном числе), или «?» Символ для переменных, которые не инициализированы.

 

Поскольку Вы вероятно знаете от части 2 об этой обучающей программе, команда MOV используется, чтобы копировать значения от источника до адресата.

 

Давайте видеть другой пример с командой MOV:

#MAKE_COM#ORG 100hMOV AL, var1MOV BX, var2RET ; stops the program. VAR1 DB 7var2 DW 1234h

 

Копируйте вышеупомянутый код Emu8086 исходному редактору, и нажмите клавишу F5, чтобы собирать и загрузить это в эмуляторе. Вы должны получить кое-что вроде:

Поскольку Вы видите, что это смотрит много подобно нашему примеру, за исключением того, что переменные заменены фактическими местоположениями памяти. Когда компилятор делает машинный код, это автоматически заменяет все переменные имена их смещениями. По умолчанию сегмент загружена в регистре DS (когда COM файлы загружены, значение регистра DS установлено в то же самое значение как регистр CS — регистр кода).

 

В памяти перечисляют первую строку — смещение, вторая строка — значение hexadecimal, третья строка — десятичное значение, и последняя строка — значение символа ASCII.

 

Компилятор не зависим от регистра, так что «VAR1» и «var1» относятся к одной и той же переменной.

Смещение VAR10108h, и полный адрес — 0B56:0108.

Смещение var20109h, и полный адрес — 0B56:0109, эта переменная — WORD, так что это занимает 2 BYTES. Принимается, что низкий байт сохранен в более низком адресе, столь 34h расположен перед 12h.

 

Вы можете видеть, что имеются некоторые другие команды после команды RET, это случается, потому что disassembler понятия не имеет относительно того, где запуски данных, только обрабатывает значения в памяти, и это понимает их как допустимые команды 8086 (мы изучим их позже).

 

Вы можете даже написать ту же самую программу, используя DB директиву только:

#MAKE_COM#ORG 100hDB 0A0hDB 08hDB 01h DB 8BhDB 1EhDB 09hDB 01h DB 0C3h DB 7 DB 34hDB 12h

 

Копируйте вышеупомянутый код Emu8086 исходному редактору, и нажмите клавишу F5, чтобы собирать и загрузить это в эмуляторе. Вы должны получить тот же самый демонстрационный код, и те же самые функциональные возможности!

 

Поскольку Вы можете предполагать, компилятор только преобразовывает источник программы к набору байтов, этот набор называется, машинный код, процессор понимает машинный код и выполняет это.

 

ORG 100h — директива компилятора (это сообщает компилятору, как обработать исходный текст). Эта директива очень важна, когда Вы работаете с переменными. Сообщает компилятору, что исполняемый файл будет загружен в смещении 100h (256 байтов), так что компилятор должен вычислить правильный адрес для всех переменных, когда это заменяет переменные имена их смещениями. Директивы никогда не преобразованы к любому реальному машинному коду.

Почему исполняемый файл загружен в смещении 100h? Операционная система сохраняет некоторые данные относительно программы в первых 256 байтах CS(сегмент кода), типа параметров командной строки и т.д.

Хотя это истинно только для COM файлов, EXE файлы загружены в смещении 0000, и вообще используют специальный сегмент для переменных. Мы будем говорить относительно EXE файлов позже.

 

Лекция 40

Массивы

Массивы могут быть замечены как цепочки переменных. Текстовая строка — пример массива байта, каждый символ представлен как значение кода ASCII (0 .. 255).

 

Имеются некоторые примеры определения массива:

a DB 48h, 65h, 6Ch, 6Ch, 6Fh, 00h
b DB ‘Hello’, 0

B — точная копия массива, когда компилятор видит, что строка внутри указывает это, автоматически преобразовывает это, чтобы установить байтов. Эта диаграмма показывает части памяти, где эти массивы объявлены:

Вы можете обращаться к значению любого элемента в массиве, использующем квадратные скобки, например:

MOV AL, a[3]

 

Вы можете также использовать любой из индекса памяти, регистрирует BX, SI, DI, BP, например:

MOV SI, 3
MOV AL, a[SI]

 

Если Вы должны объявить большой массив, Вы можете использовать оператор DUP.

 

Синтаксис для DUP:

число DUP (значение (я))

число — число дубликата, чтобы делать (любое постоянное значение).

Значение — выражение, что DUP дублирует.

 

Например:

C DB 5 DUP (9)

Является альтернативным путем объявления:

C DB 9, 9, 9, 9, 9

 

Еще один пример:

D DB 5 DUP (1, 2)

Является альтернативным путем объявления:

D DB 1, 2, 1, 2, 1, 2, 1, 2, 1, 2

 

Конечно, Вы можете использовать DW вместо DB, если это требуется, чтобы сохранить значения большее тогда 255, или меньшее тогда -128. DW не может использоваться, чтобы объявить строки!

Расширение DUP операнда не должно быть более чем 1020 символов! (Расширение последнего примера — 13 случайных работ), если Вы должны объявить, что огромный массив делит декларацию это на двух линиях (Вы получите одиночный огромный массив в памяти).

 


Узнать еще:

flag – Multitran dictionary

EnglishRussian
acknowledged run flagиндикатор подтверждения
alarm flagсигнальный флажок (отказа прибора)
auxiliary flagвспомогательный флаг переноса
black flagэкран для регулировки освещённости
black flagчёрный затенитель
burst flagимпульс сигнала цветовой синхронизации
carry flagфлаг переноса
carry flagпризнак переноса
color framing flagбит кадровой цветовой синхронизации (временного кода)
composite display flagфлаг составного воспроизведения (ssn)
covering flagперекрывающая плита (литейной формы)
done flagфлаг готовности
done flagфлаг выполнения
error flagпоказание ошибки
error flagпризнак ошибки
event flagпризнак наступления события
event flagфлаг события
event flagпризнак события (наступления)
flagразделитель кадров
flagфлаговые разряды
flagсигнализировать
flagмостить плитняком
flagмостить камнем (естественный камень)
flagплитняк (естественный камень)
flagограничитель кадра (в протоколах передачи данных)
flagкозырёк
flag bitпризнаковый разряд
flag bitфлаговый бит
flag bitфлажок-признак
flag bitразряд признака
flag buoyбуй с флагом
flag carrierглавный перевозчик (в регионе)
flag checkфлаговый контроль
flag checkконтроль по флаговым разрядам
flag codeфлаговый код
flag communications officerфлагманский связист флота
flag connectorфлажковый разъём (translator911)
flag control wordслово флагового управления
flag deckсигнальный мостик
flag fieldполе признака
flag halyardсигнальный фал
flag indicatorбленкерный сигнализатор
flag indicatorуказатель срабатывания (реле)
flag oreоолитовая руда
flag registerфлаговый регистр
flag registerрегистр признака
flag register processingобработка данных флагового регистра
flag signalсигнал признака
flag staffфлагшток
flag switchфлажковый выключатель
flag terminalфлажковый наконечник
half-carry flagфлаг полупереноса
interrupt flagфлаг прерывания
mechanical flag switchфлажковый выключатель
metal flagметаллический флажок
new data flagфлаг новых данных
overflow flagфлаг переполнения
processor flagsфлаги процессора
ready flagфлаг готовности
ready flagпризнак готовности
skip flagпризнак пропуска
status flagфлаг состояния (для удобства работы флаги в зависимости от их количества располагают вместе в байте (status byte) или слове (status word) состояния ssn)
status flagпризнак состояния
switching flagвыключатель «флажок» (alheinrich)
type-bar flag codeконтрольный код на литерном рычаге (пишущей машины)
warning flag movement systemфлажковая система предупреждения об отказе
zero flagпризнак нуля
zero flagнулевой флаг

Ollydbg watch / условное выражение точки останова для флаговых регистров?



Поэтому я недавно обращал вспять часть вредоносного ПО и решил, что могу использовать условную точку останова, которая будет ломаться всякий раз, когда нулевой флаг будет установлен для конкретной команды jz. Я прочитал документацию в интернете и в файле справки, который предоставляет Олли, но не могу найти никаких примеров того, как я это сделаю. В онлайн-документации говорится, что регистры EFL или Flags могут использоваться в выражении watch/conditional breakpoint, но нет упоминания о том, как на них ссылаться. Я попробовал простое выражение, такое как ZF == 1, а также ZF = 1 (на всякий случай, если я ошибся), и оно не сработало. Я искал в google, как сумасшедший, и ничего, поэтому я надеюсь, что кто-то там нашел какой-то способ ссылаться на регистр флагов. Для тех из вас, кто задается вопросом, почему я просто не использую выражение без регистра флагов, мне больше любопытно, как ссылаться на регистр флагов в том случае, если он мне действительно нужен.

Заранее спасибо!

reverse-engineering ollydbg
Поделиться Источник John     10 августа 2016 в 00:22

1 ответ


  • Linux kernel аппаратные точки останова

    Я хочу построить простой отладчик linux kernel для архитектуры x86. Сначала я хочу, чтобы он установил точки останова. Мне было интересно, есть ли kernel api для настройки регистров отладчика и если да, то какая-нибудь хорошая документация? Если нет kernel api для регистров отладчика, есть ли…

  • Как gdb найти значение всех регистров из всех фреймов в стеке

    Во время отладки путем добавления точки останова кадры стека можно увидеть, запустив bt. При выборе кадра путем запуска информационных регистров можно увидеть значения регистров на конкретном кадре. Например, рассмотрим точки останова, установленные на 5-м кадре. при попадании точки останова,…



2

AFAIK вы не можете сломать конкретное имя флага для EFLAGS, но вы можете получить значение из EFLAGS, так что у вас все еще есть несколько возможностей оттуда:

примечание: протестировано на Ollydbg v2.01

1) Остановитесь на всем значении EFLAGS (обратите внимание, что значение регистра EFLAGS для условного синтаксиса ollydbg равно EFL или FLAGS ).

EFL==0x246

2) перерыв на определенном флаге

  • Вам нужно знать положение флага , например, ZF-это бит 6 (начните отсчет с 0).
  • Либо используйте позицию бита в качестве маски:

    пример с ZF (бит 6, установленный в 1, равен 0x40): (EFL & 0x40)==0x40

  • Сдвиньте флаги по их положению, замаскируйте их только и проверьте их:

    пример с ZF (бит 6): (EFL >> 6) & 1==1

Поделиться Neitsa     13 августа 2016 в 10:56


Похожие вопросы:


Аппаратные точки останова на ARM

Как работают аппаратные точки останова на процессорах ARM? Я вижу, что на x86 и x64 есть 6 регистров DEBUG, DR0 через DR7. Может ли кто-нибудь указать мне на ресурсы, подобные этому , но для ARM?


Состояние Ollydbg

Мне нужно, чтобы Ollydbg делал паузу, когда один из регистров содержит определенную строку. Любым способом я могу это сделать?


Остановить выполнение Ollydbg (точка останова) при входе в определенный модуль?

У меня есть файл EXE в OllyDbg, который использует DLL. Я нашел возможность остановить выполнение EXE при загрузке DLL, но теперь я хотел бы поставить точку останова каждый раз, когда выполнение…


Linux kernel аппаратные точки останова

Я хочу построить простой отладчик linux kernel для архитектуры x86. Сначала я хочу, чтобы он установил точки останова. Мне было интересно, есть ли kernel api для настройки регистров отладчика и если…


Как gdb найти значение всех регистров из всех фреймов в стеке

Во время отладки путем добавления точки останова кадры стека можно увидеть, запустив bt. При выборе кадра путем запуска информационных регистров можно увидеть значения регистров на конкретном кадре….


Как отладчик устанавливает точки останова, если изображение находится в памяти только для чтения?

Как отладчик устанавливает точки останова, если изображение находится в памяти только для чтения? Я знаю, что существуют аппаратные точки останова, но в отладчике, который я использую (OllyDbg), они…


Как я могу установить точку останова для нажатия кнопки с помощью ollydbg?

Как я могу установить точку останова для нажатия кнопки с помощью ollydbg? я пытаюсь отключить нажатие кнопки на игровом клиенте,поэтому я хочу установить точку останова, чтобы поймать событие…


Решения или обходные пути для замедления условной точки останова Visual Studio

Я использую условную точку останова, чтобы определить, когда переменная C# DateTime больше определенного времени. Эта точка останова будет проверена примерно 50 000 раз за один запуск. моя условная…


Как работают точки останова на встроенном устройстве?

Это просто вопрос для личного интереса. Я знаю, что мой JTAG способен считывать значения регистров uController. Но я понятия не имею, как устройство JTAG знает, когда остановить uController. Я…


Как использовать Environment.StackTrace в условном выражении для точки останова в VS2015

Я пытаюсь отладить проблему, и это действительно помогло бы, если бы у меня была точка останова в getter свойства, но мне не нужно прерываться каждый раз, когда он вызывается из вызова CanExecute…

Регистр флагов микропроцессора 8086

Предварительное условие — Регистр флагов микропроцессора 8085
Регистр флагов является регистром специального назначения. В зависимости от значения результата после любой арифметической и логической операции биты флага устанавливаются (1) или сбрасываются (0).


Рисунок — Формат регистра флагов
Всего в 8086 9 флагов, и регистр флагов делится на два типа:

(a) Флаги состояния — В микропроцессоре 8086 есть 6 регистров флагов, которые устанавливаются (1) или сбросить (0) в зависимости от условия после 8-битной или 16-битной операции.Эти флаги являются условными флагами / флагами состояния. 5 из этих флагов такие же, как и в микропроцессоре 8085, и их работа такая же, как и в микропроцессоре 8085. Шестой — флаг переполнения.

Шесть флагов состояния:

  1. Флаг подписи (S)
  2. Флаг нулевого значения (Z)
  3. Вспомогательный флаг Кэри (AC)
  4. Флаг четности (P)
  5. Carry Флаг (CY)
    Эти первые пять флагов определены здесь
  6. Флаг переполнения (O) — Этот флаг будет установлен (1), если результат подписанной операции слишком велик, чтобы соответствовать количеству битов, доступных для представляют его, иначе сбросить (0).После любой операции, если D [6] генерирует любой перенос и переходит в D [7] ИЛИ, если D [6] не генерирует перенос, но генерирует D [7], устанавливается флаг переполнения, т. Е. 1. Если D [6] и D [7] оба генерируют перенос или оба не генерируют никакого переноса, тогда флаг переполнения сбрасывается, т.е. 0.

    Пример: При добавлении байтов 100 + 50 (результат не в диапазоне -128… 127), поэтому будет установлен флаг переполнения.


    MOV AL, 50 (50 - 01010000, что положительно)
    MOV BL, 32 (32 - 00110010, что положительно)
    ДОБАВИТЬ AL, BL (82 - это 10000010, что отрицательно)
     

    Флаг переполнения стал установлен, когда мы добавили 2 + ve чисел и получили число -ve.

(b) Контрольные флаги — Контрольные флаги разрешают или запрещают определенные операции микропроцессора. В микропроцессоре 8086 есть 3 управляющих флага, а именно:

  1. Флаг направления (D) — Этот флаг специально используется в строковых инструкциях.
    Если установлен флаг направления (1), то доступ к строковым данным осуществляется из более высокой ячейки памяти в более низкую.
    Если флаг направления сброшен (0), то доступ к строковым данным осуществляется из нижней ячейки памяти в верхнюю.
  2. Флаг прерывания (I) — Этот флаг предназначен для прерываний.
    Если установлен флаг прерывания (1), микропроцессор распознает запросы прерывания от периферийных устройств.
    Если флаг прерывания сброшен (0), микропроцессор не распознает никакие запросы прерывания и проигнорирует их.
  3. Флаг прерывания (T) — Этот флаг используется для отладки на кристалле. Установка флага ловушки переводит микропроцессор в пошаговый режим для отладки. В пошаговом режиме микропроцессор выполняет инструкцию и входит в пошаговую ISR.
    Если установлен флаг прерывания (1), ЦП автоматически генерирует внутреннее прерывание после каждой инструкции, позволяя проверять программу, когда она выполняет инструкцию за инструкцией.
    Если флаг прерывания сброшен (0), никакая функция не выполняется.

Вниманию читателя! Не прекращайте учиться сейчас. Получите все важные концепции теории CS для собеседований SDE с помощью курса CS Theory Course по приемлемой для студентов цене и станьте готовым к работе в отрасли.

Intel x86 Assembly Language & Microarchitecture Tutorial => Flags…

Пример

Когда арифметико-логический блок x86 (ALU) выполняет такие операции, как НЕ и ADD , он отмечает результаты этих операций («стал нулевым», «переполнен», «стал отрицательным») в специальном 16-битном ФЛАГИ регистр. 32-разрядные процессоры обновили это значение до 32 бит и назвали его EFLAGS , в то время как 64-разрядные процессоры обновили его до 64 бит и назвали его RFLAGS .

Коды состояния

Но независимо от имени, регистр не доступен напрямую (за исключением пары инструкций — см. Ниже).Вместо этого отдельные флаги упоминаются в определенных инструкциях, таких как условный переход или условный набор, известные как Jcc и SETcc , где cc означает «код условия» и ссылается на следующую таблицу:

N N 90 OF122 Без переполнения
Код состояния Имя Определение
E , Z Равно, ноль ZF == 1 Не равно, не ноль ZF == 0
O Переполнение OF == 1
NO 0
S Подпись SF == 1
NS Без подписи SF == 0
P PF == 1
NP Без четности PF == 0
-------------- ---- ----------
C , B , NAE Перенести, ниже, не выше или равно CF == 1
NC , NB , AE Без переноса, не ниже, выше или равно CF == 0
A , NBE Abo Ниже или равно CF == 0 и ZF == 0
NA , BE Не выше, ниже или равно CF == 1 или ZF = = 1
--------------- ---- ----------
GE , NL Больше или равно, не меньше SF == OF
NGE , L Не больше или Равно, меньше SF ! = OF
G , NLE Больше, не меньше или равно ZF == 0 и SF == OF
NG , LE Не больше, меньше или равно ZF == 1 или SF ! = OF

В 16 битах, вычитая 1 из 0 - это либо 65 535 , либо -1 в зависимости от того, используется ли арифметика без знака или со знаком, но адресат в любом случае содержит 0xFFFF .Значение становится ясным только при интерпретации кодов условий. Еще более показательно, если 1 вычесть из 0x8000 : в беззнаковой арифметике это просто изменит 32 768 на 32 767 ; в то время как в знаковой арифметике он изменяет -32 768 на 32 767 - гораздо более примечательное переполнение!

Коды условий сгруппированы в три блока в таблице: беззнаковый, беззнаковый и подписанный. Именование внутри последних двух блоков использует «Сверху» и «Ниже» для неподписанных и «Больше» или «Меньше» для подписанных.Таким образом, JB будет «Перейти, если ниже» (без знака), а JL будет «Перейти, если меньше» (подписано).

Доступ к

ФЛАГАМ напрямую

Приведенные выше коды условий полезны для интерпретации предопределенных концепций, но фактические биты флагов также доступны напрямую с помощью следующих двух инструкций:

  • LAHF Загрузить регистр AH с помощью флагов
  • SAHF Сохранение регистра AH во флагах

С помощью этих инструкций копируются только определенные флаги.Весь регистр FLAGS / EFLAGS / RFLAGS может быть сохранен или восстановлен в стеке:

  • PUSHF / POPF Push / pop 16-bit FLAGS в / из стека
  • PUSHFD / POPFD Push / pop 32-бит EFLAGS в стек / из стека
  • PUSHFQ / POPFQ Push / pop 64-bit RFLAGS в / из стека

Обратите внимание, что прерывания автоматически сохраняют и восстанавливают текущий регистр [R / E] FLAGS .

Другие флаги

Помимо флагов ALU, описанных выше, регистр FLAGS определяет другие флаги состояния системы:

  • IF Флаг прерывания.
    Это устанавливается с помощью инструкции STI для глобального разрешения прерываний и сбрасывается с помощью инструкции CLI для глобального отключения прерываний.
  • DF Флаг направления.
    Операции «память-память», такие как CMPS и MOVS (для сравнения и перемещения между ячейками памяти), автоматически увеличивают или уменьшают индексные регистры как часть инструкции.Флаг DF определяет, какой из них происходит: если он сброшен с помощью инструкции CLD , они увеличиваются; если установлено с помощью инструкции STD , они уменьшаются.
  • TF Флаг ловушки. Это флаг отладки. Его установка переведет процессор в «пошаговый» режим: после выполнения каждой инструкции он вызовет «Обработчик одношагового прерывания», который, как ожидается, будет обрабатываться отладчиком. Нет инструкций по установке или сбросу этого флага: вам нужно манипулировать битом, пока он находится в памяти.

80286 Флаги

Для поддержки новых возможностей многозадачности в 80286 Intel добавила дополнительные флаги в регистр FLAGS :

  • IOPL Уровень привилегий ввода-вывода.
    Чтобы защитить многозадачный код, некоторым задачам требовались привилегии для доступа к портам ввода-вывода, в то время как другим приходилось блокировать доступ к ним. Intel представила четырехуровневую шкалу привилегий: 00 2 является наиболее привилегированной, а 11 2 - наименьшей.Если значение IOPL было меньше текущего уровня привилегий, любая попытка получить доступ к портам ввода-вывода или включить или отключить прерывания вместо этого вызовет ошибку общей защиты.
  • NT Флаг вложенной задачи.
    Этот флаг был установлен, если одна Задача CALL редактировала другую Задачу, что вызвало переключение контекста. Флаг установки сказал процессору выполнить переключение контекста обратно при выполнении RET .

80386 Флаги

'386 потребовались дополнительные флаги для поддержки дополнительных функций, встроенных в процессор.

  • РФ Флаг резюме.
    В `386 добавлены регистры отладки, которые могут вызывать отладчик при различных аппаратных доступах, таких как чтение, запись или выполнение определенного места в памяти. Однако, когда обработчик отладки возвращается для выполнения инструкции , доступ немедленно повторно вызывает обработчик отладки! Или, по крайней мере, было бы, если бы не флаг возобновления, который автоматически устанавливается при входе в обработчик отладки и автоматически сбрасывается после каждой инструкции.Если установлен флаг возобновления, обработчик отладки не вызывается.
  • VM Виртуальный флаг 8086.
    Для поддержки старого 16-битного кода, а также нового 32-битного кода, 80386 может запускать 16-битные задачи в режиме «Virtual 8086» с помощью виртуального исполнителя 8086. Флаг VM указывает, что эта задача была виртуальной задачей 8086.

80486 Флаги

По мере совершенствования архитектуры Intel она становилась быстрее за счет таких технологий, как кэширование и суперскалярное выполнение.Это должно было оптимизировать доступ к системе, делая предположения. Чтобы контролировать эти предположения, требовалось больше флагов:

  • AC Флаг проверки выравнивания Архитектура x86 всегда могла получить доступ к многобайтовым значениям памяти на любой границе байта, в отличие от некоторых архитектур, которые требовали, чтобы они были выровнены по размеру (4-байтовые значения должны быть на 4-байтовых границах). Однако это было менее эффективно, поскольку для доступа к невыровненным данным требовалось несколько обращений к памяти. Если установлен флаг AC , то невыровненный доступ вызовет исключение, а не выполнит код.Таким образом, код может быть улучшен во время разработки с помощью набора AC , но отключен для производственного кода.

Флаги Pentium

Pentium добавил дополнительную поддержку виртуализации, а также поддержку инструкции CPUID :

  • VIF Флаг виртуального прерывания.
    Это виртуальная копия IF этой Задачи - независимо от того, хочет ли эта Задача отключать прерывания, не влияя на глобальные прерывания.
  • VIP Флаг ожидания виртуального прерывания.
    Это указывает на то, что прерывание было фактически заблокировано VIF , поэтому, когда Задача выполняет STI , для него может быть создано виртуальное прерывание.
  • ID Флаг CPUID -allowed.
    Разрешить или нет этой Задаче выполнять инструкцию CPUID . Виртуальный монитор может запретить это и «солгать» запрашивающей Задаче, если она выполняет инструкцию.



80386 Справочное руководство программиста - раздел 2.3

2.3.3 Реализация стека

Операции со стеком упрощаются с помощью трех регистров:
  1. Регистр сегмента стека (SS). Стеки реализованы в памяти. А в системе может быть количество стеков, которое ограничено только максимальным количество сегментов. Стек может быть до 4 гигабайт, максимум длина отрезка.Один стек имеет прямую адресацию в - один расположен у SS. Это текущий стек, который часто называют просто как «стек». SS используется процессором автоматически для всех стековые операции.
  2. Регистр указателя стека (ESP). ESP указывает на вершину выдвижной стек (TOS). На него неявно ссылаются PUSH и POP операции, вызовы и возврат подпрограмм, а также операции прерывания. Когда элемент помещается в стек (см. Рисунок 2-7 ), процессор уменьшает ESP, затем записывает элемент в новые TOS.Когда товар выскочил из стека, процессор копирует его из TOS, затем увеличивает ESP. Другими словами, стек в памяти увеличивается в сторону меньшие адреса.
  3. Регистр базового указателя кадра стека (EBP). EBP - лучший выбор регистра для доступа к структурам данных, переменным и динамически выделяемое рабочее пространство в стеке. EBP часто используется для доступа к элементам в стеке относительно фиксированной точки в стеке а не относительно текущих TOS. Обычно он определяет базовый адрес текущего кадра стека, установленный для текущего процедура.Когда EBP используется как базовый регистр в смещении расчет, смещение рассчитывается автоматически в текущем сегмент стека (т. е. сегмент, выбранный в настоящий момент SS). Потому что SS не обязательно указывать явно, кодировка инструкций в такие случаи более эффективны. EBP также можно использовать для индексации сегменты, адресуемые через другие регистры сегментов.

2.3.4 Регистр флагов

Регистр флагов - это 32-битный регистр с именем EFLAGS. Рисунок 2-8 определяет биты в этом регистре.Флаги контролируют определенные операции и указать статус 80386.

16 младших битов EFLAGS называются FLAGS и могут рассматриваться как Ед. изм. Эта функция полезна при выполнении кода 8086 и 80286, потому что эта часть EFLAGS идентична регистру FLAGS 8086 и 80286.

Флаги можно разделить на три группы: флаги состояния, управляющие flags и системные флаги. Обсуждение системных флагов затягивается до части II.

2.3.4.1 Флаги состояния

Флаги состояния регистра EFLAGS позволяют получить результаты одного инструкция, чтобы повлиять на последующие инструкции. В арифметических инструкциях используется OF, SF, ZF, AF, PF и CF. SCAS (строка сканирования), CMPS (строка сравнения), и инструкции LOOP используют ZF, чтобы сигнализировать, что их операции завершены. Есть инструкции по установке, очистке и дополнению CF перед выполнением инструкция по арифметике. См. Приложение C для определения каждого флаг состояния.

2.3.4.2 Контрольный флаг

Флаг управления DF регистра EFLAGS управляет строковыми инструкциями.DF (Флаг направления, бит 10) Установка DF заставляет строковые инструкции автоматически уменьшаться; то есть, чтобы обрабатывать строки от старших адресов к младшим адресам. Устранение причин DF строковые инструкции для автоматического увеличения или для обработки строк с младшего обращается по высоким адресам.

2.3.4.3 Указатель инструкции

Регистр указателя команд (EIP) содержит адрес смещения, относительно начала текущего сегмента кода следующего последовательного инструкция к исполнению. Указатель инструкции не виден напрямую программисту; неявно управляется передачей управления инструкции, прерывания и исключения.

В качестве Рисунок 2-9 показывает, что младшие 16 бит EIP называются IP и могут быть используется процессором как единое целое. Эта функция полезна при выполнении инструкции, предназначенные для процессоров 8086 и 80286.


вверх: Глава 2 - Модель базового программирования
предыдущая: 2.2 Типы данных
следующая: 2.4 Формат команд

Руководства по AVR - Регистр состояния

До сих пор мы видели ссылки на регистр состояния несколько раз в этих руководствах - сначала при ссылке на биты переноса для таких инструкций, как adc и rol, а затем с инструкцией ветвления brne.Наконец, пришло время изучить детали этого чрезвычайно важного реестра.

Регистр состояния - это 8-битный регистр в области памяти ввода-вывода микроконтроллера. Он содержит 8 флагов , которые обновляются на основе результатов предыдущей инструкции.

Регистр состояния

Бит 7 6 5 4 3 2 1 0
Флаг I Т H S В N Z С

Представление 8 бит в регистре состояния:

  • Бит 0: флаг переноса
  • Бит 1: нулевой флаг
  • Бит 2: отрицательный флаг
  • Бит 3: Флаг переполнения дополнения до двух
  • Бит 4: бит знака
  • Бит 5: флаг полупереноса
  • Бит 6: Хранилище битовых копий
  • Бит 7: Разрешение глобального прерывания

Работа и использование каждого бита поясняются ниже.

Флаг переноса (C)

Флаг переноса будет установлен, если перенос произошел в арифметической или логической операции. Например

  ldi r16,0xFF; загрузить r16 с помощью 0xFF
ldi r17,0xFF; загрузить r17 с помощью 0xFF
добавить r16, r17; переносить будет установлен  

Поскольку сумма 0xFF и 0xFF больше, чем может содержать 8-битный регистр, старший бит суммы сдвигается в флаг переноса регистра состояния.

В качестве альтернативы следующее не установит флаг переноса.

  ldi r16,0x01; загрузить r16 с помощью 0x01
        ldi r17,0x02; загрузить r17 с помощью 0x02
        добавить r16, r17; переносить не будет  

То же самое касается смен . Например, следующий логический сдвиг на влево на установит флаг переноса, так как самый старший бит операнда - 1

  ldi r16,0b10000000; загрузить 0b10000000 в r16
lsl r16; переносить будет установлен  

Но этого не произойдет, поскольку самый старший бит операнда - 0

  ldi r16,0b00000000; загрузить 0b00000000 в r16
        lsl r16; переносить не будет  

Нулевой флаг (Z)

Нулевой флаг будет установлен, если предыдущая операция привела к результату нулевой .Например

  ldi r16,0x03; загрузить r16 с помощью 0x01
dec r16; нулевой флаг не установлен (r16 = 0x02)
dec r16; нулевой флаг не установлен (r16 = 0x01)
dec r16; установлен нулевой флаг (r16 = 0x00)  

Отрицательный флаг (N)

Флаг отрицательного результата устанавливается всякий раз, когда установлен бит 7 предыдущей операции (т.е. результат отрицательный)

  ldi r16,1; загрузить r16 с помощью 0x01
sbi r16,2; установлен отрицательный флаг (результат = -1 или 255)  

Обратите внимание, что в ассемблере действительно нет типов данных - регистр просто имеет последовательность битов, которую вы можете интерпретировать как угодно.Отрицательный флаг может быть установлен для числа, которое вы не рассматриваете как подписанное.

В сборке нет типов данных. Отрицательный флаг не означает, что значение в регистре подписано - только то, что это будет отрицательное число, если вы будете рассматривать его как таковое.

Флаг переполнения двойного дополнения (V)

Флаг переноса отлично подходит, когда мы работаем с 8-битными значениями без знака, которые могут изменяться от 0 до 255, но как насчет значений со знаком , которые выходят за пределы от -128 до 127?

В этом случае у нас есть Флаг переполнения двух дополнений , который будет установлен, когда результат операции слишком велик, чтобы поместиться в 7-битное число.

  ldi r16, -128; загрузить r16 с -128
dec r16; набор переполнения дополнения до двух

ldi r17,127; загрузить r17 с 127
inc r17; набор переполнения с дополнением до двух  

Снова обратите внимание, что мы решаем, подписано значение или нет, а не микроконтроллер. Флаг переполнения двух дополнений можно игнорировать, если он нам не нужен.

Знак Флаг (S)

Флаг знака - это дополнительный логический бит, который можно использовать для определения положительного или отрицательного результата предыдущей операции.Это просто исключающее ИЛИ флагов переполнения отрицательного и двойного дополнения. Он будет установлен, если установлен один или другой, но , а не оба.

Вычтите 10 из -120. Очевидно, что результат -130, но если мы попробуем это

  ldi r16,0x88; загрузить r16 с помощью 0x88 (-120)
ldi r17,0x0A; загрузить r17 с 0x0A (10)
sub r16, r17; вычесть r17 из r16 (результат = 0x7E = 126)
  

Результат не равен -130, поскольку это значение слишком велико для 8-битового числа со знаком.После подкоманды Negative Flag не будет установлен, так как бит 7 результата очищен. Однако будет установлен флаг Sign Flag , правильно указывающий, что результат должен быть отрицательным.

Рассмотрим сложение вместо

  ldi r16,0x78; загрузить r16 с помощью 0x78 (120)
ldi r17,0x0A; загрузить r17 с 0x0A (10)
добавить r16, r17; добавить r17 к r16 (результат = 0x82 = 130)
  

Здесь будет установлен отрицательный флаг , даже если результат явно положительный.Однако, поскольку произошло переполнение до двух, флаг Sign Flag будет установлен как , а не , что правильно указывает на положительный результат.

Использование флага «Знак» может дать вам лучшее представление о положительном или отрицательном результате. Это очень полезно при создании альтернативных ветвей для обработки случаев, подобных показанным выше.

Флаг полуперти (H)

Флаг Half Carry Flag устанавливается, когда происходит переполнение между младшими и старшими 4-мя битами регистра.

  ldi r16,0x0F; загрузить r16 с помощью 0x0F
inc r16; инкремент r16 (половинный набор переноса)  

Половинный перенос наиболее полезен при работе с двоичными кодированными цифрами , где две цифры хранятся в верхних и нижних полубайтах (4 бита) регистра.

Хранение битовых копий (T)

Хранилище битовых копий , также известное как флаг T , на самом деле не устанавливается никакими арифметическими или логическими операциями. Вместо этого вы можете установить и очистить в зависимости от того, как вы считаете нужным, используя инструкции set и clt .

  комплект; установить флаг T
clt; очистить флаг T  

T-флаг - отличный способ указать успех или неудачу после пользовательской подпрограммы.

Разрешение глобального прерывания (I)

Если вы когда-либо работали с прерываниями в C, вы должны быть знакомы с флагом Global Interrupt Enable . Установив этот флаг, в системе будут разрешены прерывания. При его очистке прерывания не нарушают выполнение программы. В C вы использовали специальные функции для установки и сброса флага глобального прерывания, sei () и cli () .В сборке AVR то же самое делается с помощью инструкций sei и cli.

  sei; разрешить прерывания
cli; отключить прерывания  

Установка и сброс флагов вручную

Так же, как инструкции sei, cli, set и clt, которые мы уже видели, существуют соответствующие инструкции для каждого из других флагов, показанных в таблице ниже.

Мнемоника Описание
clc флаг сброса
clh прозрачный полупрозрачный флаг
cli очистить глобальный флаг разрешения прерывания
cln сбросить отрицательный флаг
cls четкий подписанный флаг
clt прозрачный Т-образный флаг
clv сбросить флаг переполнения
clz флаг сброса нуля
сек установить флаг переноса
seh установить флажок половинного переноса
sei установить глобальный флаг разрешения прерывания
сен установить отрицательный флаг
ses установить подписанный флаг
комплект установить флажок T
сев. установить флаг переполнения
sez установить нулевой флаг

Инструкции по очистке и установке флагов легко запомнить - это просто буквы cl или se, за которыми следует флаг, с которым вы работаете.

Заключение

Надеюсь, теперь вы понимаете функцию регистра состояния и то, как на него влияют инструкции. Ранее мы видели, как регистр состояния используется с арифметикой с высокой точностью (например, добавлением двух 16-разрядных чисел), но теперь мы увидим еще более полезную функцию с условным переходом .

Регистр состояния

- обзор

3.5 ИНСТРУКЦИИ ДЛЯ РЕГИСТРА СОСТОЯНИЯ ПРОГРАММЫ

Набор инструкций ARM предоставляет две инструкции для непосредственного управления регистром состояния программы ( psr ).Инструкция MRS передает содержимое либо cpsr , либо spsr в регистр; в обратном направлении инструкция MSR передает содержимое регистра в cpsr, или spsr. Вместе эти инструкции используются для чтения и записи cpsr, и spsr.

В синтаксисе вы можете увидеть метку под названием полей. Это может быть любая комбинация элемента управления ( c ), расширения ( x ), статуса ( s ) и флагов ( f ).Эти поля относятся к конкретным байтовым областям в psr , как показано на рисунке 3.9.

Рисунок 3.9. psr байтовых полей.

MRS копировать регистр состояния программы в регистр общего назначения Rd = psr
MSR перемещать регистр общего назначения в регистр состояния программы field] = Rm
MSR переместить немедленное значение в регистр состояния программы psr [поле] = немедленно

Поле crupt управляет маской прерывания. Состояние большого пальца и режим процессора.В примере 3.26 показано, как разрешить прерывания IRQ путем очистки маски I . Эта операция включает использование инструкций MRS и MSR для чтения и записи в cpsr.

ПРИМЕР 3.26

MSR сначала копирует cpsr в регистр r1 . Инструкция BIC очищает бит 7 из r1 . Регистр r1 затем копируется обратно в cpsr , что разрешает прерывания IRQ. Из этого примера видно, что этот код сохраняет все остальные настройки в cpsr и изменяет только бит I в поле управления.

Этот пример находится в режиме SVC . В пользовательском режиме вы можете прочитать все cpsr бит, но вы можете только обновить поле флага условия f.

3.5.1 ИНСТРУКЦИИ КОПРОЦЕССОРА

Команды сопроцессора используются для расширения набора команд. Сопроцессор может либо предоставлять дополнительные вычислительные возможности, либо использоваться для управления подсистемой памяти, включая кеши и управление памятью. Команды сопроцессора включают в себя инструкции по обработке данных, передаче регистров и передаче из памяти.Мы дадим только краткий обзор, поскольку эти инструкции относятся к конкретному сопроцессору. Обратите внимание, что эти инструкции используются только ядрами с сопроцессором.

LDC загрузка памяти STC - загрузка сопроцессора LDC STC и сохранять блоки памяти в / из сопроцессора
CDP обработка данных сопроцессора - выполнение операции в сопроцессоре
MRC MCR передача регистров сопроцессора - перемещение данных в регистры сопроцессора / из регистров сопроцессора

В синтаксисе инструкций сопроцессора поле cp представляет номер сопроцессора между p0 и p15 .Поля кода операции описывают операцию, которая должна выполняться на сопроцессоре. Поля Cn , Cm и Cd описывают регистры в сопроцессоре. Операции и регистры сопроцессора зависят от конкретного сопроцессора, который вы используете. Сопроцессор 15 (CP15) зарезервирован для целей управления системой, таких как управление памятью, управление буфером записи, управление кешем и регистры идентификации.

ПРИМЕР 3.27

В этом примере показано копирование регистра CP15 в регистр общего назначения.

Здесь CP15 регистр 0 содержит идентификационный номер процессора. Этот регистр копируется в регистр общего назначения r10 .

3.5.2 КОПРОЦЕССОР 15 ИНСТРУКЦИЯ СИНТАКСИС

CP15 конфигурирует ядро ​​процессора и имеет набор выделенных регистров для хранения информации о конфигурации, как показано в примере 3.27. Значение, записанное в регистр, устанавливает атрибут конфигурации - например, включение кеша.

CP15 называется сопроцессором управления системой . Инструкции MRC и MCR используются для чтения и записи в CP15, где регистр Rd является основным регистром назначения, Cn является первичным регистром, Cm является вторичным регистром, а opcode2 является вторичным регистром модификатор. Иногда можно услышать вторичные регистры, называемые «расширенными регистрами».

В качестве примера приведена инструкция по перемещению содержимого регистра управления CP15 c1 в регистр r1 ядра процессора:

Мы используем сокращенную запись для ссылки на CP15, которая упрощает обращение к регистрам конфигурации. .Обозначение ссылки использует следующий формат:

Первый член, CP15 , определяет его как сопроцессор 15. Второй член после разделительного двоеточия является первичным регистром. Первичный регистр X может иметь значение от 0 до 15. Третий член - это вторичный или расширенный регистр. Вторичный регистр Y может иметь значение от 0 до 15. Последний член, opcode2 , является модификатором команды и может иметь значение от 0 до 7.Некоторые операции могут также использовать ненулевое значение w из кода операции 1. Мы записываем как CP15: w: cX: cY: Z.

Регистрация - Флаги транспортных средств - Страницы

MVA может поместить флаг в учетную запись вашего транспортного средства по запросу уполномоченного органа, регистрирующего флаг, например, местного полицейского управления. Большинство флагов связаны с нерешенными проблемами, такими как выбросы транспортных средств, страхование, штраф за парковку, красный свет, нарушение скорости или дорожных сборов. Наличие флажка в учетной записи вашего автомобиля не позволит вам выполнить определенные типы транзакций MVA, например, продлить регистрацию вашего автомобиля.

Примечание , что для типов флагов, перечисленных ниже, вы должны будете заплатить дополнительный административный сбор в MVA:

  • Флаги, возникшие в результате неспособности владельца транспортного средства устранить нарушение правил парковки
  • Флаги, возникшие в результате неспособности владельца транспортного средства устранить нарушение правил взимания платы за проезд
  • Флаги, возникшие в результате неспособности владельца транспортного средства устранить нарушение режима светофора, зафиксированного автоматической системой камеры.
  • Флаги, возникшие в результате неспособности владельца транспортного средства устранить нарушение камеры контроля скорости, зафиксированного автоматической системой камеры.

Этот административный сбор может быть уплачен до или после снятия флага юрисдикции.Однако комиссия должна быть оплачена полностью, прежде чем вы сможете продолжить любую транзакцию MVA, заблокированную флагом.


По каким причинам может быть установлен флаг? По каким причинам флаг может быть помещен в мою учетную запись транспортного средства?

Во-первых, важно отметить, что флаг обычно ставится в записи о вашем транспортном средстве после того, как вы не смогли решить проблему. Государственные и местные юрисдикции, правоохранительные органы, оперативные подразделения в составе MVA и некоторые другие уполномоченные органы могут запросить размещение флага.Скорее всего, организация, запросившая установку флага, отправила вам уведомление, требующее каких-либо действий (например, оплаты штрафа за парковку). Если вы не выполнили запрос в течение разрешенного периода времени, объект может попросить MVA установить флаг.

Некоторые из наиболее распространенных причин, по которым может быть установлен флаг, включают:

  • Нарушение правил страхования - записи по страхованию транспортных средств, зарегистрированные в MVA, указывают на проблему. См. Требования к страхованию транспортных средств Мэриленда для получения информации о требованиях к страхованию;
  • Возвращенный чек - возможно, вы отправили в MVA чек, который не был обработан вашим банком;
  • Нарушение камеры на красный свет - ваш автомобиль был запечатлен на фотографии, на которой видно, что он проехал на красный свет;
  • Нарушение парковки - Ваш автомобиль получил разрешение на парковку;
  • Программа проверки выбросов транспортных средств (VEIP) нарушение - Записи MVA о проверках выбросов вашего транспортного средства указывают на проблему.См. Выбросы транспортных средств для получения дополнительной информации;
  • Нарушение приказа о ремонте оборудования безопасности (SERO) - возможно, вы не вернули доказательство того, что ваш автомобиль был отремонтирован после остановки из-за проблемы, связанной с безопасностью (например, перегорела фара). Для получения дополнительной информации см. Описание процесса infoMVA, озаглавленное «Заказ на ремонт оборудования безопасности (SERO)».
  • Направление правоохранительных органов - правоохранительный орган запросил размещение флага по разным причинам;
  • Нарушение в отношении брошенного автомобиля - правоохранительные органы определили ваш автомобиль как брошенный;
  • Нарушение правового титула - проблема может возникнуть в связи с правомерностью вашего автомобиля;
  • Нарушение аварийного автомобиля - проблема может существовать в отношении вашего аварийного автомобиля;
  • Нарушение комиссии по коммунальным услугам - Ваш автомобиль не соответствует требованиям PSC.
  • Нарушение правил взимания платы за проезд - Ваш автомобиль был запечатлен на фотографии, когда необходимая плата за проезд не была уплачена.
  • Нарушение контролером - Офис контролера зафиксировал нарушение, связанное с неоспоримыми налогами на физическое или юридическое лицо. Для получения дополнительной информации физические лица могут позвонить по телефону 855-213-6669, а компании - по телефону 410-649-0633. Вы также можете связаться с офисом финансового контролера по электронной почте [email protected].
  • Нарушение Министерством труда, лицензирования и регулирования (DLLR) - DLLR зафиксировала нарушение, связанное с частным или юридическим лицом, причитающимся неоспоримым взносам по страхованию от безработицы.Для получения дополнительной информации вы можете связаться с DLLR по телефону 410-767-2699 или по электронной почте DLLR по адресу [email protected].
  • Нарушение камеры контроля скорости - Ваш автомобиль был запечатлен на фотографии, показывающей, что он превысил указанное ограничение скорости.
  • Причитается административный сбор - MVA устанавливает дополнительный флаг административного сбора, если исходный флаг был установлен в результате нарушения камеры на красный свет, нарушения правил парковки, нарушения камеры контроля скорости или нарушения правил взимания платы.Для получения дополнительной информации об этом флаге см. Вопрос об уплате административного сбора ниже.

Что происходит при установке флажка?

Если на вашем транспортном средстве будет установлен флажок, вам будет запрещено:

  • продление регистрации транспортного средства;
  • перенос номерных знаков транспортного средства на другое транспортное средство;
  • получение заменяющих номерных знаков на ТС;
  • получение дубликата регистрационной карты.

Несколько флагов могут вызвать для вас еще более серьезные последствия, например, правоохранительные органы немедленно заберут ваши номерные знаки.

Обратите внимание, что когда флаг установлен в результате нарушения парковки, дорожного сбора, камеры контроля скорости или камеры красного света , MVA взимает с вас дополнительный административный сбор. Этот сбор должен быть оплачен вместе со всеми штрафами, связанными с исходным цитированием, до того, как флаг может быть полностью устранен.


Как снять флаг?

Чтобы удалить флаг транспортного средства, вы должны сначала связаться с уполномоченным лицом, запросившим его размещение, и решить проблему (например,г., оплатите штраф за парковку). MVA может предоставить вам контактную информацию для юрисдикций, в которых действуют программы обозначения парковок, светофора, скоростных и платных дорог. Если вы не уверены, какое агентство поставило флаг, проверьте свое уведомление о нарушении или свяжитесь с центром обслуживания клиентов MVA по телефону 1-410-768-7000.

В некоторых юрисдикциях разрешены платежи через свои веб-сайты или по телефону за нарушение правил централизованного сбора, парковки, светофора и камеры контроля скорости.

После того, как вы выполнили все требования, организация может предоставить выпуск флага, который вам необходимо предоставить в MVA перед запросом транзакции, связанной с транспортным средством.Только тот объект, который запросил установку флага, имеет право запросить его удаление; Иногда удаление флага может занять несколько недель.

Если ваш флаг связан с парковкой, платной камерой контроля скорости или указанием камеры на красный свет, вы также должны оплатить административный сбор MVA. Вы можете оплатить этот сбор до или после решения исходной проблемы.


Когда MVA взимает административный сбор и как я могу его оплатить?

Административный сбор взимается за за каждый флаг , возникший в результате неспособности владельца транспортного средства устранить:

  • нарушение правил парковки;
  • нарушение платы за проезд;
  • нарушение режима светофора, зафиксированное автоматизированной системой камеры; или
  • нарушение камеры контроля скорости, зафиксированное автоматизированной системой камеры.

Административный сбор может быть уплачен до или после того, как вы решите проблему с юрисдикцией, в которой отмечен флаг. Возможна оплата:

  • в интернет-магазине МВА
  • по почте или лично в любом филиале MVA; или
  • по телефону 1-410-768-7000
  • в киоске

Стоимость:

  • Покупатель должен оплатить все штрафы, наложенные помеченным лицом, прежде чем флаг может быть удален.
  • MVA взимает дополнительный административный сбор за флаг, связанный с нарушением правил парковки, платы за проезд, камеры контроля скорости или светофора.
  • При оплате через Интернет, через киоск или по телефону вы должны заплатить всю причитающуюся сумму. Сумма счета может отличаться, если после того, как счет был распечатан, рядом с записью транспортного средства будут установлены дополнительные флажки. Будет создан новый счет с учетом новых подлежащих оплате сборов.

Контактная информация:

Для вопросов по телефону:
Центр обслуживания клиентов MVA: 1-410-768-7000
TTY / для людей с нарушением слуха: 1-301-729-4563

Что означает регистр флагов? - Мворганизация.org

Что означает регистр флага?

Регистр FLAGS - это регистр состояния микропроцессоров Intel x86, который содержит текущее состояние процессора. Этот регистр имеет ширину 16 бит. Его преемники, регистры EFLAGS и RFLAGS, имеют ширину 32 и 64 бита соответственно.

Для чего нужен регистр флагов?

Регистры FLAG служат для индикации различных состояний процессора. Это делается путем установки отдельных битов, называемых флагами.Есть два вида ФЛАГОВ; ФЛАГ состояния и ФЛАГ управления. ФЛАГ состояния отражает результат операции, выполненной процессором.

Какие флаги существуют в регистре?

Общие флаги

Флаг Имя
Z Нулевой флаг
С Флажок для переноски
S / N Знак флага Отрицательный флаг
V / O / W Флаг переполнения

Чем регистр флагов 8086 отличается от 8085, какие флаги присутствуют в 8086, но не в 8085, объясняют их работу?

Емкость адресации памяти 8085 составляет 216 i.е., 64 КБ. Всего существует 5 флагов (т.е. знак, ноль, вспомогательный перенос, четность и флаг переноса) в микропроцессоре 8085. В отличие от всего 9 флагов (т.е. переполнение, направление, прерывание, ловушка и остальные в 8085) присутствуют в микропроцессоре 8086.

8085 и 8086 это одно и то же?

8085 - это 8-битный микропроцессор. Он был произведен Intel и впервые представлен в 1976 году. 8086 - это улучшенная версия микропроцессора 8085. Это 16-битный процессор… Различия между микропроцессором 8085 и 8086.

Имущество 8085 Микропроцессор 8086 Микропроцессор
Тип процессора Аккумуляторная Регистр общего назначения на основе

Что такое сегментированная память 8086?

Сегмент - это логическая единица памяти, длина которой может составлять до 64 килобайт. Каждый сегмент состоит из непрерывных ячеек памяти. Однако он работает только с четырьмя сегментами по 64 КБ в пределах всей памяти размером 1 МБ.Ниже приведен один из способов размещения четырех сегментов по 64 килобайта в 1-мегабайтном пространстве памяти 8086.

Сколько существует версий 8086?

Список Intel 8086

Номер модели Частота Технологии
8086 5 МГц HMOS
8086-1 10 МГц HMOS II
8086-2 8 МГц HMOS II
8086-4 4 МГц HMOS

Сколько регистров у 8086?

В общей сложности 8086 состоит из 14 16-битных регистров.Дополнительный сегмент. К четырем из них, AX, BX, CX, DX, также можно получить доступ как к вдвое большему количеству 8-битных регистров (см. Рисунок), в то время как другие четыре, SI, DI, BP, SP, являются только 16-битными.

Каковы классификации регистров 8086?

Все регистры внутри 8086 16-битные. Они разделены на четыре категории: общего назначения, индекс, статус и контроль и сегмент.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *