ОРГАНИЗАЦИЯ АДРЕСНОГО ПРОСТРАНСТВА.
Минимально адресуемой единицей для процессора 8086 является БАЙТ.
Ячейки ОЗУ размером в байт имеют последовательные адреса, начинающиеся с нулевого (0, 1, 2, и т.д.). Размер адресной шины (то есть, количество разрядов, отводимых для адреса ячейки памяти) для процессора 8086 составляет двадцать разрядов. По этому максимально возможный адрес 220 -1 (1048560-1)(10) или двадцать единиц в двоичном коде или FFFFF(16).
Может адресоваться СЛОВО (два байта). Слово адресуется по адресу своего младшего байта. Младший байт слова хранится по младшему адресу, старший - по старшему.
СЕГМЕНТ - это область памяти, которая начинается на границе параграфа (по адресу кратному 1610 или 10(16)), имеет размер до 64Кбайт и может располагаться в любом месте ОЗУ. Реальный размер сегмента такой, какой требуется для выполнения программы.
Имеются три главных сегмента.
1. Сегмент кодов, в котором хранится программа, которая будет выполняться. Обычно первая выполняемая команда находится в начале этого сегмента и операционная система передает управление по адресу данного сегмента для выполнения программы.
2. Сегмент данных, в котором хранятся данные, константы и рабочие области, необходимые программе.
3. Сегмент стека. Стек - область оперативной памяти, организованная по принципу: записанный последним читается первым. Стек можно представить себе, как стопку тарелок, из которой можно взять только верхнюю тарелку, затем следующую за ней, и так далее. Добавить тарелку в стопку можно только наверх стопки Сегмент стека используется для хранения адресов возврата из процедур, прерываний.
4. Может быть еще дополнительный сегмент (данных).
|
Адреса начала сегментов хранятся в специальных сегментных регистрах. Сегментные регистры шестнадцатиразрядные. Так как начало сегмента установлено на границе параграфа, младший разряд адреса (в шестнадцатиричном коде) всегда равен нулю. Он не хранится. Таким образом, в сегментном регистре сохраняются старшие 4 разряда (в шестнадцатиричном коде или 16 разрядов в двоичном) адреса начала сегмента или БАЗА.
Внутри программы все адреса относительны к началу сегмента (СМЕЩЕНИЕ относительно начала сегмента).
Смещение составляет 2 байта (от 000016 до FFFF16 или от 0 о 65535 (64К)).
Записывается адрес ячейки памяти база:смещение. Например, запись 1000h:0200h означает, что база соответствующей ячейки памяти 1000h, а смещение – 0200h.
Адрес в программе формируется как сумма содержимого соответствующего сегментного регистра и смещения.
Пусть в сегментном регистре хранится адрес 045Fh, а смещение равно 0032h.
Результирующий адрес (физический 20-разрядный адрес) образуется:
Адрес в сегментном регистре 045F0
Смещение +00032
(К содержимому сегментного регистра добавляется подразумеваемый ноль).
Таким образом, при 16 битах в сегментных регистрах и 16 битах смещения можно адресовать 1 Мбайт памяти.
Прикладная архитектура процессора 8086(8088)
ОУ - операционное устройство ШИ - шинный интерфейс
AX AH AL
BX BH BL
CX CH CL
DX DH DL
SP CS
BP DS
DI ES
Упр.
шиной
АЛУ 4
УУ 3
Флаговый регистр 2
Указатель команд 1
Очередь команд
Рис.4.3. Прикладная архитектура процессора 8086 (8088)
Процессор состоит из двух основных частей: операционного устройства (ОУ) и шинного интерфейса (ШИ). ОУ выполняет команды, ШИ подготавливает команды и данные для выполнения. ОУ содержит арифметическо - логическое устройство (АЛУ), устройство управления (УУ) и десять регистров. Эти устройства обеспечивают выполнение команд, арифметические вычисления и логические операции. ШИ состоит из блока управления шиной, очереди команд и сегментных регистров. ШИ выполняет три основные функции:
|
1) управляет передачей данных на ОУ, в память и на внешние устройства ввода/вывода;
2) четыре сегментных регистра управляют адресацией памяти объемом до 1 Мбайта;
3) осуществляет выборку команд из ОЗУ, очередь команд хранит четыре команды, следующие за выполняемой.
В процессорах 8086/8088 применена конвейерная архитектура, позволяющая выполнять выборку кодов инструкций из памяти и их декодирование во время выполнения внутренних операций. Конвейер повышает производительность процессора за счет сокращения времени простоя его операционных узлов. Конвейер 8086 имеет 6 байтовую внутреннюю очередь инструкций. Блок предварительной выборки при наличии двух свободных байт в очереди старается заполнить ее в то время, когда внешняя шина процессора не занята операциями обмена. Очередь у процессора 8088 сокращена до 4 байт, а предварительная выборка выполняется при наличии одного свободного байта. Эти отличия оптимизирует конвейер с учетом разрядности шины данных. Очередь обнуляется при любой команде передачи управления (даже при переходе (JMP) на следующий адрес). Процессоры 8086/8088 имеют 14 регистров, используемых для управления программой, для адресации памяти, для обеспечения арифметических вычислений.
|
Регистры имеют длину одно слово (16 бит).
СЕГМЕНТНЫЕ РЕГИСТЫCS,DS,SS,ES.
Сохраняют адрес начала соответствующего сегмента (без младшего нуля):
CS - кодового сегмента;
DS - сегмента данных;
SS - сегмента стека;
ES - дополнительного сегмента.
РЕГИСТРЫОБЩЕГО НАЗЕАЧЕНИЯ (РОН) AX,BX,CX,DX.
Могут адресоваться как 16-битовые, так и как два однобайтовых.
АХ - 16-битовый регистр, АН – его старшая часть (левый байт), АL - младшая (правый байт).
Назначение РОН.
AX - используется как сумматор, во всех операция ввода-вывода, некоторых операциях над строками и некоторых арифметических операциях.
BX - базовый регистр. Единственный РОН, который может использоваться как индекс для расширенной адресации. Используется также для вычислений.
CX - регистр-счетчик. Используется для управления количеством циклов и сдвигов. Также применяется для вычислений.
DX - регистр данных. Используется в некоторых операциях ввода-вывода, в операциях умножения и деления больших чисел.
РЕГИСТРОВЫЕ УКАЗАТЕЛИ SP, BP.
Обеспечивают доступ к данным в стеке.
SP - указывает на смещение относительно SS вершины стека.
BP - указывает на смещение относительно SS данных внутри стека.
С помощью регистра SP организуется принцип “записанный последним читается первым”. Как работает стек в процессоре 8086? Стек оперирует только словами. Заполняется стек от старших адресов к младшим. То есть сначала записывается слово по максимальному адресу в сегменте стека, потом по адресу на два (так как стек работает со словами) меньше и так далее. Регистр SP называется указателем на вершину стека. Вершина стека – это последнее записанное в стек слово. Указатель на вершину стека – это адрес (точнее смещение относительно сегментного регистра SS) последнего записанного в стек слова. Как происходит запись слова в стек. При записи слова в стек содержимое регистра SP уменьшается на два и по полученному смещению записывается слово (на рис. 4. 4 б – это слово A0B5). При повторной записи слова содержимое SP опять уменьшается на два и по полученному смещению записывается новое слово (на рис. 4.4. в – это число C601).
При чтении слова из стека слово считывается по смещению, содержащемуся в SP, а после этого содержимое SP увеличивается на два, то есть указывает на предыдущее записанное в стек слово (рис.4.5.а). При чтении следующего слова считывается слово, смещение которого находится в SP, и содержимое SP опять увеличивается на два (рис. 4.5.б). Таким образом, SP всегда содержит смещение последнего записанного в стек слова. Изменение SP происходит автоматически при записи и чтении слов.
Регистр BP позволяет прочитать или записать слово по произвольному
смещению внутри стека. Он содержит смещение слова относительно регистра SS.
ИНДЕКСНЫЕ РЕГИСТРЫSI, DI.
Используются для расширенной адресации и в операциях со строками.
SI - является индексом источника и используется совместно с DS для некоторых операций над строками.
DI - является индексом приемника и используется совместно с ES для некоторых операций над строками.
УКАЗАТЕЛЬ КОМАНД (СЧЕТЧИК КОМАНД) IP.
Содержит смещение (относительно СS) команды, которая должна быть выполнена (то есть следующей за выполняемой). С помощью IP осуществляется управление порядком выполнения команд вашей программы. Когда команда загружается в устройство управления для выполнения, IP увеличивается на число соответствующее количеству байт, занимаемых данной командой, и таким образом формирует адрес следующей команды (при последовательном выполнении команд). При выполнении команд перехода смещение команды, на которую нужно передать управление, заносится в IP.
ФЛАГОВЫЙ РЕГИСТР.
Хранит в виде битовых полей результаты выполнения операций (признаки нулевого, отрицательного результата, переполнения разрядной сетки и др.)
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
X X X X OF DF IF TF SF ZF X AF X PF X CF
Рис.4.6. Формат флагового регистра
CF (Carry Flag) - флаг переноса. Содержит значения переносов (0 или 1) из старшего разряда при арифметических операциях и операциях сдвига и циклического сдвига.
PF (Parity Flag) - флаг четности. Проверяет младшие 8 битов операций над данными. Нечетное число единиц приводит к установке этого флага в 0, четное - в 1. Не следует путать этот флаг с битом контроля на четность.
AF (Auxiliary Carry Flag) - вспомогательный флаг переноса. Устанавливается в 1, если арифметическая операция приводит к переносу из третьего бита в регистровой однобайтовой команде. Данный флаг используется в арифметических операциях над числами в ASCII- и BCD-формате.
ZF (Zero Flag) - флаг нуля. Устанавливается в качестве результата арифметических команд и команд сравнения. При нулевом результате - 1, при ненулевом - 0.
SF (Sign Flag) - флаг знака. Устанавливается в соответствии со знаком результата (старшего бита) после арифметических операций. При положительном результате - 0, при отрицательном - 1.
TF (Trap Flag) - флаг трассировки. Если этот флаг установлен в единичное состояние, то процессор переходит в режим пошагового выполнения команд.
IF (Interrupt Flag) - флаг прерывания. При нулевом состоянии этого флага прерывания запрещены, при единичном - разрешены (управляет только маскируемыми аппаратными прерываниями).
DF (Direction Flag) – флаг направления. Используется в строковых операциях для определения направления передачи данных.
OF (Overflow Flag) - флаг переполнения. Фиксирует арифметическое переполнение, т.е. перенос в (из) старший (знаковый) разряд при знаковых арифметических операциях.