Jazik_Assemblera_dlja_IBM_PC_i_programmir
.pdfДиректива RECORD
------------------
Директива RECORD позволяет определять битовые строки. Одно из назначений этой директивы - определить однобитовые или многобитовые переключатели. Формат директивы:
имя RECORD имя-поля:ширина [=выражение] [, ... ]
Имя директивы и имена полей могут быть любыми уникальными идентификаторами. После каждого имени поля следует двоеточие (:) и размер поля в битах, которое может быть от 1 до 16 бит:
Число определенных битов |
Принимаемый размер |
1...8 |
8 |
9...16 |
16 |
Любой размер поля до 8 бит представляется восемью битами, а от 9 до 16 бит - представляется шестнадцатью битами, выровненными справа (если необходимо). Рассмотрим следующую директиву RECORD:
BITREC RECORD |
BIT1:3,BIT2:7,BIT3:6 |
|
|
|
Имя BIT1 определяет первые 3 |
бит поля BITREC, BIT2 - |
следующие 7 |
бит и |
|
BIT3 - последние |
6 бит. Общее число битов - 16, т.е. |
одно слово. |
Можно |
|
инициализировать |
поле BITREC, например, следующим образом: |
|
BITREC2 RECORD BIT1:3=101B,BIT2:7=0110110B,BIT3:011010B
Предположим, что директива RECORD находится перед сегментом данных. Тогда внутри сегмента данных должен быть другой оператор, который отводит память под данные. Для этого необходимо определить уникальное имя, имя директивы RECORD и операнд, состоящий из угловых скобок (символы меньше и больше):
DEFBITS BITREC <>
Данное определение генерирует объектный код AD9A. который записывается как 9AAD в сегмент данных. В угловых скобках может находиться значение, переопределяющее BITREC.
Программа на рис.24.1 иллюстрирует определение BITREC директивой RECORD, но без начальных значений. В этом случае соответствующий оператор в сегменте данных инициализирует каждое поле операндом в угловых скобках.
Дополнительно к директиве |
RECORD |
имеются операторы WIDTH, |
MASK и |
|
фактор сдвига. Использование |
этих |
операторов |
позволяет |
изменять |
определение директивы RECORD без изменения команд, которые имеют ссылки на директиву RECORD.
О п е р а т о р WIDTH. Оператор WIDTH возвращает число битов в директиве RECORD или в одном из ее полей. На рис.24.1 после метки А10 имеется два примера оператора WIDTH. Первая команда MOV загружает в регистр BH число битов во всем поле RECORD BITREC (16 бит); вторая команда MOV загружает в регистр AL число битов в поле BIT2 (7 бит). В обоих случаях ассемблер генерирует для числа битов непосредственный операнд.
__________________________________________________________________________
0000 |
|
TITLE |
RECORD (COM) Проверка директивы RECORD |
|
|
CODESG SEGMENT |
PARA 'Code' |
||
0100 |
|
ASSUME |
CS:CODESG,DS:CODESG,SS:CODESG |
|
EB 02 |
ORG |
100H |
SHORT MAIN |
|
0100 |
BEGIN: |
JMP |
|
|
|
; ----------------------------------------------------- |
||||||
0102 |
9A |
AD |
BITREC RECORD |
BIT1:3,BIT2:7,BIT3:6 |
;Определить запись |
||||
DEFBITS BITREC <101B,0110110B,011010B> ;Инициализировать биты |
|||||||||
0104 |
|
|
; ----------------------------------------------------- |
||||||
|
|
MAIN |
PROC |
NEAR |
|
;Ширина: |
|
||
0104 |
B7 |
10 |
A10: |
MOV |
BH,WIDTH BITREC |
|
|||
0104 |
|
; записи (16) |
|
||||||
0106 |
B0 |
07 |
B10: |
MOV |
AL,WIDTH BIT2 |
; поля (07) |
|
||
0108 |
B1 |
0D |
MOV |
CL,BIT1 |
|
;Величина сдвига: |
|||
0108 |
|
|
; шест.0D |
|
|||||
010A |
B1 |
06 |
|
MOV |
CL,BIT2 |
|
; |
06 |
|
010C |
B1 |
00 |
C10: |
MOV |
CL,BIT3 |
|
; |
00 |
|
010E |
B8 |
E000 |
MOV |
AX,MASK BIT1 |
;Маска: |
|
|||
010E |
|
; шест.E000 |
|
||||||
0111 |
BB 1FC0 |
|
MOV |
BX,MASK BIT2 |
; |
1FC0 |
|
||
0114 |
B9 |
003F |
D10: |
MOV |
CX,MASK BIT3 |
; |
003F |
|
|
0117 |
A1 |
0102 R |
MOV |
AX,DEFBITS |
;Выделение BIT2: |
||||
0117 |
|
; получить запись, |
|||||||
011A |
25 |
1FC0 |
|
AND |
AX,MASK BIT2 |
; очистить BIT1 и BIT3, |
|||
011D |
B1 |
06 |
|
MOV |
CL,BIT2 |
|
; получить сдвиг 06, |
||
011F |
D3 |
E8 |
E10: |
SHR |
AX,CL |
|
; сдвинуть вправо |
||
0121 |
A1 |
0102 R |
MOV |
AX,DEFBITS |
;Выделение BIT1: |
||||
0121 |
|
; получить запись, |
|||||||
0124 |
B1 |
0D |
|
MOV |
CL,BIT1 |
|
; получить сдвиг 13, |
||
0126 |
D3 |
E8 |
|
SHR |
AX,CL |
|
; сдвинуть вправо |
||
0128 |
C3 |
|
|
RET |
ENDP |
|
|
|
|
0129 |
|
|
CODESG |
MAIN |
|
|
|
|
|
0129 |
|
|
ENDS |
BEGIN |
|
|
|
|
|
|
|
|
|
END |
|
|
|
|
|
_____________________________________________________________________ |
|||||||||
Structures and records: |
|
Widht |
# fields |
|
|
|
|||
|
|
|
N a m e |
|
Widht |
Mask |
Initial |
||
BITREC . . . . . . . . . . . |
0010 |
Shift |
|||||||
0003 |
E000 |
0000 |
|
||||||
BIT1 . . . . . . . . . . . . |
000D |
0003 |
0000 |
||||||
BIT2 . . . . . . . . . . . . . |
0006 |
0007 |
1FC0 |
||||||
BIT3 . . . . . . . . . . . . |
0000 |
0006 |
003F |
0000 |
|
||||
Segments and Groups: |
|
Size |
Align |
Combine Class |
|
||||
|
|
|
N a m e |
|
|
||||
CODESG . . . . . . . . . . . . |
0129 |
PARA |
NONE |
'CODE' |
|
||||
Symbols: |
|
N a m e |
|
Type |
Value |
Attr |
|
|
|
|
|
|
|
|
|
||||
A10. . . . . . . . . . . . . . |
L NEAR |
0104 |
CODESG |
|
|
||||
B10. . . . . . . . . . . . . . |
L NEAR |
0108 |
CODESG |
|
|
||||
BEGIN. . . . . . . . . . . . . |
L NEAR |
0100 |
CODESG |
|
|
||||
C10. . . . . . . . . . . . . . |
L NEAR |
010E |
CODESG |
|
|
||||
D10. . . . . . . . . . . . . . |
L NEAR |
0117 |
CODESG |
|
|
||||
DEFBITS. . . . . . . . . . . . |
L WORD |
0102 |
CODESG |
|
|
||||
E10. . . . . . . . . . . . . . |
L NEAR |
0121 |
CODESG |
Length =0025 |
|||||
MAIN . . . . . . . . . . . . . |
N PROC |
0104 |
CODESG |
__________________________________________________________________________
Рис.24.1. Использование диpективы RECORD
Ф а к т о р с д в и г а. Прямая ссылка на элемент в RECORD,например:
MOV CL,BIT2
в действительности не имеет отношения к содержимому BIT2. Вместо этого ассемблер генерирует непосредственный операнд, который содержит "фактор
сдвига", помогающий изолировать необходимое поле. Непосредственное значение представляет собой число, на которое необходимо сдвинуть BIT2 для выравнивания справа. На рис.24.1 после метки В10 имеются три команды, которые загружают в регистр CL фактор сдвига для полей BIT1, BIT2 и BITЗ.
О п е р а т о р MASK. Оператор MASK возвращает "маску" из единичных битовых значений, которые представляют специфицированное поле, иными словами, определяют битовые позиции, которые занимает поле. Например, оператор MASK для каждого из полей, определенных в области BITREC, возвращает следующие значения:
Поле |
Двоичное значение |
Шестнадцатиричное значение |
В1Т1 |
1110000000000000 |
Е000 |
В1Т2 |
0001111111000000 |
1FC0 |
В1ТЗ |
0000000000111111 |
003F |
На рис.24.1 три команды после метки С10 загружают в регистры значения оператора MASK для полей BIT1, BIT2 и BITЗ. Команды после меток D10 и Е10 иллюстрируют выделение значений полей BIТ2 и BIТ1 соответственно из области BITREC. После метки D10 в регистр АХ загружается все значение области, определенной директивой RECORD, а затем из этого значения с помощью оператора MASK выделяются только биты поля BIТ2:
Область RECORD: |
101 0110110 011010 |
AND MASK BIТ2: |
000 1111111 000000 |
Результат: |
000 0110110 000000 |
В результате сбрасываются все биты, кроме принадлежащих к полю BIТ2. Следующие две команды приводят к сдвигу содержимого регистра АХ на шесть битов для выравнивания справа:
0000000000110110 (0036Н)
После метки Е10 в регистр AХ загружается все значение области, определенной директивой RECORD, и так как BIТ1 является самым левым полем, то в примере используется только фактор для сдвига значения вправо на 13 бит:
0000000000000101 |
(0005Н) |
|
|
|
|
|
|
Директива SEGMENT |
|
|
|
|
|
|
------------------- |
или |
более |
сегментов, |
||
Ассемблерный модуль может состоять из одного |
||||||
части сегмента или даже частей нескольких сегментов. Формат директивы: |
|
|||||
имя_сегмента SEGMENT [выравнивание] [объединение] [класс] |
|
|||||
|
. |
|
|
|
|
|
|
. |
|
|
|
|
|
имя_сегмента |
. |
|
|
|
|
|
ENDS |
|
|
|
|
|
|
Все операнды являются необязательными. Ниже описаны |
операнды |
для |
||||
выравнивания, объединения и указания класса. |
|
|
|
|
||
В ы р а в н и в а н и е. |
Операнд выравнивания |
определяет |
начальную |
|||
границу сегмента, например |
|
|
|
|
|
|
PAGE |
= xxx00 |
|
|
|
|
|
PARA |
= хххх0 (граница по умолчанию) |
|
|
|
|
|
WORD |
= ххххe (четная граница) |
|
|
|
|
|
BYTE |
= ххххх |
|
|
|
|
|
где х - любая шестнадцатиричная цифра,
е- четная шестнадцатиричная цифра.
Об ъ е д и н е н и е. Операнд объединения указывает способ обработки сегмента, при компоновке:
NONE: Значение по умолчанию. Сегмент должен быть логически отделен от других сегментов, хотя физически он может быть смежным. Предполагается, что сегмент имеет собственный базовый адрес;
PUBLIC: Все PUBLIC - сегменты, имеющие одинаковое имя и класс, загружаются компоновщиком в смежные области. Все такие сегменты имеют один общий базовый адрес;
STACK: Для компоновщика операнд STACK аналогичен операнду PUBLIC. В любой компонуемой программе должен быть определен по крайней мере один сегмент STACK. Если объявлено более одного стека, то стековый указатель (SP) устанавливается на начало первого стека;
COMMON: Для сегментов COMMON с одинаковыми именами и классами компоновщик устанавливает один общий базовый адрес. При выполнении происходит наложение второго сегмента на первый. Размер общей области определяется самым длинным сегментом;
AT-параграф: Параграф должен быть определен предварительно. Данный операнд обеспечивает определение меток и переменных по фиксированным адресам в фиксированных областях памяти, таких, как ROM или таблица векторов прерываний в младших адресах памяти. Например, для определения адреса дисплейного видеобуфера используется
VIDEO_RAM |
SEGMENT AT 0B800H |
|
|
|
|||
Класс: Операнд |
класс |
может содержать |
любое |
правильное |
имя, |
||
заключенное в одиночные кавычки. |
Данный операнд |
используется |
|||||
компоновщиком для обработки сегментов, |
имеющих |
одинаковые |
имена и |
||||
классы. Типичными примерами являются классы 'STACK' и 'CODE'. |
|
||||||
Следующие два сегмента объединяются компоновщиком в один |
физический |
||||||
сегмент при одном значении сегментного регистра: |
|
|
|
||||
Ассемблерный |
-------------------------------- |
|
|
||||
SEG1 SEGMENT |
PARA PUBLIC 'CODE' |
|
|
||||
модуль 1 |
|
ASSUME |
CS:SEG1 |
|
|
|
|
|
SEG1 |
... |
|
|
|
|
|
|
ENDS |
|
|
|
|
|
|
Ассемблерный |
-------------------------------- |
|
|
||||
SEG2 SEGMENT |
PARA PUBLIC 'CODE' |
|
|
||||
модуль 2 |
|
ASSUME |
CS:SEG1 |
|
|
|
|
|
SEG2 |
... |
|
|
|
|
|
|
ENDS |
|
|
|
|
|
|
|
-------------------------------- |
|
|
||||
Сегменты могут быть вложенными один в другой: |
|
|
|
||||
|
SEG1 |
SEGMENT |
|
Начало SEG1 |
|
|
|
|
SEG2 |
... |
|
|
|
||
|
SEGMENT |
|
Область SEG2 |
|
|
||
|
SEG2 |
... |
|
|
|
||
|
ENDS |
|
Конец SEG1 |
|
|
||
|
SEG1 |
... |
|
|
|
||
|
ENDS |
|
|
|
|
|
Для объединения сегментов в группы используйте директиву GROUP.
Директива STRUC
-----------------
Директива STRUC обеспечивает определение различных полей в виде структуры. Данная директива не поддерживается в малом ассемблере ASM. Формат директивы:
Имя-структуры STRUC
...
[определение полей данных]
...
Имя-структуры ENDS
Структура начинается собственным именем в директиве |
STRUC |
и |
|
завершается таким же именем в директиве ENDS. Ассемблер записывает |
поля; |
||
определенные в структуре, одно за другим от начала структуры. |
Правильными |
||
операторами определения полей являются DB, DW, DD и DT с указанием |
имен |
||
или без них. |
|
|
для |
На рис.24.2 директива STRUC определяет список параметров PARLIST |
|||
ввода имени с клавиатуры. |
Следующий далее оператор выделяет |
память |
под |
данную структуру: |
|
|
|
PARAMS |
PARLIST <> |
|
|
Данный оператор обеспечивает адресацию структуры внутри программы. Угловые скобки (символы меньше и больше) в данном случае пусты, но в них можно указать данные для переопределения областей внутри структуры.
В командах ассемблера может использоваться прямая адресация по имени структуры. Для ссылки на определенное поле внутри структуры в командах используется имя структуры (PARAMS в данном примере) и через точку имя конкретного поля:
MOV AL,PARAMS.ACTLEN
Используя оператор выделения памяти, можно переопределить содержимое полей внутри структуры. Правила для практического использования этой возможности можно найти в руководстве по Ассемблеру.
__________________________________________________________________________
0000 |
|
|
|
TITLE |
DSTRUC |
(COM) Определение структуры |
|
|
|
|
CODESG |
SEGMENT |
PARA 'Code' |
|
|
0100 |
|
|
|
|
ASSUME |
CS:CODESG,DS:CODESG,SS:CODESG |
|
EB |
29 |
|
BEGIN: |
ORG |
100H |
|
|
0100 |
|
JMP |
SHORT MAIN |
|
|||
|
|
|
|
; --------------------------------------------- |
|
STRUC |
;Список параметров |
0000 |
19 |
|
|
PARLIST |
DB |
||
|
|
MAXLEN |
25 |
; |
|||
0001 |
?? |
19 |
[ 20 ] |
ACTLEN |
DB |
? |
; |
0002 |
|
NAMEIN |
DB |
25 DUP(' ') |
; |
||
001B |
|
|
|
PARLIST |
|
ENDS |
; |
0102 |
19 |
|
|
PARAMS |
PARLIST <> |
||
|
|
;Область структуры |
|||||
0103 |
?? |
19 |
[ 20 ] |
|
|
|
|
0104 |
57 |
PROMPT |
DB |
'What is name?', 'S' |
|||
011D |
68 |
61 74 20 69 |
|||||
|
73 |
20 |
6E 61 6D 65 |
|
|
|
|
|
3F |
24 |
|
; |
|
|
|
012B |
|
|
|
PROC |
NEAR |
|
|
B4 |
09 |
|
MAIN |
;Выдать запрос |
|||
012B |
011D R |
|
MOV |
AH,09 |
|||
012D |
8D |
16 |
|
LEA |
DX,PROMPT |
|
|
0131 |
CD |
21 |
|
|
INT |
21H |
;Получить ввод |
0133 |
B4 |
0A |
|
|
MOV |
AH,0AH |
0135 |
8D 16 0102 R |
LEA |
DX,PARAMS |
|
|
0139 |
CD 21 |
INT |
21H |
|
|
013B |
A0 0103 R |
MOV |
AL,PARAMS.ACTLEN ;Длина ввода |
||
013E |
; |
... |
|
|
|
C3 |
RET |
|
|
|
|
013F |
MAIN |
ENDP |
|
|
|
013F |
CODESG |
ENDS |
BEGIN |
|
|
|
|
END |
|
|
|
Structures and records: |
Width |
# fields |
|
|
|
|
N a m e |
Masc |
Initial |
||
PARLIST. . . . . . . . . . . . . |
Shift |
Width |
|||
001B |
0003 |
|
|
||
MAXLEN . . . . . . . . . . . . |
0000 |
|
|
|
|
ACTLEN . . . . . . . . . . . . |
0001 |
|
|
|
|
NAMEIN . . . . . . . . . . . . |
0002 |
|
|
|
|
Segments and Groups: |
Size |
Align |
Combine Class |
||
|
N a m e |
||||
CODESG . . . . . . . . . . . . . |
013F |
PARA |
NONE |
'CODE' |
|
Symbols: |
Type |
Value |
Attr |
|
|
|
N a m e |
|
|||
BEGIN. . . . . . . . . . . . . L |
NEAR |
0100 |
CODESG |
Length =0014 |
|
MAIN . . . . . . . . . . . . . N |
PROC |
012B |
CODESG |
||
PARAMS . . . . . . . . . . . . L |
001B |
0102 |
CODESG |
|
|
PROMPT . . . . . . . . . . . . L |
BYTE |
011D |
CODESG |
|
__________________________________________________________________________
Рис.24.2. Пpимеp опpеделения стpуктуpы
ГЛАВА 25 Справочник по командам языка Ассемблер
__________________________________________________________________________
Ц е л ь: описать набор команд Ассемблера и объяснить их машинные коды.
ВВЕДЕНИЕ
________________________________________________________________
В данной главе приведены объяснения машинных кодов и перечислены в алфавитном порядке символические коды команд с указанием их назначений.
Многие специфические команды имеют однобайтовые машинные коды, например:
Объектный код: |
Символические команды: |
||
40 |
INC |
AX |
;Увеличение AX на 1 |
50 |
PUSH |
AX |
;Запись AХ в стек |
С3 |
RET |
(short) |
;Короткий возврат из процедуры |
CB |
RET |
(far) |
;Длинный возврат из процедуры |
FD |
STD |
|
;Остановка флага направления |
Ни одна из перечисленных |
команд |
не использует |
прямой |
адресации |
|
памяти. |
Другие команды, использующие непосредственный операнд, |
8-битовый |
|||
регистр, |
регистровую пару или |
адрес |
памяти, требуют |
более |
сложного |
машинного |
кода. |
|
|
|
|
ОБОЗНАЧЕНИЕ РЕГИСТРОВ
________________________________________________________________
Команды, использующие регистр, могут содержать три бита, указывающих на конкретный регистр, и один бит "w", определяющий размер регистра: байт или слово. Кроме того, лишь некоторые команды обеспечивают доступ к сегментным регистрам. На рис.25.1 показана полная идентификация регистров.
Рассмотрим команду MOV с однобайтовым непосредственным операндом:
MOV |
АН,00 10110 |
100 |
00000000 |
|
| |
| |
|
|
w |
rеg = AН |
__________________________________________________________________________
Основные, базовые и индексные регистры:
Биты: |
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 |
Биты: |
Сегментный регистр: |
00 |
ES |
01 |
CS |
10 |
SS |
11 |
DS |
__________________________________________________________________________
Рис.25.1. Обозначение регистров
В данном случае первый байт машинного кода указывает на однобайтовый размер (w = 0) и на регистр AН (100). Следующая команда MOV содержит непосредственный двухбайтовый операнд:
MOV |
AX,00 10111 |
000 |
00000000 00000000 |
|
| |
| |
|
|
w |
reg = AX |
Первый байт машинного кода указывает на размер в одно слово (w=1) и на регистр AХ (000). Не следует обобщать приведенные примеры, так как указание регистра и бита w может быть в различных позициях кода.
БАЙТ СПОСОБА АДРЕСАЦИИ
________________________________________________________________
Байт способа адресации, если он присутствует, занимает второй байт машинного кода и состоит из следующих трех элементов:
1)mod - двухбитового кода, имеющего значения 11 для ссылки на регистр и 00, 01 и 10 для ссылки на память;
2)reg - трехбитового указателя регистра;
3)r/m - трехбитового указателя регистра или памяти (r - регистр, m - адрес памяти).
Кроме того, первый байт машинного кода может содержать бит "а", который указывает направление потока между операндом 1 и операндом 2.
Рассмотрим пример сложения содержимого регистра АХ с содержимым регистра BX:
ADD |
BX,AX 00000011 |
11 |
011 |
000 |
|
dw |
mod |
reg |
r/m |
В этом примере d=1 означает, что mod (11) и reg (011) описывают операнд 1, а r/m (000) описывает операнд 2. Так как бит w=1, то размер равен одному слову. Таким образом, команда должна прибавить AX (OOQ) к BХ (011).
Второй байт команды в объектном коде указывает большинство способов адресации памяти. В следующем разделе способы адресации будут подробно рассмотрены.
Биты MOD
----------
Два бита mod определяют адресацию регистра или памяти. Ниже поясняется их назначение:
00биты г/m дают абсолютный адрес, байт смещения (относительный адрес) отсутствует;
01биты г/m дают абсолютный адрес памяти и имеется один байт смещения;
10биты г/m дают абсолютный адрес и имеется два байта смещения;
11биты г/m определяют регистр. Бит w (в байте кода операции) определяет ссылку на восьмиили шестнадцатибитовый регистр.
Биты REG
----------
Три бита reg (вместе с битом w) определяют конкретный восьмиили шестнадцатибитовый регистр.
Биты R/M
----------
Три бита г/m (регистр/память) совместно с битами mod определяют способ адресации, как показано на рис.25.2.
__________________________________________________________________________
r/m |
mod=00 |
mod=01 |
mod=10 |
mod=1.1 |
mod=11 |
000 |
BX+SI |
BX+SI+disp |
BX+SI+disp |
w=0 |
w=1 |
AL |
AX |
||||
001 |
BX+DI |
BX+DI+disp |
BX+DI+disp |
CL |
CX |
010 |
BP+SI |
BP+SI+disp |
BP+SI+disp |
DL |
DX |
011 |
BP+DI |
BP+DI+disp |
BP+DI+disp |
BL |
BX |
100 |
SI |
SI+disp |
SI+disp |
AH |
SP |
101 |
DI |
DI+disp |
DI+disp |
CH |
BP |
110 |
Direct |
BP+disp |
BP+disp |
DH |
SI |
111 |
BX |
BX+disp |
BX+disp |
BH |
DI |
__________________________________________________________________________
Рис.25.2. Биты r/m
ДВУХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Рассмотрим пример сложения содержимого регистров BХ и AХ:
|
ADD |
BX,AX |
0000 0011 11 011 000 |
|
|
|
dw mod reg r/m |
d |
1 означает, |
что биты reg и w описывают операнд 1 (BХ), а биты |
mod, r/m и w - Операнд 2 (AХ);
w 1 определяет размер регистров в одно слово, mod 11 указывает, что операнд 2 является регистром;
reg 011 указывает, что операнд 1 является регистром BХ; r/m 000 указывает, что операнд 2 является регистром AX.
Рассмотрим пример умножения регистра AL на |
регистр BL: |
||||
MUL |
BL |
11110110 |
11 |
100 |
011 |
|
|
w |
mod |
reg |
r/m |
Команда MUL предполагает, что регистр AL содержит множимое. Размер регистра равен одному байту (w = 0), mod указывает на регистровую операцию, г/m = 011 указывает на регистр BL. В данном случае reg = 100 не имеет смысла.
ТРЕХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Следующая команда MOV генерирует три байте машинного кода:
MOV |
mem,AX 10100001 dddddddd dddddddd |
Для команды пересылки из регистра AХ или AL необходимо знать, сколько байтов участвует в операции: один или два. В данном примере w = 1 означает слово, следовательно, предполагается 16-битовый регистр AХ. Использование во втором операнде регистра AL приведет к значению бита w = 0. Байты 2 и 3 содержат относительный адрес памяти. Команды, использующие регистры АХ или AL, часто генерируют более эффективный (короткий) машинный код.
ЧЕТЫРЕХБАЙТОВЫЕ КОМАНДЫ
________________________________________________________________
Рассмотрим пример умножения регистра AL на значение в памяти. Процессор предполагает, что множимое находится в регистре AL для однобайтового умножения и в регистре AХ для Двухбайтового умножения:
MUL |
mem_byte |
11110110 |
00 |
100 |
110 |
|
|
w |
mod |
reg |
r/m |
Для данной команды reg всегда имеет значение 100, mod = 00 указывает на операцию с памятью, a r/m=110 - на прямой способ адресации. Машинная команда также содержит два следующих байта, определяющих относительный адрес памяти.
Рассмотрим еще один пример, иллюстрирующий команду LEA, которая всегда специфицирует двухбайтовый адрес:
LEA |
DX,mem 10001101 |
00 |
010 |
110 |
|
LEA |
mod |
rеg |
r/m |
Reg =010 означает регистр DX. Mod =00 и r/m=110 определяют прямой способ адресации памяти. В следующих двух байтах содержится относительный адрес.
КОМАНДЫ В АЛФАВИТНОМ ПОРЯДКЕ
________________________________________________________________
В данном разделе представлен набор команд Ассемблера в алфавитном порядке. Некоторые команды, например сдвиг и циклический сдвиг, для краткости сгруппированы. Ряд специальных команд для процессоров 80186, 80286 и 80386 выходят за рамки данной книги и поэтому в данной главе также
отсутствуют. При пояснении команд и способов адресации используются следующие сокращения:
addr |
адрес памяти; |
addr-high |
первый байт адреса (старший); |
addr-low |
левый (младший) байт. адреса; |
data |
непосредственный операнд (8 бит при w=0 и 16 бит при w= 1); |
data-high |
правый (старший) байт непосредственного операнда; |
data-low |
левый (младший) байт непосредственного операнда; |
disp |
смещение (относительный адрес); |
rеg |
ссылка на регистр. |
|
AAA: Коррекция ASCII-формата для сложения |
|
------------------------------------------- |
Оп е р а ц и я: Корректирует сумму двух ASCII-байтов в регистре AL. Если правые четыре бита регистра AL имеют значение больше 9 или флаг AF установлен в 1, то команда AAA прибавляет к регистру АН единицу и устанавливает флаги AF и CF. Команда всегда очищает четыре левых бита в регистре AL.
Фл а г и: Команда воздействует на флаги AF и CF (флаги OF, PF, SF и ZF не определены).
Об ъ е к т н ы й к о д: 00110111 (без операндов).
AAD: Коррекция ASCII-формата для деления
------------------------------------------
Оп е р а ц и я: Корректирует ASCII-величины для деления. Команда AAD используется перед делением неупакованных десятичных чисел в регистре AХ (удаляет тройки ASCII-кода). Эта команда корректирует делимое в двоичное значение в регистре AL для последующего двоичного деления. Затем умножает содержимое регистра AН на 10. прибавляет результат к содержимому регистра AL и очищает AН. Команда AAD не имеет операндов.
Фл а г и: Команда воздействует на флаги PF, CF, ZF (флаги AF CF и OF не определены).
Об ъ е к т н ы й к о д: |11010101|00001010|.
AAМ: Коррекция ASCII-формата для умножения |
|
|
||
-------------------------------------------- |
результата |
|||
О п е р а ц и я: Команда AAM используется |
для |
коррекции |
||
умножения двух неупакованных десятичных чисел. |
Команда делит |
содержимое |
||
регистра AL на 10, записывает частное в регистр AН, а |
остаток |
в |
регистр |
|
AL. |
|
|
|
|
Ф л а г и: Команда воздействует на флаги PF, SF и ZF (флаги AF |
CF и |
|||
OF не определены). |
|
|
|
|
О б ъ е к т н ы й к о д: |11010100|00001010| (без операндов). |
|
|||
AAS: Коррекция ASCII-формата для вычитания |
|
|
||
-------------------------------------------- |
в регистре |
|||
О п е р а ц и я: Корректирует разность двух ASCII-байтов |
AL. Если первые четыре бита имеют значение больше 9 или флаг CF установлен в 1, то команда AAS вычитает 6 из регистра AL и 1 из регистра АН, флаги AF и CF при этом устанавливаются в 1. Команда всегда очищает левые четыре бита в регистре AL.
Ф л а г и: Команда воздействует на флаги AF и CF (флаги OF PF SF и ZF