Определение реального адреса по сегменту и смещению



Регистровая структура процессора

Начиная с i80386 процессоры Intel предоставляют 16 основных регистров для пользовательских программ, плюс еще 11 регистров для работы с мультимедийными приложениями (MMX) и числами с плавающей запятой (FPU). Все командры микропроцессора так или иначе изменяют значения регистров и всегда быстрее и удобнее обращаться к регистру, чем к памяти.

Регистры общего назначения

Регистровую структуру микропроцессора I80386 можно представить рисунком

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

В частности, регистры общего назначения EAX, EBX, ECX, EDX произошли от 8-битных регистров A, B, C, D. Когда стало необходимым использование 16-битных регистров, к названию регистра добавили букву X(от слова eXtended). Каждый из расширенных регистров имеет две половины – младшую и старшую (Low и High), которые также можно использовать в программах ассемблера. Если необходимо использовать 32-битный регистр, используется имя с добавлением буквы E (Extended).

 

Есть еще 4 регистра: ESI (source index, индекс источника), EDI (destination index, индекс приемника), EBP (base pointer, указатель базы), ESP (stack pointer, указатель стека). Эти регистры имеют более конкретное назначение и применяются для хранения всевозможных временных переменных. Регистры ESI и EDI используются в строковых операциях, когда необходимо перекопировать строку из источника (Source) в приемник (Destination). Регистры EBP и ESP необходимы для работы со стеком. Младшие половины этих регистров называются SI, DI, BP и SP соответственно и в процессорах до 80386 присутствовали только они.

Сегментные регистры.

При использовании сегментированных моделей памяти для формирования любого адреса нужны два числа: адрес начала сегмента и смещение искомого байта относительно этого начала. Сегменты физически могут оказаться на планке памяти где угодно, программа обращается к ним, применяя вместо настоящего адреса начала сегмента 32-битное число, называемое селектором. В процессорах Intel предусмотрено шесть 32-битных сегментных регистров – CS (code segment), DS (data segment), SS (stack segment), ES, FS, GS в которых хранятся селекторы.

Стек

Стек – организованный специальным образом участок памяти, который используется для временного хранения переменных, передачи параметров вызываемых подпрограмм и сохранения адреса возврата при вызове процедур и прерываний. Легче всего представить стек в виде стопки листов бумаги (это одно из значений слова stack в английском языке). Вы можете класть и забирать листы только с вершины стопки. Если записать в стек числа 1, 2, 3, то при чтении они окажутся в обратном порядке – 3, 2, 1. Стек располагается в сегменте памяти, описываемом регистром SS. Текущий адрес, в котором хранится последнее значение в стеке, находится в регистре ESP, причем во время записи значение этого смещения уменьшается, то есть он «растет вниз» от максимально возможного адреса.

Регистр BP также используется для работы со стеком. Когда при вызове подпрограммы параметры помещают в стек, в BP записывают текущее значение SP. Если подпрограмма использует стек для хранения локальных переменных, SP изменится, а BP можно будет использовать для того, чтобы считывать значения параметров напрямую из стека (их смещения запишутся как BP + номер параметра).

 

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

Еще один важный регистр, использующийся при выполнении большинства команд – регистр флагов. Его младшие 16 бит называются FLAGS, а 32 бита – EFLAGS. В EFLAGS каждый бит является флагом, то есть он устанавливается в 1, если определенное условие выполняется, и устанавливается в 0, если это условие не выполнено. Регистр FLAGS выглядит следующим образом:

CF – carry flag. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита за пределы разрядной сетки а также если требуется заем (при вычитании). В противном случае он равен 0. Например, после сложения слова 0FFFFh и 1, в двухбайтном регистре будет записано 0000h а флаг CF=1.

AF – auxiliary carry flag. Флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос из первой тетрады во вторую или из 3 бита в 4. Этот флаг используется для команд двоично-десятичной коррекции.

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

ZF – zero flag. Флаг равен единице, если число равно нулю.

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

TF – trap flag. Флаг ловушки. Он предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой программной команды управление временно передается отладчику (вызывается прерывание 1).

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

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

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

01100000 (96) +

01010001 (81) =

10110001

 

11111000 (-8) +

11110101 (-11) =

11101101 (-19)

 

10111000 (-72) +

10110101 (-75) =

01101101 (109)

 

Есть простая формула для вычисления корректности переноса.

OF = C67®C78

 

 

Определение реального адреса по сегменту и смещению


Дата добавления: 2021-12-10; просмотров: 24; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!