Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 13
Unknown Author
Что касается машинного представления строк, т. е. последовательностей символов, то под каждую строку отводят нужное число соседних байтов памяти, в которые записывают коды символов, образующих строку. Адрес первого из этих байтов считается адресом строки. Отметим, что эта последовательность кодов записывается в ПК в нормальном, неперевернутом виде. Например, строка ’abc’ будет представлена в памяти так (А - адрес строки):
А А+1 А+2
1.4. Представление команд
Машинные команды ПК занимают от 1 до 6 байтов.
Код операции (КОП) занимает один или два первых байта команды. В ПК столь много различных операций, что для них не хватает 256 различных кодов, которые можно представить в одном байте. Поэтому некоторые операции объединяются в группу и им дается один и тот же КОП, во втором же байте этот код уточняется. Кроме того, во втором байте указываются типы операндов и способы их адресации. В остальных байтах команды указываются ее операнды.
Команды ПК могут иметь от 0 до 2 операндов. Размер операндов - байт или слово (редко - двойное слово). Операнд может быть указан в самой команде (это так называемый непосредственный операнд), либо может находиться в одном из регистров ПК и тогда в команде указывается этот регистр, либо может находиться в ячейке памяти и тогда в команде тем или иным способом
указывается адрес этой ячейки. Некоторые команды требуют, чтобы их операнд находился в фиксированном месте (например, в регистре АХ), и тогда операнд явно не указывается в команде. Результат выполнения команды помещается в регистр или ячейку памяти, откуда берется один из операндов. Например, большинство команд с двумя операндами реализуют действие
ор!
ор!
ор2,
где opl - регистр или ячейка памяти, а ор2 - непосредственный операнд, регистр или ячейка памяти, а * - операция, заданная КОПом.
Форматы машинных команд в ПК достаточно разнообразны и "затейливы". Для примера рассмотрим лишь основные форматы команд с двумя операндами.
О
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 указывают на регистры, участвующие в операции, согласно следующей таблице:
000
АХ
AL
100
SP
АН
001
СХ
CL
101
ВР
СН
010
DX
DL
110
SI
DH
011
ВХ
BL
111
DI
ВН
✓
-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 указывает способ модификации этого адреса. В следующей таблице указаны