Форматы машинных команд и их кодирование Общий формат

advertisement
ФОРМАТЫ МАШИННЫХ КОМАНД И ИХ КОДИРОВАНИЕ
Общий формат команд процессора (начиная с модели i80386) приведён на рис 1.5 [6, 8, 13].
Команды состоят из необязательных префиксов, одного или двух байт кода операции,
спецификаторов адреса (постбайт и байт sib), внутрикомандного смещения (Displacement) и
непосредственных данных. Английские аббревиатуры означают следующее: Base – база,
MoDe – режим, Register/Memory – регистр/память, Scale – масштаб, Index – индекс. Из всех
полей команды обязательным является только один или два байта кода операции.
Префикс – это байт, который модифицирует операцию следующей за ним команды. Два
префикса замены операнда и размера адреса (коды 66h и 67h соответственно) позволяют в
реальном режиме изменить принимаемые по умолчанию 16-битные размеры операнда и
эффективного адреса ЕА (Effective address) на 32-битные. Здесь необходимо заметить, что
при ассемблировании машинной команды Tasm самостоятельно вставляет соответствующий
префикс, если обнаруживает в мнемокоде команды 32-битный операнд или 32-битную
ссылку на память.
Рис. 1.5. Общий формат команды процессора старших моделей
В реальном режиме может быть использован как 16-битный режим адресации памяти
(единственно возможный в базовом процессоре i8086), так и 32-битный. Однако, учитывая,
что в реальном режиме размер любого сегмента ограничен величиной 216 = 64 Кбайта,
значение адреса в 32-битном слове не должно превышать величины FFFFh.
6.2.6.1. 16-БИТНЫЙ РЕЖИМ АДРЕСАЦИИ ОПЕРАНДОВ В ПАМЯТИ
Для практического изучения команд процессора i8086 составлен ряд демонстрационных
программ (Mov.asm, Arithmet.asm, Logiecal.asm, LoopCall.asm), а в табл. П.1.1_1 приложения
П.1.1. приведена система команд, упорядоченная по мнемокоду, с машинными кодами и
содержанием выполняемой операции для каждой ассемблерной команды.
По функциональному признаку система команд разбивается на 6 групп: пересылка данных,
арифметические операции, логические операции и сдвиги, передача управления, обработка
цепочек и управления микропроцессором. В этом параграфе рассмотрим формирование
машинных кодов команд процессора, которые могут адресовать один или два операнда и
структурно принадлежат к одному из трёх типовых форматов, приведённых на рис.1.6.
Машинные форматы команд в зависимости от типа команды и способа адресации содержат
от 1 до 6 байтов, из которых ключевыми являются первый (код операции) и второй (способ
адресации). Штриховыми линиями на рис. 1.6 показаны необязательные байты команд.
Принципы кодирования полей отдельных байтов команд рассмотрим на примере наиболее
общей формы двухоперандной команды.
Рис. 1.6. Типичные форматы команд:
двухоперандные команды (а) и (б) и однооперандная (в)
 w (Word) – однобитовое поле, идентифицирующее тип операнда: при w = 1
команда оперирует словами, а при w = 0 – байтом;
 d (Direction) – однобитовое поле, определяющее направление передачи операнда
или результата. При d = 1 осуществляется передача операнда в регистр, определённый
полем reg во втором байте, при d = 0 – передача из указанного регистра;
 reg (Register) – 3-битовое поле регистра, условно определяющее назначение
второго операнда;
 r/m (Register/Memory) – 3-битовое поле операнда, который может находиться в
памяти или в регистре и условно считается первым;
 md (Mode) – 2-битовое поле, показывающее (табл. 1.2), как интерпретировать
