- •2.4. Машинный язык и язык Ассемблера
- •2.5. Синаксис языка Ассемблера
- •2.6. Принципы работы Ассемблера
- •2.7. Биты, байты и слова
- •2.8. Нумерация бит
- •2.9. Набор символов
- •2.10. Принципы работы компьютера
- •2.11. Процедуры
- •2.12. Стек
- •2.13. Прерывания
- •3.1. Модель программирования 8088
- •3.2. Регистры общего назначения
- •3.3. Регистры адресации
- •3.4. Прямая адресация
- •3.5. Вычисление адресов
- •3.6. Адресация через базу и смещение
- •3.8. Байт mod r-m
- •3.9 Физическая адресация
- •3.10. Сегментные регистры
- •3.11. Предназначение сегментов
- •3.12. Оператор Segment
- •3.13. Оператор Assume
- •3.14. Управляющие рагистры
- •3.14.1. Указатель инструкций (ip)
- •3.14.2. Указатель стека
- •3.14.3. Регистр флагов
- •3.14.4. Флаг знака
- •3.14.5. Флаг нуля
- •3.14.6. Флаг четности
- •3.14.7. Флаг переноса
- •3.14.8. Дополнительный флаг переноса
- •3.14.9. Флаг переполнения
- •3.14.10. Флаг захвата
- •3.15. Векторы прерываний
- •Глава 4 - Набор команд микропроцессора 8088
- •4.1. Пересылка данных
- •4.1.1. Команда пересылки
- •4.1.2. Команда замены
- •4.1.3. Команды ввода и вывода
- •4.1.4. Загрузка исполнительного адреса
- •4.1.5. Загрузка указателя
- •4.1.6. Пересылка флагов
- •4.1.7. Перекодировка
- •4.2. Операции со стеком
- •4.3. Передача параметров
3.8. Байт mod r-m
Как же адресная информация передается микропроцессору в машинном языке? 8088 использует почти для всех операций адресации байт MOD-R/M (байт режима адресации и регистра/модификатора - прим. перев.). Фиг.3.4 показывает формат этого байта команды. Байт MOD-R/M следует за байтом кода операции и определяет один операнд памяти команды 8088. Этот байт может вместо ячейки памяти указывать и регистр. Такое единство структуры позволяет реализовать все возможности адресации операндов.
Режим |
Адрес операнда |
00 |
DISP=0, нет байтов смещения |
01 |
-128<DISP<127, однобайтовое смещение |
10 |
-32768<DISP<32767, двухбайтовое смещение |
11 |
В поле r/m - регистр, а не адрес |
Фиг. 3.4 Байт режима адресации и регистра-модификатора
Первые два бита байта MOD-R/M определяют выбранный способ адресации. Эти два бита определяют число байт смещения, которые следуют за байтом MOD-R/M - ни одного, один или два. Последние 3 бита байта MOD-R/M определяют вид адреса - одну из восьми комбинаций базисных и индексных регистров. Это поле называется полем R/M - полем регистра/модификатора. Это те самые 3 бита из колноки R/M на Фиг.3.3, где показаны возможные комбинации при адресации. Значение оставшихся 3-х бит в середине байта MOD-R/M зависят от конкретной команды. Для команды с двумя операндами, вроде ADD, это поле указывает регистр, являющийся вторым операндом. Для команды с одним операндом, как INC, эти три бита обычно составляют часть самого кода операции. 8088 не знает, что имеет дело с командой INC, пока не расшифрует средние три бита байта MOD-R/M. Этот же байт используется еще в паре специальных случаев. Если в команде определен регистр, а не адрес памяти, то в поле режима помещается код 11B, чтобы сообщить микропроцессору, что поле R/M содержит код регистра, а не адрес памяти. Наконец, вы возможно заметили, что в механизме работы с байтом MOD-R/M не предусмотрена прямая адресация. 8088 рассматривает как прямую адресацию случай типа [BP + СМЕЩЕНИЕ] при нулевом смещении. В этом случае поле смещения имеет длину два байта, и в вычислении адреса не участвует ни один регистр. Из-за этого особого случая доступ к ячейке памяти, на которую указывает регистр BP, в машинном коде требуется однобайтовое поле смещения с нулевым значением. Использование в той же ситуации регистров BX, SI и DI не требует байта смещения. В следующем пункте будет показано еще одно различие между адресацией через регистры BP и BX.
3.9 Физическая адресация
Все, что до сих пор говорилось об адресации, относится к генерации так называемого смещения (offset) адреса. Смещение имеет 16-битовое значение. 8088 сегментирует память таким образом, что можно адресоваться к памяти большей чем 64K. В этом пункте булет показан способ сегментации 8088. Поскольку размер слова в микропроцессоре 8088 равен 16 бит, для него естественно генерировать адреса в 16бит длиной. Это делает доступными дляпрямой адрессации 2**16 элементов или 65 535 байт памяти. Однако для некоторых программ 64K ячеек памяти недостаточно. Поэтому фирма INTEL сконструировала 8088 для адресации 2**20 байт или одного мегабайта памяти. Для получения 20-битовой адресации требуется еще четыре бита к имеющимся 16-ти. Добавочные 4 бита адресной информации берутся из сегментных регистров. Сегментные регистры сами имеют размер 16 бит. 8088 комбинирует 16-битовый адрес смещения и 16-битовый регистр сегмента как показано на Фиг.3.5. Процессор дополняет сегментный регистр 4-мя нулевыми битами, что составляет вместе полное 20-битовое значение. К расширенному значению сегмента процессор добавляет адрес смещения, определяемый через вычисление адреса. 20-битовый результат является указателем на исполнительный адрес.
Сегмент * 16 + Смещение = 20-битовый адрес
Фиг.3.5 Вычисление адреса с сегментом и смещением
Каждая обращающаяся к памяти команда может сформировать только 16-битовый адрес операнда. В действительности процессор применяет этот адрес внутри определенного сегмента. Фиг. 3.6 иллюстриирует такой способ применения сегментации.
Сегмент |
смещение |
xxxx xxxx 0000 |
0000 |
|
.... |
|
FFFF |
yyyy yyyy 0000 |
0000 |
|
.... |
|
FFFF |
Фиг.3.6 Сегментация.
Начальный адрес сегмента всегда имеет нули в младших четырех битах. Адрес с этим свойством имеет каждая шестнадцатая ячейка памяти. Конструируя расположение данных в своей программе помните, что сегмент всегда должен приходиться на такую 16-битовую границу. Эти границы называются также границами параграфов