Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
на печать11.doc
Скачиваний:
41
Добавлен:
11.06.2015
Размер:
1.04 Mб
Скачать

3. Форматы и типы команд 80х86, режимы адресации операндов

Команда содержит

0-5 байт 1 байт 0;1 байт 0;1 байт 0;1;2;4 байта 0;1;2;4 байта

Префикс

Код операции

Режим адресации(16бит)

Режим адресации(32бит)

Смещение

константа

Префикс усилитель, приставки к команде, которые уточняют ее смысл

Виды:

  1. префикс замены операнда (позволяет применить 32-х битные операнды в 16 битных режимах и наоборот)

  2. замена адреса (16-битная переадресация в 32-х битном режиме и наоборот)

  3. замена сегмента (позволяет выбрать сегмент)

  4. префикс повтора (заставляет повторяться след. За ним команду)

  5. префикс захвата шины (в многопроцессорных системах позволяет производить операции ввода/вывода, владея шиной)

Код операции. Структура:

Код

Код

W

Код

W

D

Без операндная команда

С одним операндом (w-вид операнда)

Двуоперандная команда (w,d-вид операнда)

Режим адресации:

С одним операндом mod – номер режима

7 6 5 3 2 0

Mod

Код

r/m

С двумя операндами reg- регистр

7 6 5 3 2 0

Mod

Reg

r/m

С двумя операндами одни операнд всегда находиться в регистре. Поле mod указывает где находиться операнд, в регистре или памяти. Если mod=00, то операнд находится в в регистре, если mod = 01,10,11 тогда адрес вычисляется как сумма одного или нескольких регистров или дополнительного смещения. В 32-битном режиме следует еще 1 байт адрес = смещение + база + индекс.

4. Описание адреса операнда в команде ассемблера

Большинство команд процессора вызываются с аргументами, которые в ассемблере принято называть операндами. Например: команда сложения содержимого

регистра с числом требует задания двух операндов — содержимого регистра и числа. Далее рассмотрены все существующие способы задания адреса хранения операндов - способы адресации.

Регистровая адресация Операнды могут располагаться в любых регистрах общего назначения и сегментных регистрах. mov ax.bx

Непосредственная адресация Некоторые команды (все арифметические, кроме деления) позволяют указывать один из операндов непосредственно в тексте программы. Например: команда mov ax,2

Прямая адресация Если у операнда, располагающегося в памяти, известен адрес, то его можно использовать. Если операнд - слово, находящееся в сегменте, на который указывает ES, со смещением от начала сегмента 0001, то команда mov ax.es:0001 поместит это слово в регистр АХ.

Косвенная адресация По аналогии с регистровыми и непосредственными операндами адрес операнда в памяти также можно не указывать, а хранить в любом регистре. Например, следующая команда помещает в регистр АХ слово из ячейки памяти, селектор сегмента которой находится в DS, а смещение - в ВХ: mov ax,[bx]

Как и в случае с прямой адресацией, DS используется по умолчанию, но не

всегда: если смещение берут из регистров ESP, EBP или ВР, то в качестве сегмен-

тного регистра применяется SS. В реальном режиме можно свободно работать со

всеми 32-битными регистрами, надо только следить, чтобы их содержимое не пре-

вышало границ 16-битного слова.

Адресация по базе со сдвигом Теперь скомбинируем два предыдущих метода адресации. Следующая команда mov ax,[bx+2]

помещает в регистр АХ слово, которое есть в сегменте, указанном в DS, со смещением на два больше, чем число из ВХ. Так как слово занимает ровно 2 байта, эта команда поместила в АХ слово, непосредственно следующее за тем, которое было

в предыдущем примере. Другие допустимые формы записи этого способа адресации:

mov ax,[bp]+2 mov ax,2[bp]

Косвенная адресация с масштабированием Этот метод адресации полностью идентичен предыдущему, однако с его помощью можно прочитать элемент массива слов, двойных слов или учетверенных слов, просто поместив номер элемента в регистр:

