Сегментом называется область памяти, которая начинается на границе параграфа, то есть в любой точке, адрес которой кратен 16 (восемь младших битов равны нулю).
Существуют три основных типа сегментов:
- сегмент кода - содержит машинные команды, адресуется регистром CS;
- сегмент данных - содержит данные, то есть константы и рабочие области, необходимые программе. Адресуется регистром DS;
- сегмент стека - содержит адреса возврата в точку вызова подпрограмм. Адресуется регистром SS.
Каждый из упомянутых регистров содержит адрес начала сегмента (базовый адрес). В программе все адреса записаны относительно начала сегмента, и они определяются как смещение (offset) от начала сегмента. Двухбайтовое смещение (одно слово) может принимать значение от 0000 до 0FFFFh. Для того, чтобы выполнить обращение по любому адресу процессор выполняет суммирование адреса, записанного в регистре сегмента, со смещением. При этом, содержимое регистра сдвигается на четыре двоичных разряда влево. Результирующий адрес занимает 20 позиций, что и позволяет адресовать 1 Мбайт памяти.
Пример.
Содержимое DS 045F
+
Смещение 0032
Исполнительный 04622
адрес (EA)
Примечание: Адреса шестнадцатиричные.
РЕЖИМЫ АДРЕСАЦИИ
Стандартный сег- Режим адресации Формат адреса ментный регистр
=============== ============= =================
Регистровая регистр Нет
Непосредственная данные Нет
Косвенная регистровая [BX] DS
[BP] SS
[DI] DS
[SI] DS
По базе со смещением метка [BX] DS
метка [BP] SS
Прямая метка [DI] DS
с индексированием метка [SI] DS
По базе метка [BX + SI] DS
с индексированием метка [BX + DI] DS
метка [BP + SI] SS
метка [BP + DI] SS
Строковые команды исходный адрес DS:SI
место назначения ES:DI
* Метка [...] может быть заменена на [смещение +...].
Следовательно, запись [24 + BX] будет означать адрес 24+ВХ.
===========================================================
Примечание: Многие строковые команды используют ES:DI как место назначения, а DS:SI как адрес источника.
Эта таблица приводит количество временных тактов, требуемых для вычисления исполнительного адреса на микропроцессоре
8088. Микропроцессор 80*8* производит эти вычисления быстрее, так что эта таблица содержит "самые медленные" данные.
Каждое обращение к памяти занимает дополнительные 4 такта. Поле обращений в описаниях команд содержит информацию о количестве обращений к памяти для каждой команды. Стеки
Во многих случаях программе требуется временно запомнить информацию, а затем считывать ее в обратном порядке. Эта проблема в ПК решена посредством реализации стека LIFO ("последний пришел - первый ушел"), называемого также стеком включения/извлечения (stack - кипа, например, бумаг). Наиболее важное использование стека связано с процедурами. Стек обычно рассчитан на косвенную адресацию через регистр SP - указатель стека. При включении элементов в стек производится автоматический декремент указателя стека, а при извлечении - инкремент, то есть стек всега "растет" в сторону меньших адресов памяти. Адрес последнего включенного в стек элемента называется вершиной стека (TOS).
Физический адрес стека формируется из SP и SS или BP и SS, причем SP служит неявным указателем стека для всех операций включения и извлечения, а SS - сегментным регистром стека. Содержимое SS является самым младшим адресом (границей) области стека и называется базой стека. Первоначальное содержимое SP считается наибольшим смещением, которого может достигать стек. Регистр BP предназначен, главным образом, для произвольных обращений к стеку.
2.5.2 JMP Безусловный переход
Признаки не меняются.
Команда: JMP target.
Условие перехода: переход осуществляется всегда.
Команда JMP всегда передает управление в место, определяемое операндом target. В отличие от команды CALL, JMP не запоминает значение IP, т.к. появление команды возврата RET не ожидается. Переход внутри сегмента может быть задан как операндом типа память, так и через 16-битный регистр. Переход во внешний сегмент может быть задан только через операнд типа память.
Примечания:
Если ассемблер может определить, что в случае перехода внутри сегмента цель перехода находится в пределах 127 байтов от места расположения текущей команды, то ассемблер автоматически сгенерирует двухбайтовую команду (короткий переход); в противном случае сгенерируется трехбайтовый NEAR JMP. В целях генерации двухбайтовой команды Вы можете сделать "подсказку" ассемблеру, используя специальный оператор "short":
JMP short near_by
Лекция 8