Связь с администрацией сайта:       

demo

Среди толпы я одинок

Глава 4 - сегментация, стэк, прерывания, адресация

Сегментация
Числа, устанавливаемые процессором на адресной шине, являются адресами, то есть номерами ячеек оперативной памяти (ОП). Размер ячейки ОП составляет 8 разрядов, т.е. 1 байт. Поскольку для адресации памяти процессор использует 16-разрядные адресные регистры, то это обеспечивает ему доступ к 65536 (FFFFh) байт или 64К (1К = 1024 байт = 210 байт) основной памяти. Такой блок непосредственно адресуемой памяти называется сегментом. Любой адрес формируется из адреса сегмента (всегда кратен 16, т.е. начинается с границы параграфа) и адреса ячейки внутри сегмента (этот адрес называется смещением). Для адресации большего объема памяти в процессоре 8086 используется специальная процедура пересчета адресов, называемая вычислением абсолютного (эффективного) адреса.
 
Когда процессор выбирает очередную команду на исполнение, в качестве ее адреса используется содержимое, регистра IP. Этот адрес называется исполнительным. Поскольку регистр IP шестнадцатиразрядный, исполнительный адрес тоже содержит 16 двоичных разрядов. Однако адресная шина, соединяющая процессор и память имеет 20 линий связи.
Чтобы получить 20-битовый адрес, дополнительные 4 бита адресной информации извлекаются из сегментных регистров. Сами сегментные регистры имеют размер в 16 разрядов, а содержащиеся в этих регистрах (CS, DS, SS или ES) 16-битовые значения называются базовым адресом сегмента. Микропроцессор объединяет 16-битовый исполнительный адрес и 16-битовый базовый адрес следующим образом: он расширяет содержимое сегментного регистра (базовый адрес) 4 нулевыми битами (в младших разрядах), делая его 20-битовым (полный адрес сегмента) и прибавляет смещение (исполнительный адрес). При этом 20-битовый результат является физическим или абсолютным адресом ячейки памяти.
poluc addr
Существуют три основных типа сегментов:
сегмент кода – содержит машинные команды, Адресуется регистром CS;
сегмент данных – содержит данные, то есть константы и рабочие области, необходимые программе. Адресуется регистром DS;
сегмент стека – содержит адреса возврата в точку вызова подпрограмм. Адресуется регистром SS.
При записи команд на языке Ассемблера принято указывать адреса с помощью следующей конструкции:
адрес сегмента:смещение
или
сегментный регистр:адресное выражение
 
Стэк
Во многих случаях программе требуется временно запомнить некоторую информацию. Эта проблема в персональном компьютере решена посредством реализации стека LIFO ("последний пришел - первый ушел"), называемого также стеком включения/извлечения (stack). Стек – это область памяти для временного хранения данных, в которую по специальным командам можно записывать отдельные слова (но не байты); при этом для запоминания данных достаточно выполнить лишь одну команду и не нужно беспокоиться о выборе соответствующего адреса: процессор автоматически выделяет для них свободное место в области временного хранения. Наиболее важное использование стека связано с подпрограммами, в этом случае стек содержит адрес возврата из подпрограммы, а иногда и передаваемые в/из подпрограмму данные. Стек обычно рассчитан на косвенную адресацию через регистр указатель стека. При включении элементов в стек производится автоматический декремент указателя стека, а при извлечении – инкремент, то есть стек всегда «растет» в сторону меньших адресов памяти. Адрес последнего включенного в стек элемента называется вершиной стека (TOS), а адрес сегмента стека – базой стека. Стек располагается в сегменте памяти, описываемом регистром SS, и текущее смещение вершины стека в регистре ESP, причем во время записи значение этого смещения уменьшается, то есть он «растет вниз» от максимально возможного адреса. Такое расположение стека «вверх ногами» может быть необходимо, к примеру, в бессегментной модели памяти, когда все сегменты, включая сегменты стека и кода, занимают одну и ту же область - память целиком. Тогда программа исполняется в нижней области памяти, в области малых адресов, и EIP растет, а стек располагается в верхней области памяти, и ESP уменьшается.При вызове подпрограммы параметры в большинстве случаев помещают в стек, а в ЕВР записывают текущее значение ESP. Если подпрограмма использует стек для хранения локальных переменных, ESP изменится, но ЕВР можно будет использовать для того, чтобы считывать значения параметров напрямую из стека (их смещения запишутся как ЕВР + номер параметра).
stek
 