поле r/m при нахождении эффективного адреса EA первого операнда: если md = 11, то
операнд содержится в регистре, в остальных случаях – в памяти.
Т а б л и ц а 1.2
Определение эффективного адреса
Поле md
Поле r/m
11
W=0
AL
CL
DL
BL
AH
CH
DH
BH
000
001
010
011
100
101
110
111
W=1
AX
CX
DX
BX
SP
BP
SI
DI
00
01
10
BX+SI
BX+DI
BP+SI
BP+DI
SI
DI
D16)*
BX
BX+SI+D8
BX+DI+D8
BP+SI+D8
BP+DI+D8
SI+D8
DI+D8
BP+D8
BX+D8
BX+SI+D16
BX+DI+D16
BP+SI+D16
BP+DI+D16
SI+D16
DI+D16
BP+D16
BX+D16
Когда операнд находится в памяти, то поле md определяет вариант использования
внутрикомандного смещения disp (Displacement), находящегося в 3-м и в 4-м байтах:
md=00,
disp=0;
md=01,
disp =disp L-знаковое 8-битовое смещение (D8), расширяющееся со
знаком до 16 бит при вычислении эффективного адреса ЕА;
md=10,
disp =disp H, disp L- знаковое 16-битовое смещение (D16).
При этом кодировка поля reg второго операнда или поля r/m первого операнда при md = 11
определяет тип регистра в зависимости от значения параметра w. При md  11 реализуются
косвенные виды адресации памяти, что и отражено в табл. 1.3 (исключение составляет
случай прямой адресации при
r/m = 110 и md = 00). Таким образом, в процессоре i8086 реализовано
24 варианта (8*3) вычисления эффективного адреса ЕА.
Т а б л и ц а 1.3
Косвенные виды адресации
Тип адресации
Косвенная
Способ вычисления EA
[BX], [BP], [SI], [DI]
Число тактов
5
Базовая, или индексная
[BX+ , BP+ , SI+ , DI+disp]
6
Базовая индексная без смещения
[BP+DI], [BX+SI]
7
[BP+SI], [BX+DI]
8
[BP+DI+disp]
11
[BX+SI+disp]
11
[BP+SI+disp]
12
[BX+DI+disp]
13
Базовая индексная со смещением
Замечание. Подчеркнём смысловое различие двух случаев употребления термина смещение. Смещение disp,
содержащееся в команде, интерпретируется как знаковое число, которое участвует в вычислении эффективного адреса
EA. С другой стороны, из-за сегментной организации памяти эффективный адрес EA является смещением OFFSET
относительно базового адреса сегмента и интерпретируется как беззнаковое число при вычислении физического адреса
(см. рис. 2, п. 4).
При вычислении физического адреса эффективный адрес (или смещение Offset)
сегментируется регистром ds (сегмент данных) во всех случаях кроме тех, когда в
формировании EA участвует сегментный регистр bp. Использование регистра bp в
формировании EA предопределяет сегментирование адреса
по регистру ss (сегмент стека). Чтобы изменить, указанное по умолчанию
(см. также табл. 3, § 5) сегментирование адресов, предусмотрена специальная однобайтная
команда-префикс замены сегмента:
001 Sreg 110 – формат команды префикса замены.
Если команде предшествует префикс замены, то при обращении к данным в процессе
исполнения команды участвует сегментный регистр из префикса. Кодировка поля Sreg в
префиксе: 00 – es, 01 – cs, 00 – ss, 11 – ds.
На рис. 1.6 б представлен формат двухоперандной команды с непосредственным
операндом. В этом формате отсутствует необходимость в адресации второго операнда и
поле reg отдано для расширения поля COP. Отсутствует также бит направления d, т.к.
результат операции размещается на месте первого операнда. Место бита d занял бит s,
функции которого определяются следующим образом:
sw = X0,
data = data L -один байт данных;
sw = 01,
data = dataH,dataL – два байта данных;
sw = 11,
байт.
data = dataL – один байт данных, который расширяется со знаком до двух
Постбайтовая адресация является универсальной адресацией и позволяет адресовать как
общие регистры, так и ячейки памяти. Однако при адресации только регистров или
аккумулятора Acc постбайт оказывается излишним, если поле reg разместить в первом байте
команды или использовать неявную адресацию. Эта возможность реализуется в
специальных укороченных форматах, которые содержат минимальное число байтов и,
выбираются Turbo Assembler в процессе ассемблирования.
Двоичное кодирование ассемблерных команд, рекомендуется выполнять в следующей
последовательности:
– находим обобщённое представление команды, соответствующее одной из
альтернативных записей команды в справочном списке команд (Приложение П. 1.1);
– для выбранного обобщённого представления команды выписываем из таблицы
её формат;
– принимая во внимание формат данных, способ кодирования регистров и тип
адресного выражения для операнда, находящегося в памяти (табл. 1.2) , определяем
двоичный код для обозначенных в команде полей;
– записываем структурированный по байтам машинный код команды с
использованием 16-теричных символов. Полученный код должен совпадать с машинным
кодом соответствующей команды из окна CPU Turbo Debugger для рассматриваемого
файла.
В качестве примера ниже рассматривается машинная кодировка трёх ассемблерных команд,
взятых из файла mov.asm. В качестве источника проверки машинного кода было
использовано окно CPU Turbo Debugger.
Dataseg
w_x
dw
8,16,32,64
;Offset w_x = 0004h
Codeseg
cs:000C – BB0400
mov bx,offset w_x
;непосредственная адресация
cs:0014 – 8B160400
mov dx,[w_x]
;прямая адресация
cs:002C – C747021800
mov [word bx+2],24
;базовая адресация
 Команда: mov bx,offset w_x. В регистр bx занести offset переменной w_x.
