В процессор включены два регистра, постоянно содержащие информацию о состоянии как самого процессора, так и программы, команды которой он в данный момент обрабатывает:
1. EIP/IP – Регистр счетчик-команд.
2. EFLAGS/FLAGS – Регистр флагов.
С помощью этих регистров можно управлять состоянием процессора.
Если рассматривать сегмент команд как отдельную область памяти, в которой ячейки нумеруются начиная с нуля, то номера этих ячеек будут называться относительными адресами. Относительный адрес – это адрес ячейки памяти относительно начала сегмента. Поэтому в технической литературе относительный адрес получил термин – смещение.
Регистр счетчик команд содержит смещение ячейки памяти, в которой находится текущая команда выполняемой программы. Этот регистр непосредственно недоступен программисту. Значение этого регистра может изменяться различными командами управления: командами условных и безусловных переходов, командами вызова процедур и возврата из процедур. Содержимое счетчика команд изменяется так же при возникновении прерываний. Кроме того загрузив программу в ассемблерный отладчик программист может изменять содержимое счетчика команд, изменяя тем самым последовательность выполнения команд и изучая таким образом различные режимы выполнения программы.
Регистр флагов, в отличие от других регистров, рассматривается не как регистр, содержащий число – данные или адрес, а как регистр, содержащий набор битов, имеющих самостоятельное назначение. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами.
Исходя из особенностей использования, флаги делятся на три группы.
1. В первую группу флагов входят 8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд. Флаги состояния отображают особенности результата выполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд условных переходов или вызовов подпрограмм.
2. Во вторую группу флагов входит всего один – флаг направления. Он используется цепочечными командами и определяет направление поэлементной обработки элементов строки: от начала строки к концу, либо, наоборот, от конца строки к ее началу. Для работы с этим флагом существуют специальные команды. Применение этих команд позволяет привести флаг направления в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками.
3. В третью группу регистра флагов 8 системных флагов, управляющих вводом-выводом, прерываниями, переключением между задачами. Прикладным программам не рекомендуется модифицировать эти флаги, так как это может привести к нарушению работы программы.
Тема 4. Организация памяти
В архитектуре IA-32 используется сегментированная модель памяти.
Сегментированная модель памяти.
Сегментация – это механизм адресации, обеспечивающий существование нескольких независимых адресных пространств сегментов как в пределах одной задачи, так и в системе в целом для защиты задач от взаимного влияния.
Для каждой компьютерной программы в оперативной памяти выделяются три сегмента: сегмент команд, сегмент данных и сегмент стека. При необходимости программе могут выделяться дополнительные сегменты данных не более трех. При этом программа не знает, по каким физическим адресам располагаются эти сегменты в оперативной памяти. Определением этих физических адресов занимается операционная система.
Операционная система размещает сегменты программы в оперативной памяти по определенным физическим адресам, после чего помещает значения этих адресов в определенные места. Куда именно, зависит от режима процессора.
В реальном режиме эти адреса помещаются непосредственно в соответствующие сегментные регистры процессора. Внутри сегмента программа обращается к адресам ячеек относительно начала сегмента, т.е. начиная с 0. Такие адреса к ячейкам памяти называют относительными адресами или смещением.
Формирование физического адреса в реальном режиме.
Максимальный размер одного сегмента составляет 64 Кбайт. Для обращения к конкретному физическому адресу оперативной памяти необходимо определить начальный адрес сегмента (НАС) и относительный адрес ячейки внутри сегмента (Смещение).
НАС имеет размерность 20 бит. Старшие 16 бит размещаются в определенном сегментном регистре. Младшие 4 бита образуются сдвигом адреса влево на 4 бита.
Физический адрес (ФА) образуется в результате сложения НАС и смещения:
ФА = НАС + СМЕЩЕНИЕ
Смещение размещается в одном из регистров общего назначения.
Физический адрес ячейки сегмента команд определяется по формуле:
ФА = CS.0 + IP
При отладке программ программист может изменять значение в регистре CS, при этом процессор будет переводится на другой сегмент команд, т.е. на выполнение другой программы.
При отладке программ программист может изменять значение в регистре IP, при этом процессор будет переводится на выполнение другой команды в этой же программе.
Физический адрес ячейки сегмента команд определяется по одной из формул:
ФА = DS.0 + SI , для режима чтения
ФА = DS.0 + DI , для режима записи
При отладке программ программист может изменять значение в регистре SI, при этом процессор будет переводится на чтение другой константы сегмента данных.
При отладке программ программист может изменять значение в регистре DI, при этом процессор будет переводится на запись данных в другую область сегмента данных.
Физический адрес вершины стека определяется по формуле:
ФА = SS.0 + BP + SP
При отладке программ программист может изменять значение в регистре BP, это позволяет при необходимости организовать несколько стеков с разными базовыми адресами для одной и той же программы.
При отладке программ программист может изменять значение в регистре SP, это позволяет при необходимости получить доступ к различным ячейкам стековой памяти.
Физический адрес ячейки дополнительного сегмента определяется по одной из формул:
ФА = ES.0 + SI , для режима чтения
ФА = ES.0 + DI , для режима записи
Рассмотрим алгоритм этого преобразования при обращении к ячейке сегмента команд:
19 ………………..…0
БФА = РА
Расширенный адрес
15 …………………………...…..…0
CS = НАС
Начальный адрес сегмента команд
19 ………………..…0
Сумма адресов
15 ………………..…0
IP = ОА
Относительный адрес
15 ………………..…0
СШ = ФА
Физический адрес
Предположим начальный адрес сегмента команд представлен в шестнадцатеричном коде и имеет значение 1E22H. Начальный адрес сегмента команд размещается в регистре CS = 1E22H. Начальный адрес сегмента имеет размерность 16 бит, т.е. 2 Байта.
Предположим, что текущая команда программы размещается в сегменте команд, в ячейке с относительным адресом 14H. Относительный адрес текущей команды размещается в регистре IP = 14H. Относительный адрес имеет размерность 16 бит, т.е. 2 Байта.
Начальный адрес сегмента поступает в блок формирования адреса, где к нему добавляются 4 нулевых бита справа. Четыре нулевых бита могут быть представлены0000B = 0H. В результате будет получен расширенный адрес 1E220H. Расширенный адрес имеет размерность 20 бит.
Расширенный адрес и относительный адрес поступают на сумматор адресов, который выполняет арифметическое сложение этих адресов.
1E220
1E234
Полученная сумма 1E234H и будет являться физическим адресом ячейки оперативной памяти, в которой находится текущая команда программы.