Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 13

Unknown Author

Что касается машинного представления строк, т. е. последовательностей символов, то под каждую строку отводят нужное число соседних байтов памяти, в которые записывают коды символов, образующих строку. Адрес первого из этих байтов считается адресом строки. Отметим, что эта последовательность кодов записывается в ПК в нормальном, неперевернутом виде. Например, строка ’abc’ будет представлена в памяти так (А - адрес строки):

А    А+1    А+2

1.4. Представление команд

Машинные команды ПК занимают от 1 до 6 байтов.

Код операции (КОП) занимает один или два первых байта команды. В ПК столь много различных операций, что для них не хватает 256 различных кодов, которые можно представить в одном байте. Поэтому некоторые операции объединяются в группу и им дается один и тот же КОП, во втором же байте этот код уточняется. Кроме того, во втором байте указываются типы операндов и способы их адресации. В остальных байтах команды указываются ее операнды.

Команды ПК могут иметь от 0 до 2 операндов. Размер операндов - байт или слово (редко - двойное слово). Операнд может быть указан в самой команде (это так называемый непосредственный операнд), либо может находиться в одном из регистров ПК и тогда в команде указывается этот регистр, либо может находиться в ячейке памяти и тогда в команде тем или иным способом

указывается адрес этой ячейки. Некоторые команды требуют, чтобы их операнд находился в фиксированном месте (например, в регистре АХ), и тогда операнд явно не указывается в команде. Результат выполнения команды помещается в регистр или ячейку памяти, откуда берется один из операндов. Например, большинство команд с двумя операндами реализуют действие

ор!

ор!

ор2,

где opl - регистр или ячейка памяти, а ор2 - непосредственный операнд, регистр или ячейка памяти, а * - операция, заданная КОПом.

Форматы машинных команд в ПК достаточно разнообразны и "затейливы". Для примера рассмотрим лишь основные форматы команд с двумя операндами.

1) Формат "регистр - регистр" (2 байта):

1

2 1

О

7 6 5

3 2

О

или

Команды этого формата описывают обычно действие regl:=regl*reg2

reg2:=reg2*regl, где regl и reg2 - регистры общего назначения. Поле КОП первого байта указывает на операцию (*), которую надо выполнить. Бит w определяет размер операндов, а бит d указывает, в какой из двух регистров записывается результат:

w

1 - слова

О - байты

d

1 - regl:=regl*reg2

О - reg2:=reg2*regl

Во втором байте два левых бита фиксированы (для данного формата), а трехбитовые поля regl и reg2 указывают на регистры, участвующие в операции, согласно следующей таблице:

reg

\

\\'=1

\\'=0

reg

\\'=1

w-0

000

АХ

AL

100

SP

АН

001

СХ

CL

101

ВР

СН

010

DX

DL

110

SI

DH

011

ВХ

BL

111

DI

ВН

2) Формат

"регистр -

память"

(2-4 байта):

-2 байта)

Эти команды описывают операции reg:=reg*adr или adr:=adr*reg, где reg - регистр, a adr - адрес ячейки памяти. Бит w первого байта определяет размер операндов (см. выше), а бит d указывает, куда записывается результат: в регистр (d=l) или в ячейку памяти (d=0). Трехбитовое поле reg второго байта указывает операнд-регистр (см. выше), двухбитовое поле mod определяет, сколько байтов в команде занимает операнд-адрес (00 - 0 байтов, 01-1 байт, 10-2 байта), а трехбитовое поле mem указывает способ модификации этого адреса. В следующей таблице указаны