Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АСВТ.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
105.52 Кб
Скачать

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

Еще одним важным регистром, использующимся при выполнении большинства команд, является регистр флагов. EFLAGS (его младший 16 бит просто FLAGS). Каждый бит в EFLAGS является флагом, т.е. устанавливается в значение 1 при определенных условиях, его установка в 1 изменяет поведение процессора. Все флаги, расположенные в старшем слове регистра имеют отношение к управлению защищенным режимом, поэтому будем рассматривать только регистр FLAGS.

CF – флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем при вычитании. В противном случае обращается в 0.

PF – флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число битов равных 1 и в 0, если нечетное.

AF – флаг вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос или заем из 3го бита в 4ый. Используется автоматически командой 2ичной и 10чной коррекции.

ZF – флаг нуля. Устанавливается в 1, если результат предыдущей команды 0.

SF – флаг знака. Всегда равен старшему биту результата.

TF – флаг ловушки. Установка его в 1 приводит к тому, что после каждой программной команды управление передается отладчику.

IF – флаг прерываний. Сброс этого флага в 0 приводит к тому, что процессор перестает обрабатывать прерывания.

DF – флаг направления. Контролирует поведение команд обработки строк, когда установлен в 1, строки обрабатываются в сторону уменьшения адресов, когда =0 наоборот.

OF – флаг переполнения. Устанавливается в 1 если результат предыдущей арифметической операции над числами выходит за допустимые пределы.

Флаги IOPL и NT применяются в защищенном режиме.

Способы адресации.

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

  1. Регистровая адресация – операнды могут располагаться в любых регистрах общего назначения и сегментных регистрах. При обращении в тексте программы указывается название соответствующего регистра, например, команда, копирующая в регистр Ах содержимое регистра Bx записывается как mov ax, bx.

  2. Непосредственная адресация – некоторые команды (все арифметические кроме деления) позволяют указывать один из операндов непосредственно в тексте программы, например, команда mov ax, 2 помещает в регистр Aх число 2.

  3. Прямая адресация – если у операнда располагающегося в памяти известен адрес, то его можно использовать, например, если операнд находится в сегменте, на который указывает регистр ES со смещением от начала сегмента 0001, то команда mov ax, es:0001 поместит в регистр Ах значение этого операнда. В реальных программах для задания статических переменных обычно используют директивы определения данных, которые позволяют ссылаться не по адресу, а по имени. Например, если в сегменте ES была описана переменная variable, тогда команда примет вид mov ax, es:variable.

  4. Косвенная адресация – адрес операнда можно не указывать, а хранить в любом регистре, например, следующая команда помещает в регистр Ах слово из ячейки памяти селектор сегмента которой находится в DS, а смещение в Bx. Mov ax:[bx]. Регистр DS используется по умолчанию.

  5. Адресация по базе со сдвигом – скомбинируем 2 предыдущих метода адресации: команда mov ax, [bx+2] помещает в регистр ax слово, которое есть в сегменте, указанном в DS со смещением на 2 больше чем число из bx. Другие допустимые формы записи этого способа: mov ax, [bp]+2; mov ax, 2[bp].

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

  1. Косвенная адресация с масштабированием – этот метод адресации полностью идентичен предыдущему, однако с его помощью можно прочитать элемент массива слов, двойных слов и т.д. mov ax,[esi*2]+2. Множитель, который может быть равен 1,2,4,8 соответствует размеру элемента массива. Из регистров в этом варианте адреса можно использовать только регистры общего назначения целиком.

  2. Адресация по базе с индексированием – в этом методе адресации смещение операнда в памяти вычисляется как сумма чисел, содержащихся в 2ух регистрах и смещение, если оно указано. Например, mov ax, [bx+si+2] – в регистр Ах помещается слово из ячейки памяти со смещением, равным сумме чисел, содержащихся в bx, si и числа 2. Можно складывать все 8 32ух битных регистров общего назначения, а из 16ти битных только bx+SI, bx+DI, BP+SI, BP+DI. Таким образом можно считать число из двумерного массива. Если массив содержит неодиночные байты, а состоит из слов или двойных слов, удобнее использовать наиболее полную форму адресацию по базе с индексированием и масштабированием

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

CS

SS +

DS

ES

FS

GS+

Стек – это организованный специальным образом участок памяти, который используется для временного хранения переменных, передачи параметров и сохранения адреса возврата при вызове процедур и прерывания. Стек описывается регистром SS(находится в соответствующем сегменте памяти), а текущее смещение вершины стека отражено в регистре ESP, причем во время записи значение этого смещения уменьшается, т.е. стек «растет вниз» от максимально возможного адреса. При вызове подпрограмм соответствующие параметры в большинстве случаев помещаются в стек, он же используется и для хранения локальных переменных. Для адресации используется значение регистров ESP и EBP.

Архитектура, организация памяти и режимы адресации ПК на примере процессора Intel 386.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]