Непосредственная адресация. Адрес «запрятан» в коде операции. Очевидный пример: mod=11, значит приемник - это регистр, номер которого указывается в COP.
Прямая адресация. Следом за COP должен следовать адрес ячейки памяти (сначала младший байт, затем - старший). Таким образом, в машинном коде сразу виден адрес приемника.
В таблице 13: mod=00, reg/mem=110.
Косвенная адресация. В коде операции указывается источник (хранилище) адреса ячейки памяти. Пример: mod=00, reg/mem=100, 101, 111. Во всех этих случаях адрес приемника автоматически будет извлекаться из регистра SI, DI или ВХ. Прежде чем обратиться к ячейке памяти, адрес этой ячейки надо загрузить в соответствующий регистр.
Относительная адресация. В этом случае вместо прямого адреса следом за кодом операции располагают смещение (disp). Это смещение (в табл. 13 однобайтное смещение обозначено как D1, а двухбайтное - как D2) складывается с текущим адресом, который может храниться в ВР, ВХ, SI, DI. Причем, это смещение со знаком (старший разряд выступает в качестве знакового бита), поскольку смещение может быть как вперед, так и назад, и в дополнительном коде [3].
Все эти четыре способа адресации являются основными, далее возможны комбинации из этих способов со смещениями, что и следует из табл. 13.
Также конечный адрес в самом сложном случае может формироваться как сумма двух регистров и смещения (напри-
мер, mod=01, mod=10, и reg/mem=000...011).
В команде MOV, если приемником может быть и регистр МП, и ячейка ЗУ, то источником - только регистр. Чтобы сделать источником ячейку памяти в COP отводится один разряд D9 для изменения направления пересылки (d - down - вниз). Если d=0, то направление не меняется: dst остается приемником, a src — источником. Если же d=l, то направление переворачивается в обратную сторону, то есть src - становится приемником, a dst - источником.
44
Рассмотрим пример по синтезу машинной команды, которая осуществляет перемещение содержимого регистра BL
врегистр AL (кратко: <A>:=<BL L >):
-w=0(1 бaйт) - пересылается информация размером в 1
байт;
-d=0 (направление не меняется);
-src=011 (адрес регистра BL — из табл. 12);
-dst=l 1 000 (mod=11— из табл. 13; reg/mem=reg=000 -
адрес регистра AL —из табл. 12).
Рис. 11. Машинный формат команды MOV AL, BL
Разбиваем команду в машинном формате на тетрады и переводим в шестнадцатеричный код. Получается, что вся команда состоит из двух байт: 88 D8.
Задачи :
1.Переслать содержимое регистра R1 в регистр R2 (табл. 14). Кратко: <R2>:=< R1>. Ассемблер: MOV R2, R1;
2.Отправить в ячейку памяти с адресом A1 содержимое регистра R3. Кратко: МА1: =<R3>. Ассемблер: MOV [A1],R3.
3.Отправить в ячейку памяти с адресом A2 значение
D1. Кратко: MAI. =D1. Ассемблер :MOV BYTE [A2],D1;
4.Отправить в 2 ячейки памяти по адресу A3 два байта D2. Кратко: МА3: =D2. Ассемблер: MOV WORD [A3],D2.
45
Таблица 14
Варианты заданий
Порядок выполнения работы :
1. Согласно варианту задания сформировать машинный
код.
2. Запустите программу DEBUG.exe. Для ОС Windows XP и Vista выполните следующие действия:
-в меню «Пуск» выберите команду «Выполнить»;
-наберите в командной строке «cmd» для запуска командного интерпретатора;
-наберите команду debug в командном интерпретаторе, для запуска отладчика.
3. Занесите в память по смещению 100 машинный код при помощи следующей команды:
46
e 100 <COP>,
где <COP> - это машинный код команды в шестнадцатеричной системе счисления; 100 - относительный адрес.
Пример команды: -e 100 88 D8. Байты команды необходимо отделять друг от друга пробелами.
4.Значения большинства регистров в среде debug при первоначальном запуске равны нулю. Чтобы увидеть перемещение данных из одного регистра в другой командой -r устанавливаем значение регистров. Команда -r без параметров показывает содержимое всех регистров (в том числе и регистра флагов). Команда -r <reg> показывает содержимое регистра «reg» и позволяет установить новое значение в шестнадцатеричном коде (новое значение вводится после двоеточия). Причем обращение к 8-разрядным регистрам, например, к AL и BH напрямую невозможно. Можно изменить только 16-разрядные регистры, такие как AX и BX.
5.Осуществите пошаговое выполнение команды в основной памяти по смещению 100 при помощи команды -t =100. Не пропустите знак «=», иначе отладчик выполнит не одну команду, которая размещена по адресу 100, а 100 команд, начиная с текущего адреса.
6.Просмотрите содержимое регистров при помощи команды r. Убедитесь, что закодированная в машинный формат команда, выполняет действие в пункте 1.
7.Выполните пункты 1-4 для второго задания из раздела заданий. Для просмотра содержимого памяти по определенному адресу выполните команду:
-d <addr>,
где d -команда отладчика debug для просмотра содержимого участка памяти; addr - адрес начала участка памяти. Можно указывать как полный адрес, указав сегмент и смещение, или указывать только смещение от начала сегмента. В данной работе достаточно использовать только смещение, так как все сегменты сопоставлены на один и тот же блок памяти.
47
При выполнении данной команды на экран выдается 8 строк по 16 байт. Убедитесь, что команда перемещает содержимое регистра R3 в ячейки ОЗУ с адресом A1.
6. Выполните аналогичные действия для заданий 3 и 4 раздела заданий. Для занесения исходных данных в память, которые будут перемещаться при выполнении команды в машинном формате, используйте команду -e в отладчике.
7. Оформите отчет по работе. В отчете должно содержаться:
-цель работы;
-задание;
-машинные форматы команд для каждого пункта за-
дания;
-экранные формы отладчика debug с результатами после выполнения команд;
-выводы по работе.
Контрольные вопросы :
1.Чем отличается представление команд в машинном формате от символьного представления?
2.Сколько байт максимально может содержать команда
вмашинном формате МП 8086? Сколько минимально?
3.Каково назначение основных полей команды MOV
МП8086?
4.За что отвечает поле d в команде MOV?
5.Какое будет значение поля w («0» или «1»)в машинном формате команды перемещения, если в качестве источника используется регистр AL?
6.Какие функции выполняет поле mod?
7.Какая комбинация полей mod и reg/mem определяет косвенную адресацию?
8.Что делает команда -e в среде debug?
9.Как просмотреть содержимое памяти по смещению
500 в среде debug?
48