Опишите структуру команды на языке ассемблера.
Приведите примеры объявления числовых и символьных данных на языке ассемблера.
Перечислите допустимые операции над адресами.
Приведите примеры адресных выражений.
4.1. Сегментирование адресов
Для работы с оперативной памятью используются шина адреса и шина данных. Физически память устроена таким образом, что возможна адресация как 16-битовых слов, так и отдельных байтов памяти. Ширина шины адреса определяет максимальный объём физической памяти, непосредственно адресуемой процессором. Из рассмотрения формата машинной команды становится понятно, что большой объем оперативной памяти ведет к увеличению размера команд. Для их уменьшения поступают следующим образом.
Оперативную память разделяют на логические участки – сегменты. Причем начальные адреса сегментов могут быть любыми, но размер любого сегмента не должен превосходить 2m ячеек (m < k, k – разрядность шина адреса). Тогда абсолютный (физический) адрес некоторой ячейки памяти A можно представить в виде суммы:
где B – база сегмента, к которому относится ячейка A, disp – относительный адрес ячейки, отсчитанный от начала сегмента (адреса В) или смещение (displacement).
В результате большая часть адреса A будет приходиться на базу В. Если в команде требуется указать абсолютный адрес А, то большее слагаемое В сохраняется в регистре, а в команде указывается регистр и меньшее слагаемое disp. Записав в регистр адрес сегмента, далее, не меняя значение регистра, можно использовать его для доступа ко всем ячейкам данного сегмента.
Размер памяти в вычислительной системе на базе микропроцессора 8086 составляет 1 Мб, т.е. 220 байтов (адреса 20-разрядные, k=20), а размер сегментов не должен превышать 64 Кб, т.е. 216 байтов (смещения 16-разрядные адреса, m=16). Адреса принято записывать в шестнадцатеричной форме, поэтому физические адреса для 20-разрядной шины адреса находятся в пределах:
00000h [физический адрес] FFFFFh
Одновременно можно работать с четырьмя различными сегментами памяти: сегментом данных, кода, стека и дополнительным сегментом. На начало каждого из сегментов настраивается соответствующий регистр, и все адреса из данного сегмента по нему сегментируется. Взаимное расположение сегментов памяти может быть любым: они могут пересекаться, не пересекаться, либо полностью совпадать.
В качестве сегментных регистров можно использовать регистры CS, DS, SS и ES. Начальные адреса сегментов памяти можно хранить и в других регистрах, однако использовать их для сегментирования адресов не удастся.
На начальные адреса сегментов накладываются ограничения. В связи с тем, что абсолютные адреса 20-разрядные, а сегментные регистры 16-разрядные, адрес сегмента должен быть кратен 16 (последние 4 бита нулевые, что в шестнадцатеричной форме имеет вид xxxx0h). В результате в сегментных регистрах хранятся первые 16 битов начального адреса сегмента (рис. 16).
Рис. 16. Схема формирования физического адреса.
Например, если адресом начала сегмента является число 12340h, то в сегментном регистре будет храниться величина 1234h. Процессор учитывает такую особенность и при сегментировании адреса к содержимому сегментного регистра добавляет справа 0 и затем прибавляет смещение, указанное в команде. Поскольку добавление справа нуля к шестнадцатеричному числу эквивалентно умножению числа на 16, то формула вычисления абсолютного адреса по адресной паре CS:disp имеет вид:
При записи команд на ассемблере конструкция вида:
<сегментный регистр>:<адресное выражение>
называется адресной парой (или логическим адресом) и указывает, что адрес, являющийся значением выражения, должен быть просегментирован по указанному регистру.
Логический адрес может находиться в пределах:
0000h:0000h <= [логический адрес] <= FFFFh:000Fh
На рис. 17 изображено все доступное адресное пространство оперативной памяти. Показан некоторый сегмент (он может относиться к сегменту кода, данных, стека или к дополнительному сегменту), расположенный по адресу 0010h. В самом сегменте указан адрес с помощью смещения 0120h. Таким образом, логический адрес 0010h:0120h соответствует физическому адресу 00120h.
Рис. 17. Соответствие физического адреса логическому.
Запись вида CS:, DS:, SS: и ES: принято называть префиксом сегментного регистра. Префикс указывается перед адресом, который должен быть просегментирован. С помощью префикса замены сегмента можно обратиться к операнду с использованием любого из четырёх сегментных регистров. Функциональное распределение сегментных регистров следующее (рис. 18).
Регистр CS всегда должен указывать на начало сегмента команд. Адрес очередной подлежащей выполнению команды, указывается регистровой парой CS:IP. Указатель команд IP содержит смещение команды, отсчитанное от начала сегмента команд. Регистр DS должен указывать на начало сегмента данных, а SS – на начало сегмента стека. Регистр ES (а также позднее введенные FS и GS) может указывать на любой сегмент памяти. Например, инструкция MOV AX, [BP] загружает в регистр AX содержимое слова памяти по адресу SS:BP, однако, инструкция MOV AX, ES:[BP] загрузит содержимое слова по адресу ES:BP.
Рис. 18. Распределение памяти с помощью сегментных регистров.
Коды сегментных префиксов приведены в табл. 5. Вместо сегментного регистра DS может использоваться любой сегментный регистр, для чего необходимо задать соответствующий префикс замены сегмента. Доступ к стековой памяти с использованием указателя стека SP всегда подразумевает использование только сегментного регистра SS.
Табл. 5. Сегментные префиксы.
Do'stlaringiz bilan baham: |