1) Справочные данные команды:
mov r16,d16 ←→ 1011-w-reg
dataL
(dataH)
2) Кодировка обозначенных полей команды в пп. 1:
– w = 1, так как формат данных типа word;
– операнд-приёмник: reg = code(bx )= 011;
– операнд – источник: data H:dataL = offset w_x = 00h:04h – 16-битный адрес
переменной w_x в сегменте данных. Этот адрес может быть легко вычислен путём
просмотра списка переменных в памяти данных файла mov.asm.
3) Машинный код, таким образом, равен:
04h 00h = BB 04 00h
 Команда: mov dx,[w_x]. В регистр dx занести значение переменной w_x.
1) Справочные данные команды:
mov r16,r16/m16 ←→ 1000101-w
md-reg-r/m (dispL dispH)
2) Кодировка обозначенных полей команды в пп. 1
– w = 1, так как формат данных типа word;
– операнд-приёмник: reg = code(dx) =010;
– операнд-источник: содержимое ссылки на адрес переменной w_x. Прямая
адресация с адресным выражением, обозначенным как D16 {m d= 00, r/m = 110} в табл.
1.2. Значение адреса D16 = dispH:dispL = offset w_x = 00h:04h определяется из просмотра
списка переменных в памяти данных файла mov.asm.
3) Машинный код, таким образом, равен:
1000101-1
00-010-110
04h 00h = 8B 16 04 00h
 Команда: mov [word bx+2],24. В ячейку памяти по адресу [bx+2], занести
