М а ш и н н ы е

к о д ы

Машинные коды.

Машинным кодом будем называть внутреннее представление команд Ассемблера в памяти компьютера, т.е. собственно команды процессора Intel. Эти команды имеют определенную структуру, состоящую в общем случае из восьми элементов — полей. Каждое поле имеет длину 1 байт. В машинном коде ключевым полем, является байт кода операции (поле 3), остальные элементы являются необязательными. Максимальное число полей реальной команды обычно не превышает шести.

Байт кода операции.

Что же собой представляет байт кода операции?
Как процессор знает, что ему надо делать?
Байт кода операции может иметь несколько модификаций.
Рассмотрим их и укажем основные операции, которые они поддерживают. Кодировка кода операции для различных команд Ассемблера приведена ниже.

ВАРИАНТ 1 - Большинство двухадресных команд.
Биты 7 6 5 4 3 2 1 0
КОП d w
s w
v w
z

Биты 2-7 определяют информационную часть кода операции (КОП).

Бит 0 может интерпретироваться двояко:

  • длина операндов:
    • w=t — обрабатывается слово;
    • w=0 — обрабатывается байт,
  • значение флага ZF при использовании префикса повторения REP:
    • z=1 — флаг ZF=1 (команды REPZ/REPE);
    • z=0 — флаг ZF=0 (команды REP/REPNE).

Бит 1 — может иметь три интерпретации:

  • задавать бит направления передачи информации (в этом случае в команде ОБЯЗАТЕЛЬНО присутствует байт способа адресации):
    • d=l — г/m ==> reg;
    • d=0 — г/m <== reg.
  • Значение reg определяется по ниже.
  • бит размера непосредственного операнда:
    • s=l — длина данного 8 бит;
    • s=0 — длина данного 16 бит,
  • бит, определяющий значение счетчика в циклических командах:
    • v=1 — значение счетчика находится в регистре CL;
    • v=0 — значение счетчика равно 1.

Кодировка регистров.
reg w=0 w=1
000 AL AX
001 CL CX
010 DL DX
011 BL BX
100 AH SP
101 CH BP
110 DH SI
111 BH DI

Кодировка сегментных регистров.
rs Cегментные регистры
00 ES
01 CS
10 SS
11 DS


ВАРИАНТ 2 — команды загрузки непосредственных данных в регистр reg.
Биты 7 6 5 4 3 2 1 0
КОП w reg

Значение битов w и reg аналогично предыдущему.

ВАРИАНТ 3 — команды загрузки в регистр reg при работе со стенами, одноадресные команды.
Биты 7 6 5 4 3 2 1 0
КОП reg


ВАРИАНТ 4 — команды работы с сегментными регистрами.
Биты 7 6 5 4 3 2 1 0
0 0 0 rs 1 1 d

Бит 0 задает бит направления передачи информации (в этом случае в команде ОБЯЗАТЕЛЬНО присутствует байт способа адресант):

  • d=l — г/m ==> rs;
  • d=0 — г/m <== rs.

Значение rs определяется no табл. "Кодировка сегментных регистров".

ВАРИАНТ 5 — команды загрузки аккумулятора АХ (AL) в память и наоборот, работа с портами, арифметические операции с непосредственной адресацией и аккумулятором АХ(AL), команды деления и умножения.
Биты 7 6 5 4 3 2 1 0
КОП w

Байт способа адресации.

Байт способа адресации (БСА) присутствует в машинном коде только в том случае, если в байте кода операции недостаточно информации об адресации операндов (обычно это двухадресные команды) или если команда имеет вторичный код операции.

Байт способа адресации имеет три разновидности:

Биты 7 6 5 4 3 2 1 0
mod reg r/m
Байт способа адресации для обычных двухадресных команд.
Биты 7 6 5 4 3 2 1 0
mod 0 rs r/m
Байт способа адресации для команд, работающих с сегментными регистрами.
Биты 7 6 5 4 3 2 1 0
mod ВторКОП r/m
Байт способа адресации для команд со вторичным кодом операции.

Биты 6-7 (mod) задают режим адресации. В зависимости от их значения процессор распознает значения битов 0-2 (г/m).
В зависимости от бита направления d определяется, какой из операндов является приемником, а какой источником.

Если mod=11, r/m=reg, т.е. и приемник и источник являются регистрами . В этом случае имеем дело с регистровой адресацией. Как правило, это - самый быстрый способ адресации, ко который дает и короткий код. Но регистров не так уж и много, поэтому нужен разумный компромисс.

Смещение имеет длину 1 байт, если mod=01 и 2 байта, если mod=10.

Режимы адресации.

mod r/m Формат операнда Название режима адресации
00 000 [BX+SI] Регистровый косвенный по базе ВХ или ВР с индексированием пo SI или DI (базово-индексный)
001 [BX+DI]
010 [BP+SI]
011 [BP+DI]
100 [SI] Регистровый косвенный по индексу SI или DI(индексный)
101 [DI]
110 смещение Прямой (относительный)
111 [BX] Регистровый косвенный по базе ВХ (базовый)
01
10
000 [BX+SI]+смещение По базе ВХ или ВР с индексированием по SI или DI и смешением (базово-индексный со смещением)
001 [BX+DI]+смещение
010 [BP+SI]+смещение
011 [BP+DI]+смещение
100 [SI]+смещение Прямой (относительный) с индексированием по SI или DI
101 [DI]+смещение
110 [BP]+смещение По базе BX или BP со смещением
111 [BX]+смещение

Примеры ассемблирования.

  • Строка 0006 В8 0002         MOV АХ,2
    Адрес (смещение) данной команды равен 0006. Пока адрес нам НЕ нужен.

    КОП = В8. Он соответствует команде MOV AX,im16 . Команда имеет непосредственный режим адресации (16-разрядная константа непосредственно встраивается в машинную команду). Распишем КОП в двоичной системе счисления: 1011 1000 и попробуем понять, какой из вариантов байта кода операции нам подходит. Первый вариант нам НЕ подходит, поскольку бит 0 (w)=0 (наша команда НЕ работает с 8-разрядными данными). Вариант 2 нам подходит: w=l, reg=000=AX:

    Биты 7 6 5 4 3 2 1 0
    1 0 1 1 1 0 0 0
    КОП w reg


  • Строка 000D 8В DA         MOV BX,DX
    Здесь мы имеем дело с регистровой адресацией. КОП = 8В. Он соответствует команде MOV rl6,r/m. Это обычная двухадресная команда, у которой есть байт способа адресации (БСА). Распишем КОП и БСА в двоичной системе счисления: 1000 1011 1101 1010 и попробуем их расшифровать. Это — однозначно вариант 1:
    Байт кода операции
    Биты 7 6 5 4 3 2 1 0
    1 0 0 0 1 0 1 1
    КОП d w
    Байт способа адресации
    Биты 7 6 5 4 3 2 1 0
    1 1 0 1 1 0 1 0
    mod reg r/m


    Проанализируем БСА совместно с КОП. Получаем: mod=11, значит, r/m=reg=010=DX (w=1). Значение собственно поля reg=011=BX, Бит d=1, значит, регистр ВХ является приемником.

    Вот мы с вами и сделали ассемблирование. Это же делает и компилятор! Как видите, НИЧЕГО страшного в этом ассемблировании нет!



Программирование на Машинно-Ориентированных Языках.
Преподаватель: Коробов С.А.