Структура команд мп
Машинные команды МП занимают от одного до 6 байтов, причем операционная часть занимает один или 2 первых байта команды, остальные байты – адресная часть.
Операционная часть в свою очередь делится на код операции (КОП) и модификаторы. Модификаторы располагаются после КОП и указывают типы операндов и способы их адресации.
Операнды могут быть указаны:
- в самой команде (непосредственная адресация);
- в одном из регистров МП, тогда в команде указывается этот регистр (регистровая адресация);
- в оперативной памяти по адресу, который тем или иным способом описан в команде (прямая, базовая или индексная адресация;
- некоторые команды требуют, чтобы один из операндов находился в определенном регистре (например, в аккумуляторе AX), тогда операнд не указывается в команде (подразумеваемая адресация).
Команды в языке ассемблера (ЯА) МП фирмы Intel в основном двухоперандные (двухадресные). Результат выполнения команды обычно помещается на место первого операнда.
Форматы команд разнообразны, т.к. для каждого операнда может использоваться собственный способ адресации. Рассмотрим основные форматы двухадресных команд.
В общем виде команду можно записать в виде:
Op1 := op1 ¤ op2,
Где ¤ – какая-то операция, заданная кодом операции.
Например, команда ЯА пересылки данных из op1 в op2 имеет вид
Mov op1, op2
и выполняет копирование содержимого op2 в op1, т.е.
op2 := op1.
В данной команде
op1 – может быть регистром или ячейкой памяти,
op2 - может быть регистром, ячейкой памяти или непосредственным операндом.
Заметим, что содержимое op2 не изменяется.
Отметим также основные правила записи команд ЯА:
- мнемоника (имя) команды отделяется от операндов хотя бы одним пробелом;
- операнды разделяются запятой;
- после точки с запятой в той же строке можно поместить комментарий.
Рассмотрим форматы команд и методы адресации на примере команды пересылки, описанной выше.
1. Формат «Регистр-регистр» (Рг-Рг) – 2 байта
Например,
Mov AL, AH
Выполняет пересылку AL := AH
В общем виде
reg? := reg1 ¤ reg2
Формат команды (см. рис.4)
1-й байт | 2-й байт | ||||
КОП | d | w | md | reg1 | reg2 |
Рис. 4
Здесь w – определяет размер операндов, т.е. w = 0 – слова (2 байта), w = 1 – байты;
d – бит направления пересылки, d = 0 – приемник результата - reg1, d = 1 – приемник результата – reg2;
md – поле режима адресации (2 бита), для формата «Рг-Рг» md = 11;
reg1, reg2 – содержат трехразрядный двоичный код, который обозначает конкретный регистр МП . (см. табл.1):
Таблица 1.
Значение поля reg | |||||||||
Адресуемый | w=0 | AL | CL | DL | BL | AH | CH | DH | BH |
регистр | w=1 | AX | CX | DX | BX | SP | BP | SI | DI |
2. Формат «Регистр-память» (Рг-ЯП) – 2÷4 байта
Например,
Mov AX, X ; AX := ОП(X)
Mov X, AX ; ОП(X) := AX
Здесь запись ОП(X) означает ячейку оперативной памяти, адресованную при помощи имени X.
Формат команды (см. рис.5)
1-й байт | 2-й байт | 3-й, 4-й байты | ||||
КОП | d | w | md | reg | r/m | Adr (0 ÷ 2 байта) |
Рис. 5
Здесь w – см. выше;
d – см. выше, а именно при d = 0 – запись результата в ячейку памяти, при d = 1 – запись результата в регистр;
md – указывает, сколько байтов в команде занимает адрес в двоично-кодированном виде ( т.е. может принимать значения 00, 01, 10);
поле r/m указывает способ модификации адреса.
От сочетания полей md и r/m могут образоваться различные способы адресации.
Так при md = 00 и r/m = 110 – прямая адресация, т.е. в следующем 3-ем байте команды указан адрес ячейки памяти.
При других сочетаниях образуются следующие способы адресации:
- базово-индексная, при которой физический адрес вычисляется по выражению
[Рг Б] + [Рг И] + disp,
где disp – смещение, которое может быть константой или выражением;
[Рг Б] – содержимое базового регистра, а именно BP или BX;
[Рг И] – содержимое индексного регистра, а именно SI или DI;
- индексная адресация - [Рг И] + disp;
- базовая адресация - [Рг Б] + disp;
- при disp = 0 адресация называется косвенной.
Между индексной и базовой адресациями нет различий, они выделены для ограничения числа вариантов адресации, т.е при базово-индексной адресации не допускается использование двух регистров из одной группы. Например, нельзя использовать два базовых регистра в одной команде.
В программе на ЯА можно записать эти способы адресации разными формами записи (см табл. 2 ).
Таблица 2
Способ адресации | Обозначение операнда в команде ЯА |
Базово-индексная | disp[Рг Б] [Рг И] disp[Рг Б] + [Рг И] disp[Рг Б + Рг И] |
Индексная | disp[Рг И] [Рг И] + disp |
Базовая | disp[Рг Б] [Рг Б] + disp |
Косвенная | [Рг И] [Рг Б] |
В поле adr содержится указание адреса в “польской инверсной записи” (или LEM – little endian method), при которой младший байт располагается раньше старшего.
Например, адрес 620Bh займет в команде 2 байта
1-й байт | 2-й байт | 3-й байт | 4-й байт |
0B |
3. Формат «Регистр-непосредственный операнд» (Рг-НО) – 3÷4 байта
Формат команды (см. рис.6)
1-й байт | 2-й байт | 3-й, 4-й байты | ||||
КОП | s | w | md | КОП’ | reg | data (1 ÷ 2 байта) |
Рис. 6
Здесь s используется в сочетании с w в разный командах немногом по-разному , но смысл – выбор длины непосредственного операнда 1 или 2 байта;
КОП’ – дополнительное поле, расширение кода операции в двухоперандных командах с непосредственным операндом;
reg - обозначает конкретный регистр в сочетании с w;
data – поле данных, причем если это слово, то – в польской инверсной записи.
4. Формат «Память-непосредственный операнд» (ЯП-НО) – 3÷6 байтов
Формат команды (см. рис.7)
1-й байт | 2-й байт | С 3-го по 6-й байты | |||||
КОП | s | w | md | КОП’ | r/m | adr (1 ÷ 2 байта) | data (1 ÷ 2 байта) |
Рис. 7
Смысл полей аналогичен описанным выше.
Наибольшие сложности при анализе машинных кодов программ возникают при записи непосредственных операндов, т.к. отрицательные числа представляются в дополнительных кодах и хранятся в памяти в польской инверсной записи.