Структура команд МП

 

Машинные команды МП занимают от одного до 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

Смысл полей аналогичен описанным выше.

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