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

6.7. Структура команд

Теперь рассмотрим структуру машинных команд самых распространённых форматов регистр-регистр и регистр-память.

  • Формат регистр–регистр.

6 бит

1 бит

1 бит

1 бит

1 бит

3 бита

3 бита

КОП

d

w

1

1

R1

R2

Команды этого формата занимают 2 байта. Первая часть команды – код операции – занимает в команде 6бит, за ним следуют однобитные поляdиw, гдеd– битнаправления, аw– битразмера аргумента, последующие два бита для этого формата равны1, а последние две части по3бита каждая указывают на регистры – операнды.

Стоит подробнее рассмотреть назначение битов dиw. Битdзадаёт направление выполнения команды, а именно:

<R1> := <R1>  <R2>приd = 0

<R2> := <R2>  <R1>приd = 1.

Бит wзадаёт размер регистров-операндов, имена которых можно определить по следующей схеме:

R1,2

w = 1

w = 0

000

AX

AL

001

CX

CL

010

DX

DL

011

BX

BL

100

SP

AH

101

BP

CH

110

SI

DH

111

DI

BH

В младших моделях ЭВМ нашего семейства в таком формате возможна работа лишь с упомянутыми в таблице регистрами. В последующих же моделях возможности этого формата были расширены, но за счёт увеличения длины команды. Мы будем пользоваться и другими видами формата регистр-регистр, например, командой mov ds,ax, но выписывать их внутреннее представление не будем.

Как видно из таблицы, архитектурой не предусмотрены операции формата r8–r16, т.е.операции над регистрами разной длины запрещены, например, команды типа add AL,BX являются некорректными.Поэтому появляется необходимостьпреобразования типовиз короткого целого в длинное, и из длинного в сверхдлинное. Такое преобразование зависит от трактовки числа – знаковое или беззнаковое. В первом случае число всегда расширяется слева нулями, а во втором – размножается знаковый бит (для знаковых чисел незначащими двоичными цифрами будут 0 для неотрицательных и 1 для отрицательных значений). Для этого в языке машины предусмотрены безадресные команды, имеющие а Ассемблере такую мнемонику:

cbw(convert byte to word)

и

cwd(convert word to double),

которые производят знаковоерасширение соответственно регистраALдоAXиAXдо пары регистров<DX,AX>, которые в этом случае рассматриваются как один длинный 32 битный регистр.

Преобразование целого значения из более длинного формата в более короткий (усечение) производится путём отбрасывания соответствующего числа левыхбитов целого числа. Усечённое число получится правильным, если будут отброшены тольконезначащиебиты. Для беззнаковых чисел это всегда нулевые биты, а для знаковых – биты, совпадающие со знаковым битомусечённогочисла.

  • Формат регистр–память (и память-регистр).

КОП

R1

A2

Операнд A2может иметь один из приведённых ниже трёх видов:

  1. A2 = A,

  2. A2 = A[M1],

  3. A2 = A[M1][M2].

Здесь A– задаваемое в команде смещение длиной 1 или 2 байта (заметим, что нулевой смещение может и не занимать места в команде),M1иM2– так называемыерегистры-модификаторы. Как мы сейчас увидим, значение адреса второго операндаA2будетвычислятьсяпо определённым правилам, поэтому этот адрес часто называютисполнительнымадресом.

Стоит отметить один факт. До сих пор адресоммы называли физический номер ячейки в памяти машины. В языке Ассемблераадресомпринято называтьсмещениеячейки относительно начала того сегмента, в котором она находится. Для обозначения полного адреса будем употреблять терминфизический адрес.

Рассмотрим подробнее каждый их трёх возможных видов операнда A2. ПриA2 = Aфизический адрес вычисляется центральным процессором по формуле:

Aфиз := (B*16 + A)mod 220,

где B, как обычно, обозначает значение одного из сегментных регистров. ЗаписьA2 = A[M1]означает использованиерегистра-модификатора,которым может быть любой из следующих регистров:BP,BX,SI,DI.В этом случае физический адрес вычисляется по формуле

Aфиз := (B*16 + (A + <M1>)mod 216)mod 220,

где вместо <M1>подставляется содержимое регистра-модификатора (одного из четырёх указанных). ЗаписьA2 = A[M1][M2] 1обозначает вычисление физического адреса по формуле:

Aфиз := (B*16 + (A + <M1> + <M2>)mod 216)mod 220,

где используются сразу два регистра-модификатора. На месте M1можно указывать любой из регистровBX или BP, а на местеM2 – любой из регистров SI или DI. Использование, например, регистровBXиBP(как иSIиDI) одновременно в качестве модификаторов запрещено. В старших моделях почти все ограничения на использование регистров модификаторов также было снято (за счёт увеличения длины команды).

В качестве примера вычислим физический адрес второго операнда команды сложения формата RX, на языке Ассемблера эту команду можно записать в видеadd ax,6[bx][di]. Пусть регистры имеют следующие значения (в шестнадцатеричном виде перед числом записывается ноль, если оно начинается с цифрA–F):

bx = 0FA00h, di = 0880h, ds = 2000h

Тогда

Aфиз := (2000h*16 + (6 + 0FA00h + 0880h)mod 216)mod 220 =

(20000h + 0286)mod 220 = 20286h

Если, например, в байте с адресом 20286hхранится число56h, а в байте с адресом20287h– число32h, то наша команда реализует операцию сложенияax:=ax+3256h.

Рассмотрим теперь внутреннее представление формата команды регистр–память. Длина этой команды 2, 3 или 4 байт:

8 бит

2 бита

3 бита

3 бита

8 бит

8 бит

КОП

d

W

Mod

R1

Mem

a8

a8->a16

где mod– двух битовое поле модификатора,mem– трёх битовое поле способа адресации,a8иa16– это обозначения для одно- или двухбайтного смещение. Битыdиwзнакомы нам из предыдущего формата регистр-регистр. Все возможные комбинацииmodиmemприведены в таблице 6.1.

Таблица 6.1. Значения полей modиmemв формате регистр-память.

Mem \ mod

00

01

10

11

0 доп. Байт.

1 доп. байт

2 доп. байта

Формат RR

000

[BX+SI]

[BX+SI]+a8

[BX+SI]+a16

001

[BX+DI]

[BX+DI]+a8

[BX+DI]+a16

010

[BP+SI]

[BP+SI]+a8

[BP+SI]+a16

011

[BP+DI]

[BP+DI]+a8

[BP+DI]+a16

100

[SI]

[SI]+a8

[SI]+a16

101

[DI]

[DI]+a8

[DI]+a16

110

a16

[BP]+a8

[BP]+a16

111

[BX]

[BX]+a8

[BX]+a16

Данная таблица показывает, как зависит способ адресации от полей memиmod. Как видим, она полностью объясняет ограничения на выбор регистров-модификаторов, которые мы сформулировали ранее. Мы не будем рассматривать машинный вид остальных форматов команд, будем изучать их только на языке Ассемблера. Напомним, что это такие форматы команд:

  • RR– (регистр – регистр);

  • RX– (регистр – память, память – регистр);

  • RI– (регистр – непосредственный операнд в команде);

  • SI– (память – непосредственный операнд в команде);

  • SS– (память – память, т.е. оба операнда в основной памяти).