mov ax, [esi*2]+2

Множитель, который равен 1, 2,4 или 8, соответствует размеру элемента массива — байту, слову, двойному или учетверенному слову.

Адресация по базе с индексированием В этом методе адресации смещение операнда в памяти вычисляется как сумма

чисел, содержащихся в двух регистрах, и смещения, если оно указано. Все перечис-

ленные ниже команды представляют собой разные формы записи одного и того же

действия:

mov ax,[bx+si+2] mov ax,[bx][si]+2 mov ax,[bx+2][si] mov ax,[bx+2][si]

mov ax,[bx][si+2] mov ax,2[bx][si]

В регистр АХ помещается слово из ячейки памяти со смещением, равным сум-

ме чисел, содержащихся в ВХ, SI, и числа 2.

Адресация по базе с индексированием и масштабированием Это самая полная схема адресации, в которую входят все случаи, рассмотрен-

ные ранее как частные. Полный адрес операнда можно записать как выражение,

представленное

CS: EAX EAX

SS: …. ….. 1

DS: EDX + EDX * 2 + смещение ES: EBP/ESP EBP 4 FS: EDI/ESI EDI/ESI 8 GS:

5.Структура программы на ассемблере: Косвенные ссылки, ссылки назад, вперед. Точка входа в программу Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка, каждое из которых занимает отдельную строку кода программы. Для реализации управляющих конструкций (циклы, выбор, переключатель) служат команды управления программой, которые можно разделить на 3 группы: 1. Безусловная передача управления (безусловные переходы) 2. Условные переходы (ветвления) 3. вызовы подпрограмм Безусловный переход. JMP <адрес> Команда безусловного перехода модифицирует программный счетчик, помещает в него новый адрес, с которым нужно продолжить выполнение программы. Никаких дополнительных проверок не производится. В качестве адреса – метка, на которую нужно передать управление. В этом случае переход называется прямым. В качестве адреса можно указать имя переменной, которая содержит адрес (тогда переход косвенный). По способу описания адреса существует 3 вида безусловных переходов: 1) короткий переход; 2) ближний переход; 3) дальний переход Условный переход. Выполняется проверка, имеется или нет какое-то условие. Проверяемое условие чаще всего задается в виде флага или комбинаций флагов во флаговом регистре. Точка входа в программу. .Code Start: … End Start

  1. строка ассемблера

Общий формат оператора ассемблера имеет следующий вид:

[Метка:]Код_операции[Операнд1[,Операнд2]][;Комментарий],

где элементы, указанные в квадратных скобках, могут отсутство­вать.

Пробелы вводятся произвольно, но минимум один пробел дол­жен быть после кода операции.

Метка - это идентификатор, присваиваемый первому байту того оператора, в котором она появляется.

Код_операции - это мнемоническое обозначение соответствую­щих команд процессора. Операнды оператора ассемблера описываются выражениями. Вы­ражения конструируются на основе операций над числовыми и текс­товыми константами, метками и идентификаторами переменных с использованием знаков операций и некоторых зарезервированных слов. Ниже приведены все определенные в ассемблере операции. Порядок старшинства операций от высшей к низшей:

LENGTH, SIZE, WIDTH, MASK, (), [], <>

.

:

PTR, OFFSET, SEG, TYPE, THIS

HIGH, LOW

+ (unary), - (unary)

*, /, MOD, SHL, SHR

+, -

EQ, NE, LT, LE, GT, GE

NOT

AND

OR, XOR

SHORT, .TYPE

Старшинство операций определяет порядок, по которому будет вычисляться выражение. Более старшие операции будут произво­диться раньше операций, имеющих меньшее старшинство. Операции, стоящие в одной строке, имеют равный приоритет. Операции равного старшинства вычисляются слева направо. Операции, стоящие в скобках, выполняются первыми.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]