Введение в технологию программирования на языке Ассемблера, страница 2

Формат байта COP в машинной команде с одним байтом COP может иметь шесть разновидностей, которые приведены на рис П.2. Двухбайтные поля, используемые под COP, рассматривать не будем. Они, как правило, применяются в командах, используемых в системном программном обеспечении, да в командах битовых операций.

           Рис П.2  Форматы байта COP в машинной команде.

Формат а) характерен для команд сброса и установки бит регистра флагов и команд стековых операций.

Форматы б), в) и г) характерны для большинства двухоперандных команд, причем формат б) используется для команд, где один операнд присутствует неявно (например, в командах умножения и деления, а формат г) используется для команд, в которых присутствует непосредственный операнд.

Признаком размерности операнда в коде команды служит состояние младшего (нулевого) бита D0 (бита  w) в поле байта кода операции (COP) команды. При w = 0 используются 8 разрядные операнды, а при w = 1,  16 или 32 разрядные.

То есть, если бит w = 0, то операндом является 8-ми битовый код, который берется из AL, BL и т.д. Если же бит w = 1, то операнд берется в зависимости от того, каким он установлен битом D дескриптора и префиксами переопределения размеров операндов, либо из AX, BX и т.д. (при 16 разрядных операндах) либо из EAX, EBX и т.д. (при установлении 32 разрядных операндов). Значение же самого бита w определяется при компиляции, исходя из описания вводимых данных, либо (при обращении к памяти) по указанию в команде (byte ptr, word ptr, и.т.д.).

Состояние второго справа бита, бита D1 (бит d) в поле байта кода операции (COP) команды, определяет направление передачи данных в двухоперандных командах. При d = 0 происходит передача данных из регистра (reg) в регистр/память (reg/mem), а при  d = 1 происходит передача данных из регистра/памяти (reg/mem) в регистр (reg).

В командах сдвига и вращения, бит D1 COP (бит d) определяет сдвиг на 1 разряд (d = 0) или на число разрядов, указанных в CL (d= 1).

В командах формата г), когда используется непосредственный операнд, при w = 0, бит s не играет роли и процессором игнорируется. Однако когда бит w = 1, то есть, когда осуществляется операция с двухбайтными словами, то равенство бита s единице говорит, что непосредственный операнд является младшим байтом полного операнда, и должен рассматриваться как число со знаком (т.е. старший байт непосредственного операнда является знаковым расширением младшего байта). Если же бит s = 0, то это говорит о том, что непосредственный операнд 16 разрядный и указан полностью.

Форматы кода операции д) и е) используются в однооперандных командах, когда операнды находятся в регистрах. Это характерно, например,  для однобайтных команд типа INC AX, или DEC EDX.

Формат байта “mod R/M” в формате команды приведены на рис. П.3.

Основное назначение этого байта – определение месторасположения операндов, заданных в команде. Кодирование “mode” в байте “mod R/M” кода команды приведено в табл. П.5.

7                  6               5             4               3             2              1              0     

mod

reg/op

reg/mem

Код регистра или способ вычисления эффективного адреса ЕА (при mode # 11). Определяет  месторасполо-   жение первого операнда совместно с байтом SIB (если он присутствует)

 

Код типа смещения DISP при вычислении эффективного адреса, или указание на регистровую адресацию

 

Код регистра, определяющего месторасположение второго операнда или расширение кода

операции

 

Рис. П.3  Формат байта “mod R/M” кода команды.

Таким образом, код 11 означает, что оба операнда команды размещены в регистрах в соответствии с кодами указанными в остальных двух полях байта. Остальные три варианта определяют размещение одного операнда в регистре, а второго – в памяти. При этом операнд, расположенный в регистре определяется кодом в поле «reg/op», а операнд, расположенный в памяти определяется кодом в поле «reg/mem», причем смещение в команде «disp» (disp – displacement), при вычислении эффективного адреса операнда, размещенного в памяти, определяется кодом поля «mod».

                                                                                        Таблица П.5

           Кодирование поля mode

Код

Функциональное значение кода

00

disp= 0

01

disp  =  знак disp 8

10

disp = disp 16 (32)

11

Признак регистровой адресации

где disp 8,  disp 16 (32)  - восьмиразрядное и шестнадцатиразрядное (или 32 разрядное) смещение в команде Кодирование поля “reg” в байте “mod R/M” кода команды приведено в табл.П.6.

Формирование эффективного адреса памяти второго операнда, осуществляемое при поле mode ¹11, вычисляется при 16 битовой адресации (при R-режиме процессоров i386+)  в соответствии с табл.П.7.  При 32 битовой адресации (в Р - режиме процессоров i386+) – в соответствии с табл. П.8 (при поле r/m ¹100), и табл. П.11 (при поле r/m = 100).

                                                                                         Таблица П.6

Кодирование поля reg

Поле

reg

Поля w в команде нет

Поле w в команде имеется

16-битовый операнд

32-битовый операнд

16-битовый операнд

32-битовый операнд

w = 0

w = 1

w = 0

w = 1

000

AX

EAX

AL

AX

AL

EAX

001

CX

ECX

CL

CX

CL

ECX

010

DX

EDX

DL

DX

DL

EDX

011

BX

EBX

BL

BX

BL

EBX

100

SP

ESP

AH

SP

AH

ESP

101

BP

EBP

CH

BP

CH

EBP

110

SI

ESI

DH

SI

DH

ESI

111

DI

EDI

BH

DI

BH

EDI