константу 24, зарезервировав под неё два байта (word).
1) Справочные данные команды:
mov r16/m16,d16 ↔ 1100011-w
md-000-r/m
2) Кодировка обозначенных полей команды в пп. 1:
(dispL dispH) dataL dataH
– w = 1, так как формат данных типа word;
– операнд-приёмник: ячейка памяти, определяемая адресным выражением [word dx
+ 2] = [d x+ d8], что определяет поля постбайта как: md = 01, r/m = 111;
– внутрикомандное смещение d8 = dispL = 02h, поле dispH исключается;
– операнд-источник константа 24 = 00 18h, так как формат данных типа word.
3) Машинный код, таким образом, равен:
1100011-1
01-000-111
02 18
00 = C7 47 02 18 00 h
«Изучение команд пересылки данных»
Цель работы: изучить способы адресации данных микропроцессором i8x86 и применение этих методов при
пересылке данных.
Оборудование: IBM - совместимый персональный компьютер, работающий под управлением операционной
системы, совместимой с MS-DOS®.
Программное обеспечение: Программа DEBUG
Краткие теоретические сведения.
1. Методы адресации данных
2. Команды пересылки данных
Режимы адресации данных
Микропроцессор 8x86 предоставляет Вам множество способов доступа к операндам, с которыми должна
работать Ваша программа. Операнды могут содержаться в регистрах, в самих командах, в памяти или в
портах ввода-вывода. В рекламных проспектах производителей оборудования утверждается, что микропроцессор 8x86 имеет 24 режима адресации операндов. Пожалуй, так оно и есть, если рассматривать все
возможные комбинации. Здесь мы разделяем режимы адресации на семь групп:
1. Регистровая адресация.
2. Непосредственная адресация.
3. Прямая адресация.
4. Косвенная регистровая адресация.
5. Адресация по базе.
6. Прямая адресация с индексированием.
7. Адресация по базе с индексированием.
Микропроцессор выбирает один из семи режимов адресации по значению поля режима команды. Ассемблер
присваивает то или иное значение полю режима в зависимости от того, какой вид имеют операнды в
исходной программе. Например, если вы написали
MOV АХ,ВХ
то Ассемблер закодирует оба операнда (АХ и ВХ) для регистровой адресации. Однако если Вы заключили
операнд-источник в квадратные скобки:
MOV AХ,[ВХ]
то Ассемблер закодирует операнд-источник для косвенной регистровой адресации.
В табл. 1 приведены форматы операндов языка ассемблера для всех семи режимов адресации, реализуемых
микропроцессором 8x86, и для каждого формата указано, какой из регистров сегмента используется для
вычисления физического адреса. Обратите внимание, что во всех режимах предполагается доступ к сегменту
данных (т. е. регистром сегмента служит регистр DS), и только в тех случаях, когда используется регистр ВР,
предполагается доступ к сегменту стека (т. е. регистром сегмента служит регистр SS).
Важное замечание: при исполнении команд микропроцессора 8x86, манипулирующих строками,
предполагается, что регистр DI указывает на ячейку дополнительного сегмента, а не сегмента данных. Таким
образом, в качестве регистра сегмента эти команды используют регистр ES. Все другие команды
исполняются по правилам, описанным в табл.1.
Таблица 1. Режимы адресации микропро цессора 8x86
Режим адресации
Формат операнда
Регистр сегмента
Регистровый
регистр
Не используется
Непосредственный
данное
Не используется
Прямой
сдвиг
метка
DS
DS
Косвенный регистровый
[ВХ]
[ВР]
[DI]
[SI]
DS
SS
DS
DS
По базе
[ВХ] + сдвиг
[ВР] + сдвиг
DS
CS
Прямой с индексированием
[DI] + сдвиг
[SS] + сдвиг
DS
DS
По базе с индексированием
[BX][SI] + сдвиг
[ВХ] [DI] + сдвиг
[ВР] |S1] + сдвиг
[ВР] [DI] + сдвиг
DS
DS
SS
SS
Примечания к таблице:
1. Компонент сдвиг при адресации по базе с индексированием необязателен.
2. Операнд регистр может быть любым 8-ми 16-и битовым регистром, кроме регистра IP.
3. Операнд данное может быть 8- или 16-битовым значением константы.
4. Компонент сдвиг может быть 8- или 16-битовым значением смещения со знаком.
Из семи режимов адресации самыми быстрыми являются регистровая и непосредственная адресации
операндов, поскольку в этом случае операционный блок микропроцессора 8x86 извлекает их либо из
регистров (при регистровой адресации), либо из конвейера команд (при непосредственной адресации). В
других режимах адресация выполняется дольше, потому что интерфейс шины вначале должен вычислить
адрес ячейки памяти, извлечь операнд и только после этого передать его операционному блоку.
Каждое описание режима адресации, приведенное в данном разделе, сопровождается примерами его
применения. В большинстве случаев для этого используется команда MOV микропроцессора 8x86.
Регистровая и непосредственная адресация
При регистровой адресации микропроцессор 8x86 извлекает операнд из регистра (или загружает его в
регистр). Например, команда
MOV AХ,СХ
копирует 16-битовое содержимое регистра счетчика СХ в аккумулятор АХ. Содержимое регистра СХ не
изменяется. В данном примере микропроцессор 8x86 использует регистровую адресацию для извлечения
операнда-источника из регистра СХ и загрузки его в регистр-приемник АХ.
Непосредственная адресация позволяет Вам указывать 8- или 16-битовое значение константы в качестве
операнда-источника. Эта константа содержится в команде (куда она помещается Ассемблером), а не в
регистре или в ячейке памяти. Например, команда
MOV СХ,500
загружает значение 500 в регистр СХ, а команда
MOV CL,-30
загружает значение - 30 в регистр CL.
Чтобы избежать трудностей, помните, что допустимые значения для 8-битовых чисел со знаком ограничены
диапазоном от -128 (80Н) до 127 (7FH), а допустимые значения 16-битовых чисел со знаком — диапазоном от
—32768 (8000Н) до 32767 (7FFFH). Максимальные значения 8-битовых чисел без знака равны соответственно
255 (OFFH) и 65535 (OFFFFH).
Расширение знакового бита непосредственных значений
Ассемблер всегда расширяет знак при пересылке непосредственных значений в операнд-приемник. Это
означает, что он дублирует старший значащий бит значения источника до тех пор, пока не будут заполнены
все 8 или 16 битов операнда-приемника.
Например, операнд-источник нашего первого примера, десятичное число 500, может быть записано в виде
10-битового двоичного значения 0 111 110 100. Когда Ассемблер устанавливает, что Вы требуете загрузить
это значение в 16-битовый регистр СХ, то он расширяет его до 16-битового, записав перед ним шесть копий
"знакового" бита (со значением 0). Поэтому в регистр СХ попадает двоичное значение 0 000 000 111 110 100.
Во втором примере микропроцессор 8x86 загружает в регистр CL 8-битовое двоичное представление 11 100
010 десятичного числа —30.
Режимы адресации памяти
Доступ к ячейкам памяти обеспечивается взаимодействием операционного блока и интерфейса шины
микропроцессора 8x86. Когда операционному блоку требуется прочитать или записать значение операнда,
находящегося в памяти, он передает значение смещения адреса интерфейсу шины. Последний добавляет
это смещение к содержимому регистра сегмента (предварительно дополненному четырьмя нулями) и тем
самым получает 20-битовый физический адрес, который и используется для доступа к операнду.
Исполнительный адрес
Смещение, которое вычисляется операционным блоком для доступа к находящемуся в памяти операнду,
называется исполнительным адресом операнда. Исполнительный адрес показывает, на каком расстоянии (в
байтах) располагается операнд от начала сегмента, в котором он находится. Будучи 16-битовым числом без
знака, исполнительный адрес позволяет получить доступ к операндам, находящимся выше начала сегмента
на расстоянии до 65535 (или 64К) байтов.
Время, затрачиваемое операционным блоком на вычисление исполнительного адреса, является одним из
основных компонентов общего времени исполнения команды. В зависимости от используемого режима
адресации получение исполнительного адреса может заключаться всего лишь в извлечении его как составной
части команды, но иногда могут потребоваться довольно долгие манипуляции, например сложение
извлеченной из команды составляющей с регистром базы и с индексным регистром. Даже если время
исполнения не является критичным для Вашей программы, стоит оценивать эти временные факторы в
процессе чтения следующих ниже описаний режимов адресации.
Прямая адресация
При прямой адресации исполнительный адрес является составной частью команды (так же, как значения при
непосредственной адресации). Микропроцессор 8x86 добавляет этот исполнительный адрес к сдвинутому
содержимому регистра сегмента данных DS и получает 20-битовый физический адрес операнда.
Обычно прямая адресация применяется, если операндом служит метка. Например, команда
MOV AX,TABLE
загружает содержимое ячейки памяти TABLE в регистр АХ. На рис. 1 показана схема исполнения этой
команды. Обратите внимание на то, что против ожидания микропроцессор 8x86 заполняет данные в памяти в
обратном порядке. Старший байт слова следует за младшим байтом, а не предшествует ему. Чтобы усвоить
это, запомните, что старшая часть (старшие биты) данных располагается в ячейках памяти со
старшими адресами.
Рис. 1. Прямая адресация Рис. 2. Косвенная регистровая адресация
Косвенная регистровая адресация
При косвенной регистровой адресации исполнительный адрес операнда содержится в базовом регистре ВХ,
регистре указателя базы ВР или индексном регистре (SI или DI). Косвенные регистровые операнды надо
заключать в квадратные скобки, чтобы отличить их от регистровых операндов. Например, команда
MOV AХ,[ВХ]
загружает в регистр АХ содержимое ячейки памяти, адресуемой значением регистра ВХ (рис. 2).
Как поместить смещение адреса в регистр ВХ? Один из методов состоит в применении команды LEA
(Загрузить исполнительный адрес). Например, для загрузки слова из ячейки TABLE в регистр АХ можно
воспользоваться последовательностью команд
LEA BX, TABLE
MOV AХ,[ВХ]
Эти две команды выполняют те же действия, что и одна команда
MOV AX,TABLE
с той лишь разницей, что в первом случае предыдущее содержимое регистра ВХ уничтожается. Если Вам
нужен доступ лишь к одной ячейке памяти (в данном случае TABLE), то разумнее воспользоваться одной
командой. Однако для доступа к нескольким ячейкам, начиная с данного базового адреса, гораздо лучше
иметь исполнительный адрес в регистре. Почему? Потому что содержимым регистра можно манипулировать,
не извлекая каждый раз новый адрес.
Адресация по базе
При адресации по базе Ассемблер вычисляет исполнительный адрес с помощью сложения значения сдвига с
содержимым регистров ВХ или ВР.
Регистр ВХ удобно использовать при доступе к структурированным записям данных, расположенным в
разных областях памяти. В этом случае базовый адрес записи помещается в базовый регистр ВХ и доступ к
ее отдельным элементам осуществляется по их сдвигу относительно базы. А для доступа к разным записям
одной и той же структуры достаточно соответствующим образом изменить содержимое базового регистра.
Предположим, например, что требуется прочитать с диска учетные записи для ряда работников. При этом
каждая запись содержит табельный номер работника, номер отдела, номер группы, возраст, тарифную ставку
и т.д. Если номер отдела хранится в пятом и шестом бантах записи, а начальный адрес записи содержится в
регистре ВХ, то команда
MOV AХ,[ВХ]+4
загрузит в регистр АХ номер отдела, в котором служит данный работник (рис. 3). (Сдвиг равен 4, а не 5,
потому что первый байт записи имеет номер 0.)
Ассемблер позволяет указывать адресуемые по базе операнды тремя разными способами. Следующие
команды эквивалентны:
MOV AХ,[ВР]+4 ;3то стандартная форма записи,
MOV AХ,4[ВР] ; но сдвиг можно указать на первом месте
MOV AХ,[ВР+4] ; или внутри скобок
Рис. 3. Адресация по базе Рис. 4. Прямая адресация с индексированием
Прямая адресация с индексированием
При прямой адресации с индексированием исполнительный адрес вычисляется как сумма значений сдвига и
индексного регистра (DI или SI). Этот тип адресации удобен для доступа к элементам таблицы, когда сдвиг
указывает на начало таблицы, а индексный регистр — на ее элемент.
Например, если B_TABLE — таблица байтов, то последовательность команд
MOV DI,2
MOV AL,В_TABLE[DI]
загрузит третий элемент таблицы в регистр AL.
В таблице слов соседние элементы отстоят друг от друга на два байта, поэтому при работе с ней надо
удваивать номер элемента при вычислении значения индекса. Если TABLE — таблица слов, то для загрузки
в регистр АХ ее третьего элемента надо использовать последовательность команд
MOV DI,4
MOV AХ,TABLE[DI]
(рис. 4).
Адресация по базе с индексированием
При адресации по базе с индексированием исполнительный адрес вычисляется как сумма значений базового
регистра, индексного регистра и, возможно, сдвига.
Так как в этом режиме адресации складывается два отдельных смещения, то он удобен при адресации
двумерных массивов, когда базовый регистр содержит начальный адрес массива, а значения сдвига и
индексного регистра суть смещения по строке и столбцу.
Предположим, например, что Ваша ЭВМ следит за шестью предохранительными клапанами на химическом
предприятии. Она считывает их состояния каждые полчаса и запоминает в ячейках памяти. За неделю эти
считывания образуют массив, состоящий из 336 блоков (48 считываний в течение семи дней) по шесть
элементов в каждом, а всего — 2016 значений.
Если начальный адрес массива загружен в регистр ВХ, сдвиг блока (номер считывания, умноженный на 12) в регистре DI, а номер клапана задан в переменной VALVE, то команда
MOV AX ,VALVE[BX][DI ]
загрузит требуемое считывание состояния клапана в регистр АХ. На рис. 5 изображен процесс извлечения
результата третьего считывания (с номером 2) для клапана 4 из массива, у которого смещение в сегменте
данных равно 100Н.
Приведем несколько допустимых форматов операндов, адресуемых по базе с индексированием:
MOVE AX,[BX+2+DI]
MOVE AX,[DI+BX+2]
MOVE AX,[BX+2][DI]
MOVE AX,[BX][DI+2]
КОМАНДЫ ПЕРЕСЫЛКИ ДАННЫХ
Команды пересылки данных осуществляют обмен данными и адресами между регистрами и ячейками памяти
или портами ввода-вывода. Эти команды разделены на четыре подгруппы: команды общего назначения,
команды ввода-вывода, команды пересылки адреса и команды пересылки флагов.
Команды общего назначения
Основная команда общего назначения MOV (move - переслать) может пересылать байт или слово между
регистром и ячейкой памяти или между двумя регистрами. Она может также пересылать непосредственно
адресуемое значение в регистр или в ячейку памяти.
Команда MOV имеет следующий формат:
MOV приемник, источник
В ней допустимо большинство из возможных сочетаний операндов.
Приведем несколько примеров:
MOV AX,TABLE ; Пересылка иэ памяти в регистр
MOV TABLE,AX ; и наоборот
MOV ES:[BX],АХ ; Можно заменить используемый регистр сегмента
MOV DS,AХ ; Пересылка между 16-битовыми регистрами
MOV BL.AL ; Пересылка между 8-битовыми регистрами
MOV CL,-30 ; Пересылка константы в регистр
MOV DE5T,25H ; или в память
В команде MOV исключаются следующие сочетания операндов:
1. Вы не можете осуществить непосредственную пересылку данных из одной ячейки памяти в другую. Чтобы
выполнить такую пересылку, данные источника надо загрузить в регистр общего назначения, а затем
запомнить содержимое этого регистра в приемнике. Например, если POUNDS и WEIGHT - переменные,
находящиеся в памяти, то для пересылки значения из одной переменной в другую можно воспользоваться
командами
MOV AX,POUNDS
MOV WEIGHT,AX
2. Вы не можете загрузить непосредственно адресуемый операнд в регистр сегмента. Как и в случае 1,
сначала надо загрузить его в регистр общего назначения. Например, следующие команды загружают номер
блока сегмента данных (DATA_SEG) в регистр DS:
MOV HX,DATA_SEG
MOV DS,AX
Подобные команды обычно сопутствуют оператору ASSUME в сегменте команд. Они указывают Ассемблеру,
где размещен сегмент данных.
3. Вы не можете непосредственно переслать значение одного регистра сегмента в другой. Делайте подобные
пересылки через регистр общего назначения. Например, чтобы регистр DS указывал на тот же сегмент, что и
регистр ES, воспользуйтесь командами
MOV AX,ES
MOV DS,AX
(Для выполнения этой операции можно воспользоваться командами PUSH и POP, которые будут описаны в
следующем разделе.)
4. Вы не можете использовать регистр CS в качестве приемника в команде пересылки.
Команда обмена XCHG
Команда обмена XCHG (exchange - обменять) меняет между собой значения двух регистров или регистра и
ячейки памяти. Однако она не может выполнить обмен значений регистров сегмента.
Приведем несколько примеров команд XCHG:
XCHG AX,BX ;Обменять значения двух регистров (слова
XCHG AL,BH ; или байты
XCHG WRD_LOC,DX ;Обменять значения ячейки памяти
ХСНG DL,BYTE_LOC ; и регистра
Команды ввода-вывода
Команды ввода-вывода используются для взаимодействия с периферийными устройствами системы. Они
имеют формат
IN аккумулятор, порт
OUT порт, аккумулятор
где аккумулятор — регистр AL при обмене байтами или регистр АХ при обмене словами. Операндом порт
может быть десятичное значение от 0 до 255, что позволяет адресоваться к 256 устройствам.
Download