Прерывания
Часто возникают ситуации, когда необходимо выполнить одну из набора специальных процедур, если в системе или в программе возникают определенные условия, например, нажата клавиша на клавиатуре или произошло деление на ноль. Действие, стимулирующее выполнение одной из таких процедур, называется прерыванием, поскольку основной процесс при этом приостанавливается на время выполнения этой процедуры. Существует два общих класса прерываний: внутренние и внешние. Первые инициируются состоянием ЦП или командой, а вторые – сигналом, подаваемым от других компонентов системы. Типичные внутренние прерывания: деление на нуль, переполнение и т.п., а типичные внешние – это запрос на обслуживание со стороны какого-либо устройства ввода/вывода.
Переход к процедуре прерывания осуществляется из любой программы, а после выполнения процедуры прерывания обязательно происходит возврат в прерванную программу. Перед обращением к процедуре прерывания должно быть сохранено состояние всех регистров и флагов, используемых процедурой прерывания, после окончания прерывания эти регистры должны быть восстановлены.
Некоторыми видами прерываний управляют флаги IF и TF, которые для восприятия прерываний должны быть правильно установлены. Если условия для прерывания удовлетворяются и необходимые флаги установлены, то микропроцессор завершает текущую команду, а затем реализует последовательность прерывания:
текущее значение регистра флагов включается в стек;
текущее значение кодового сегмента включается в стек;
текущее значение счетчика команд включается в стек;
сбрасываются флаги IF и TF.
Новое содержимое счетчика команд и сегмента кода определяют начальный адрес первой команды процедуры прерывания (обслуживания прерывания). Возврат в прерванную программу осуществляется командой, которая извлекает из стека содержимое для:
указателя стека;
сегмента кода;
регистра флагов.
Двойное слово, в котором находится новое содержимое счетчика команд и сегмента кода, называется указателем прерывания, или вектором прерывания. Каждому типу прерывания назначено число из диапазона 0...255, и адрес вектора прерывания находится путем умножения номера типа на четыре (размер вектора прерывания). Таким образом, все вектора прерываний образуют таблицу векторов прерываний, которая содержится в памяти по адресу 0000h:0000h и инициализируется при загрузке компьютера.
 
Режимы адресации
Регистровая адресация
Операнды могут располагаться в любых регистрах общего назначе ных регистрах. Для этого в тексте программы указывается название ее регистра, например: команда, копирующая в регистр АХ содержимое BX записывается как mov ах, bх
Непосредственная адресация
Некоторые команды (все арифметические, кроме деления) позволяют указывать один из операндов непосредственно в тексте программы. Например команда mov ах, 2 помещает в регистр АХ число 2.
Прямая адресация
Если у операнда, располагающегося в памяти, известен адрес, то его можно использовать. Если операнд - слово, находящееся в сегменте, на который указывает ES, со смещением от начала сегмента 0001, то команда mov ax,es:0001 поместит это слово в регистр АХ. В реальных программах для задания статических переменных обычно используют директивы определения данных, которые позволяют ссылаться на статические переменные не по адресу, а по имени. Тогда, если в сегменте, указанном в ES, была описана переменная word_var размером в слово, можно записать ту же команду как mov ах,es:word_var В таком случае ассемблер сам заменит слово word_var на соответствующий адрес. Если селектор сегмента данных находится в DS, то имя сегментного регистра при прямой адресации можно не указывать, DS используется по умолчанию. Прямая адресация иногда называется адресацией по смещению. Адресация отличается для реального и защищенного режимов. В реальном (так же как и в режиме V86) смещение всегда 16-битное. Это значит, что ни непосредственно указанное смещение, ни результат сложения содержимого разных регистров в более сложных методах адресации не могут превышать границ слова. При работе в Windows, DOS4G, PMODE и в других ситуациях, когда программа будет запускаться в защищенном режиме, смещение не должно превышать границ двойного слова.
Косвенная адресация
По аналогии с регистровыми и непосредственными операндами адрес операнда в памяти также можно не указывать, а хранить в любом регистре. До процессора 80386 для этого можно было использовать только ВХ, SI, DI и ВР, но потом ограничения были сняты и адрес операнда разрешили считывать также из ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ЕВР и ESP (но не из АХ, СХ, DX или SP напрямую -надо использовать ЕАХ, ЕСХ, EDX, ESP соответственно или предварительно скопировать смещение в ВХ, SI, DI или ВР). Например, следующая команда помещает в AX слово из ячеёки памяти, селектор сегмента которой находится в DS а смещение в BX. DS используется по умолчанию, но не всегда: если смещение берётся из ESP, EBP, BP то по умолчанию используется SS. Пример команды: mov ax,[bx]
Адресация по базе со сдвигом
Скомбинируем два предыдущих метода адресации и получим mov ax,[bx+2] В AX помещается слово из сегмента DS со смещением на два большее чем в BX. Такая форма записи используется когда в регистре находится адрес какой либо структуры данных, а нам надо обратиться к какому либо её элементу. До 80386 в качестве базы можно было испольщовать только BX,BP,SI,DI. Ограничение было снято начиная с 80386. С помощью этого метода можно организовать доступ к массиву байтов (одномерному). Однако если массив состоит не из байтов то проще использовать следующую форму адресации.
Косвенная адресация с масштабированием
Метод аналогичен предыдущему но тут можно читать из массива двойных и учетверённых слов
mov ax,[esi*2]+2
Множитель тут это 1,2,4,8 соответствует размеру элемента массива. Можно применять только расширеные регистры: EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP.
Адресация по базе с индексированием
Здесь смещение операнда в памяти вычисляется как сумма чисел содержащихся вдвух регистрах и смещение если оно указано. mov ax,[bx+si+2]
Таким образом можно считать число из двумерного массива. Но вот как надо задавать индексы: для таблицы скажем 10х10 BX=20 а SI=7 считает слово из 7-го и 8-го байтов третьей строки! Для 32-х разрядных регистров можно использовать все 8 общего назначения а для 16-ти битных только BX,SI,DI,BP.
Адресация по базе с индексированием и масштабированием
Это самая полная схема адресации. Сюда входят все случаи рассмотренные выше.
addr pol
 
 
Rate this item
(0 votes)
Login to post comments