Система команд ВМ86
Микропроцессор ВМ86 обладает развитой системой команд, включающей операции умножения и деления. Эти команды манипулируют байтами, словами, строками, 2/10-числами в упакованном и распакованном форматах [35, 38]. На уровне языка ассемблера в систему команд ВМ86 входит система команд ВМ80. Однако система команд ВМ86 имеет ряд недостатков, которые устранены в новом высокоинтегрированном однокристальном МП 80186 [54]. Системы команд МП 80186 и ВМ86 полностью совместимы на уровне объектного кода. Вместе с тем в состав команд МП 80186 много команд, которых не было в ВМ86 [46, 47].
В параграфе приводится набор команд нового МП 80186. Те команды, которых нет в составе команд ВМ86, выделены знаком «*». Таким образом, можно получить представление о дальнейшем усовершенствовании и расширении системы команд ВМ86.
Систему команд МП ВМ86 удобно разбить на шесть групп: пересылки, арифметической обработки, логической обработки, обработки строк, передачи управления, управления процессором. Рассмотрим их более подробно.
Основной формат двухадресной команды ОР dst, src имеет вид
code(dw) mod red r/m disp(mod)
Один из операндов кодируется полем reg и, следовательно, должен быть регистром. Второй операнд кодируется полями mod r/m и может быть как ячейкой памяти, так и регистром. Какой из операндов dst или src является регистром, определяет признак направления d в машинной инструкции: dst = reg, при d = 1, src = reg, при d = 0. В зависимости от mod может потребоваться дополнительная 8- или 16-разрядная адресная компонента disp(mod), следующая непосредственно за постбайтом. Данный формат допускает операции как с байтами (w = 0), так и со словами (w = 1).
В формате не предусмотрена возможность кодирования непосредственной адресации. Поэтому для команд вида ОР dst, data применяется специальный формат
code(w/sw) mod code r/m disp(mod) data(w/sw)
Существуют также часто используемые короткоформатные варианты этих двухадресных команд. Операции с аккумулятором AL или АХ: ОР асc, data имеют формат
code(w) data(w)
Команды пересылки. Группа команд пересылки представлена в табл. 6.8. Наиболее мощная команда этой группы MOV dst, src предусматривает использование в качестве источника src или приемника dst одного из регистров адресов/данных AL—BH (w = 0) или AX—SP (w = 1):
MOV MOV | dst, reg reg, dst | ;признак d = 0 ;признак d = 1 |
Таблица 6.8
Мнемоника | Формат | ||
MOV dst, src | 100010dw | mod reg r/m | |
MOV dst, data | 1100011w | mod 0 r/m | data (w) |
MOV reg, data | 1011wreg | data (w) | |
MOV асc, offset | 1010000w | offset | |
MOV offset, асc | 1010001w | offset | |
MOV seg, src | 8E | mod 0 seg r/m | |
MOV dst, seg | 8C | mod 0 seg r/m | |
PUSH src | FF | mod 6 r/m | |
PUSH reg | 01010 reg | ||
PUSH seg | 000seg110 11O | ||
PUSH data* | 011010S0 | data (s) | |
PUSHA* | |||
POP src | 8F | mod 0 r/m | |
POP reg | 01011 reg | ||
POP seg | 000seg111 | ||
POPA* | |||
XCHG dst, reg | 1000011w | mod reg r/m | |
XCHG AX, reg | 10010 reg | ||
IN acc, port8 | 1110010w | port8 | |
IN acc, DX | 1110110w | ||
OUT port8, acc | 1110011w | port8 | |
OUT DX, acc | 1110111w | ||
XLAT | D7 | ||
LEA reg, src | 8D | mod reg r/m | |
LDS reg, src | C5 | mod reg r/m | |
LES reg, src | C4 | mod reg r/m | |
LAHF | 9F | ||
SAHF | 9E | ||
PUSHF | 9C | ||
POPF | 9D | ||
П р и м е ч а н и е. В команде MOV seg, src seg ¹ 1 (CS), в команде POP seg seg ¹ 1 (CS), в команде XCHG AX, reg reg ¹ 0 (AX), в командах LEA reg, src LDS reg, src LES reg, src mod ¹ 11 (reg) |
Второй операнд определяется одним из восьми способов адресации, приведенных в табл. 6.5 и кодируемых полями mod r/m постбайта.
Направление пересылки определяется признаком d в машинной команде.
Постбайт не обеспечивает поддержку непосредственного способа адресации. По этой причине введен специальный формат команды
MOV dst, data
где data—адресное выражение типа CONSTANT. В обоих случаях пересылке подлежат либо байт (w = 0), либо слово (w = 1). Указателем типа данных в первом случае служит мнемоника регистра, во втором—тип dst.
Для реализации эффективной работы с наиболее часто применяемыми операциями загрузки регистров в состав машинных команд пересылки введены короткоформатные варианты
MOV reg, data
MOV асc, offset
MOV offset, асc
Хотя эти команды и являются частными случаями вышеприведенных, но их формат по крайней мере на один байт короче первых, что дает возможность построить более эффективный код. Указателем типа данных служит имя регистра, использованного в командах.
Примерами команды пересылки могут служит следующие:
MOV AX, WORD PTR [ВХ]
MOV ВР, OFFSET BUF
MOV BYTE PTR [BX], 0
В составе набора имеются две команды загрузки сегментных регистров и считывания их содержимого. Команда загрузки CS не определена, т. е. нет возможности выполнить прямую загрузку сегментного регистра CS. Это объясняется тем, что смена селектора кодового сегмента без изменения содержимого IP—смещения внутри кодового сегмента—приведет к практически не имеющей смысла передаче управления. По этой причине загрузка CS допускается только в командах межсегментной передачи управления. Следует отметить, что загрузка сегментных регистров непосредственными данными отсутствует. Для выполнения такой операции требуется двухшаговая процедура
MOV AX, SEG VAR
MOV DS, АХ
обеспечивающая загрузку селектора переменной VAR в регистр DS.
Команды PUSH и POP организуют доступ к системному стеку стандартного типа. При этом пересылке подлежат только слова. Команды обеспечивают загрузку и выборку из стека операндов, хранимых как в памяти, так и в регистровой области МП. В последнем случае допускается более короткий формат кодирования. Операция загрузки CS из стека независимо от IP не определена по тем же причинам, что и ранее.
К недостаткам команд группы пересылок ВМ86 следует отнести отсутствие возможности загрузки непосредственных данных в стек. Необходимость такой загрузки возникает довольно часто при использовании стека для передачи параметров. В рамках системы команд ВМ86 для этого требуется двушаговая процедура
MOV AX, data
PUSH AX
Этот недостаток устранен в новом МП 80186, в систему команд которого введена команда PUSH data.
Охват командами PUSH и POP всего набора регистров, включая сегментные, обеспечивает быстрое переключение выборочного контекста МП. Однако процесс сохранения и восстановления полного контекста МП, необходимый при переключениях задач и обработки прерываний, требует довольно длительного времени. Поэтому в состав команд 80186 введены две новые команды PUSHA (PUSH All) и РОРА (POP All), обеспечивающие быстрое переключение контекста. По команде PUSHA в стек последовательно загружаются содержимое всех восьми регистров адресов/данных. Загрузка выполняется в следующем порядке: АХ, СХ, DX, ВХ, начальное значение SP, BP, SI и DI. Команда РОРА восстанавливает регистры в обратной последовательности. При этом выталкиваемое из стека значение SP теряется из-за ненадобности.
В составе группы команд пересылки ВМ86 находится команда обмена XCHG с форматами двух типов. Один из них обеспечивает обмен данными между регистром и памятью/регистром. Допускается обмен как словами, так и байтами. Другой более короткий формат может быть применен для кодирования операции обмена между аккумулятором АХ и регистром reg (reg ¹ AX).
В МП ВМ86 используется изолированный ВВ. Для обмена данными с пространством ВВ имеются две команды ввода IN и две команды вывода OUT. Первая пара команд IN и OUT работает с коротким 8-разрядным адресом, обеспечивающим доступ к первым 256 портам ВВ с младшими адресами. При обращении к портам со старшими адресами реализуется второй вариант команд IN и OUT с косвенной регистровой адресацией, когда регистр DX служит 16-разрядным указателем порта. Во всех случаях роль источника или приемника данных выполняет аккумулятор, порт при этом может быть как 8-, так и 16-разрядным. Примеры команд ВВ:
IN AX, 32H
OUT DX, AL
Специальная команда XLAT осуществляет замену содержимого AL байтом из 256-байтовой таблицы преобразования, адресуемой регистром ВХ. Индекс таблицы определяется первоначальным значением AL. Класссическим примером использования этой команды служит преобразование кодов.
По команде LEA в регистр reg загружается исполнительный адрес (смещение) операнда src. Операнд источника должен быть расположен в памяти. Эта команда применяется для предварительной настройки соответствующих регистров на объекты. Например, команда XLAT требует предварительной настройки регистра ВХ, которая может быть выполнена следующим образом:
LEA ВХ, TAB
где TAB—переменная, обозначающая массив из 256 байт.
Две другие команды обеспечивают пересылку 32-разрядных слов, обычно интерпретируемых как полные указатели seg:offset логического пространства адресов. В команде LDS селектор загружается в регистр DS, тогда как команда LES предусматривает загрузку селектора в дополнительный сегментный регистр ES. Смещение offset всегда загружается в один из регистров reg. Одновременная загрузка полного логического адреса в пару SS:SP отсутствует. Для этого используется пара команд
MOV SS, WORD PTR PTRADDR + 2
MOV SP, WORD PTR PTRADDR
После команды MOV ss, src прерывания не проверяются, что обеспечивает согласование значений SS и SP. При другой последовательности инициализации стека необходимо предусмотреть защиту от возможного появления запросов на прерывания, переход на процедуры обслуживания которых может разрушить содержимое некоторых ячеек памяти из-за несогласованности SS и SP. Этот недостаток устранен в 32-разрядном МП 80386, в состав команд которого введена команда LSS, реализующая загрузку полного логического адреса в пару SS:reg.
Команда LAHF копирует содержимое младшего байта флажкового регистра F в регистре АН. Команда SAHF выполняет обратную пересылку. Эти команды предназначены для обеспечения совместимости ВМ86 и ВМ80 на уровне ассемблера, так как дают возможность рассматривать регистр АХ как аналог регистра PSW микропроцессора ВМ80.
Команды PUSHF и POPF являются частным случаем операции доступа к системному стеку. Они расширяют возможности операции загрузки и считывания из стека на флажковый регистр F. В системе команд ВМ86 отсутствует какая-либо команда по установке/сбросу флажка трассировки TF. Эта операция может быть выполнена только с помощью команды POPF.
Все команды пересылки, за исключением SAHF и POPF, не изменяют состояния флажкового регистра.
Команды арифметической обработки. Представленная в табл. 6.9 группа содержит ряд типичных для МП команд арифметической обработки:
ADD Сложение
ADC Сложение с переносом
SUB Вычитание
SBB Вычитание с заемом
СМР Арифметическое сравнение
INC Увеличение на 1
DEC Уменьшение на 1
NEG Изменение знака
Таблица 6.9
Мнемоника | Формат | ||
ADD dst, src | 000000dw | mod reg r/m | |
ADD dst, data | 100000sw | mod 0 r/m | data (sw) |
ADD acc, data | 0000010w | data (w) | |
ADC dst, src ADC dst, data | 000100dw 100000sw | mod reg r/m mod 2 r/m | data (sw) |
ADC acc, data | 0001010w | data (w) | |
INC dst | 1111111w | mod 0 r/m | |
INC reg | 01000reg | ||
SUB dst, src SUB dst, data | 001010dw 100000sw | mod reg r/m mod 5 r/m | data (sw) |
SUB acc, data | 0010110w | data (w) | |
SBB dst, src | 000110dw | mod reg r/m | |
SBB dst, data | 100000sw | mod 3 r/m | data (sw) |
SBB acc, data | 0001110w | data (w) | |
DEC dst | 1111111w | mod 1 r/m | |
DEC reg | 01001reg | ||
CMP dst, src | 001110dw | mod reg r/m | |
CMP dst, data | 100000sw | mod 7 r/m | data (sw) |
CMP acc, data | 0011110w | data (w) | |
NEG dst | 1111011w | mod 3 r/m | |
AAA | |||
DAA | |||
AAS | 3F | ||
DAS | 2F | ||
MUL src | 1111011w | mod 4 r/m | |
IMUL src | 1111011w | mod 5 r/m | |
IMUL reg, src, data* | 011010s1 | mod reg r/m | data (s) |
DIV src | 1111011w | mod 6 r/m | |
IDIV src | 1111011w | mod 7 r/m | |
AAM | D4 | 0A | |
AAD | D5 | ||
CBW | |||
CWD | |||
BOUND reg, src* | mod reg r/m | ||
П р и м е ч а н и е. В команде BOUND reg, src mod ¹ 11 |
Все эти команды кодируются стандартными для ВМ86 способами. Они работают как со словами, так и с байтами. Операнды команд могут быть либо целым без знака, либо целым со знаком. В последнем случае применяется дополнительный код представления чисел. В данном случае различие между беззнаковой целочисленной арифметикой и со знаком состоит не в способе выполнения операций, а в интерпретации содержимого операндов и флажков признаков результата. Флажки устанавливаются типовым образом.
Набор команд сложения и вычитания расширен одноадресными операциями умножения и деления целых со знаком и без него:
MUL Умножение без знака
IMUL Умножение со знаком
DIV Деление без знака
IDIV Деление со знаком
Операции могут выполняться со словами и с байтами, что определяется типом src. Источником одного из операндов и приемником результата служит неявно адресуемый 8-, 16- или 32-разрядный аккумулятор, в качестве которого используется AL, АХ или пара DX:AX соответственно. При этом DX представляет старшую часть аккумулятора. Операции умножения и деления выполняются по схеме
аccN • srcN®acc2N
acc2N:srcN®acc2N, N = 8 или 16
После выполнения операции деления в младшей части аккумулятора хранится N-разрядное частное, а в старшей—N-разрядный остаток. При делении на нуль генерируется прерывание типа 0.
При выполнении операций деления и умножения могут быть полезны две вспомогательные команды расширения чисел со знаком:
CBW Расширение байта AL в слово АХ
CWD Расширение слова АХ в двойное слово DX:AX
В состав арифметической группы введены команды для поддержки 2/10-арифметики в упакованном формате:
DAA Десятичная коррекция AL при сложении
DAS Десятичная коррекция AL при вычитании
а также неупакованном, например в коде КОИ-7:
ААА Коррекция AL в коде КОИ-7 при сложении
AAS Коррекция AL в коде КОИ-7 при вычитании
ААМ Коррекция AL в коде КОИ-7 при умножении
AAD Коррекция AL в коде КОИ-7 при делении
При выполнении десятичной арифметики предполагается, что исходные данные уже представлены в соответствующем формате. Для представления конечного результата в коде КОИ-7 необходимо с каждой распакованной 2/10-цифрой, еще находящейся в аккумуляторе, выполнить действие
OR AL, 30Н
К недостаткам арифметической группы можно отнести отсутствие операций умножения и деления на литерал. Этот недостаток частично устранен в МП 80186.
В МП 80186 возможности команды IMUL расширены. Введено 16-разрядное умножение на литерал, имеющее два варианта записи:
IMUL reg, data
IMUL reg, src, data
Схема выполнения этих команд соответственно имеет вид
reg • data®reg
src • data®reg
Нетрудно заметить, что первый вариант является специальным случаем второго, когда src = reg.
В МП 80186 также предусмотрена команда проверки границ BOUND, благодаря которой упрощается работа с массивами данных. Для использования этой команды индекс массива помещается в один из регистров reg, а границы массива—в два соседних слова памяти (сначала нижняя, а затем верхняя). Команда проверяет вхождение индекса в интервал, отмеченный границами (граничные точки входят в интервал). В случае выхода за границы генерируется прерывание типа 5.
Команды логической обработки. Наиболее часто используемые операции логической обработки включены в набор команд МП ВМ86 (табл. 6.10). Среди них:
AND Логическое И
OR Логическое ИЛИ
XOR Исключающее ИЛИ
TEST Логическое сравнение
NOT Инверсия
Таблица 6.10
Команда | Формат | ||
AND dst, src | 001000dw | mod reg r/m | |
AND dst, data | 1000000w | mod 100 r/m | data (w) |
AND acc, data | 0010010w | data (w) | |
TEST reg, src | 1000010w | mod reg r/m | |
TEST dst, data | 1111011w | mod 000 r/m | data (w) |
TEST acc, data | 1010100w | data (w) | |
OR dst, src | 000010dw | mod reg r/m | |
OR dst, data | 1000000w | mod 001 r/m | data (w) |
OR acc, data | 0000110w | data (w) | |
XOR dst, src | 001100dw | mod reg r/m | |
XOR dst, data | 1000000w | mod 110 r/m | data (w) |
XOR acc, data | 0011010w | data (w) | |
NOT dst | 1111011w | mod 010 r/m | |
ROL dst, 1/CL | 110100vw | mod 000 r/m | |
ROR dst, 1/CL | 110100vw | mod 001 r/m | |
RCL dst, 1/CL | 110100vw | mod 010 r/m | |
RCR dst, 1/CL | 110100vw | mod 011 r/m | |
SHL/SAL dst, 1/CL | 110100vw | mod 100 r/m | |
SHR dst, 1/CL | 110100vw | mod 101 r/m | |
SAR dst, 1/CL | 110100vw | mod 111 r/m | |
ROL dst, cnt* | 1100000w | mod 000 r/m | cnt |
ROR dst, cnt* | 1100000w | mod 001 r/m | cnt |
RCL dst, cnt* | 1100000w | mod 010 r/m | cnt |
RCR dst, cnt* | 1100000w | mod 011 r/m | cnt |
SHL/SAL dst, cnt* | 1100000w | mod 100 r/m | cnt |
SHR dst, cnt* | 1100000w | mod 101 r/m | cnt |
SAR dst, cnt* | 1100000w | mod 111 r/m | cnt |
Для кодирования команд применены стандартные для ВМ86 способы. Возможности адресации здесь те же, что и у команд арифметической обработки. Операции с аккумулятором имеют укороченный формат.
В рассматриваемую группу включен полный набор команд логического и арифметического сдвига на одну или несколько позиций вправо (влево), что определяется вторым операндом. Когда второй операнд равен единице (v = 0), команды реализуют обычные сдвиги вправо (влево) на одну позицию. Когда в качестве второго операнда используется символ CL (v = 1), команды образуют группу параметрических сдвигов на число позиций, определяемое содержимым CL. В составе операций сдвига следующие команды:
SAR, SAL Арифметический сдвиг
SHR, SHL Логический сдвиг
ROR, ROL Циклический сдвиг
RCR, RCL Расширенный сдвиг через CF
Среди недостатков группы команд логической обработки можно отметить отсутствие команд сдвига по литералу и команд поразрядной обработки. Первый недостаток устранен в МП 80 186, в состав команд которого введен полный набор операций сдвига по литералу. Команды, манипулирующие битами, будут реализованы только в МП 80 386.
Команды обработки строк. В системе команд ВМ86 существует ряд средств по организации процедур обработки строк. Сюда входят базовые команды и префиксы повторения, кодировка которых приведена в табл. 6.11.
Таблица 6.11
Мнемоника | Формат | |
MOVS | type PTR [DI], seg:type PTR [SI] | 1010010w |
MOVSB | A4 | |
MOVSW | A5 | |
CMPS | type PTR [DI], seg:type PTR [SI] | 1010011w |
CMPSB | A6 | |
CMPSW | A7 | |
SCAS | type PTR [DI] | 1010111w |
SCASB | AE | |
SCASW | AF | |
LODS | seg:type PTR [SI] | 1010110w |
LODSB | AC | |
LODSW | AD | |
STOS | type PTR [DI] | 1010101w |
STOSB | AA | |
STOSW | AB | |
INS | type PTR [DI], DX | 0110110w |
INSB | 6C | |
INSW | 6D | |
OUTS | DX, seg:type PTR [SI] | 0110111w |
OUTSB | 6E | |
OUTSW | 6F | |
REP | minstr | F2 |
REPE/REPZ | cinstr | F3 |
REPNE/REPNZ | cinstr | F2 |
Базовые строковые операции используют регистр SI для адресации элемента исходной строки и регистр DI для указания на элемент строки-результата. Последняя всегда располагается в сегменте дополнительных: данных. Элемент строки может быть байтом или словом. Во время выполнения операции указатели операндов SI и DI автоматически модифицируются на один или два в зависимости от типа элемента. Направлением модификации управляет флажок DF. Если DF = 0, то реализуется увеличение указателей, если DF = 1—уменьшение.
В группе имеется пять базовых команд:
MOVC Пересылка элемента строки
CMPS Сравнение элементов строк методом вычитания [SI]—[DI]
SCAS Сравнение элемента строки с содержимым аккумулятора по схеме асc—[DI]
LODS Загрузка элемента строки в аккумулятор
STOS Передача содержимого аккумулятора в результирующую строку
Операции CMPS и SCAS устанавливают ряд признаков результата, сам результат не возвращают. Размер операнда определяется типом адресных выражений
ОР WORD PTR[DI], WORD PTR [SI]
Существует вариант использования модификатора имени команды (суффикс В или W) для указания размера операндов, например MOVSB, LODSW. В этом случае адресные выражения не нужны и, следовательно, отсутствует возможность замены сегмента, в котором расположена строка-источник.
Любая из базовых команд может иметь префикс повторения, показывающий, что базовая операция будет повторена несколько раз. При этом регистр СХ применяется в качестве счетчика числа повторений. Выход из цикла реализуется по нулевому значению СХ. Проверка счетчика повторений на нуль выполняется перед каждой базовой операцией. Это означает, что нулевое начальное значение счетчика СХ не вызовет никаких действий.
Существует несколько вариантов префикса повторений:
REP Повторить
REPE/REPZ Повторить, пока равно
REPNE/REPNZ Повторить, пока не равно
Первый префикс используется для повторения команд пересылки minstr:MOVS, STOS известное число раз. Он реализует итерацию
while CX ¹ 0 do
begin CX: = CX – 1; minstr
end
Четыре других варианта префикса служат для повторения команд сравнения cinstr:CMPS, SCAS. В отличие от первого эти префиксы осуществляют выход из цикла при СХ = 0 и ZF = 1 или ZF = 0 соответственно. Алгоритм их работы можно определить следующим образом:
while CX ¹ 0 do
begin CX: = CX – 1; cinstr
if ZF = 0/1 then exit
end
Такой префикс дает возможность сравнивать цепочки, находить конкретные символы в них, выполнять другие практически важные операции.
Более сложные процедуры обработки строк реализуются с помощью команд управления циклами типа LOOP, которые будут рассмотрены ниже. Комбинируя базовые операции с префиксами повторения и командами управления итерациями, можно построить мощные и эффективные процедуры символьной обработки. При этом очень полезной может оказаться команда трансляции XLAT, преобразующая коды символов и разбивающая символы на различные классы.
В МП 80186 добавлено две новых базовых команды типа minstr, которые обеспечивают организацию блочного ВВ:
INS Ввод элемента строки
OUTS Вывод элемента строки
Они работают примерно так же, как и команда пересылки элемента строки MOVS, за исключением того, что одним из операндов служит порт, адресуемый DX. Здесь также существуют варианты указания типа элемента с помощью модификатора имени.
Команды передачи управления. В группе команд передачи управления (табл. 6.12) прежде всего следует выделить:
JMP Переход
CALL Вызов подпрограммы
RET Возврат из подпрограммы
Таблица 6.12
Мнемоника | Формат | ||
JMP | disp8 | E8 | disp8 |
JMP JMP | disp src16 | E9 FF | disp mod 100 r/m |
JMP | sel:offset | EA | offset sel |
JMP | src32 | FF | mod 101 r/m |
CALL CALL | disp src16 | E8 FF | disp mod 010 r/m |
CALL | sel:offset | 9A | offset sel |
CALL | src32 | FF | mod 011 r/m |
near RET | C3 | ||
near RET | n | C2 | n |
far RET | CB | ||
far RET | n | CA | n |
Jcc | disp8 | ||
LOOP | disp8 | ||
LOOP(Z/E) | disp8 | ||
LOOP(NZ/NE) | disp8 | ||
JCXZ | disp8 | ||
П р и м е ч а н и е. В командах JMP src16, JMP src32, CALL src166, CALL src32 mod ¹ 11 |
Эти команды обеспечивают передачу управления как внутри сегмента (типа NEAR), так и с выходом из него (типа FAR). Поэтому каждая команда имеет несколько кодов и форматов, выбираемых в зависимости от типа операнда ехрr.
Существуют четыре разновидности каждой команды в соответствии с четырьмя допустимыми типами операнда ехрr: NEAR, PTR, FAR PTR, WORD PTR и DWORD PTR. Они используются для внутрисегментной и межсегментной прямой передачи управления, а также внутрисегментной и межсегментной косвенной передачи управления соответственно. В последнем случае место расположения адреса передачи управления, кодируемого словом или двойным словом, определяется одним из способов адресации с помощью постбайта.
Передача управления внутри текущего сегмента связана с изменением только содержимого IP, тогда как передача управления между сегментами требует изменения содержимого не только IP, но и селектора CS. При вызовах подпрограмм это обстоятельство учитывается также тем, что в первом случае в стеке сохраняется только IP, а во втором—пара CS:IP.
Когда объявляется вход в подпрограмму, ему присваивается тип NEAR или FAR. Явно это делается с помощью специальной директивы объявления PROC [10, 35]:
SUB1 PROC NEAR
¾
RET
SUB1 ENDP
SUB2 PROC FAR
¾
RET
SUB2 ENDP
Тогда обращение CALL SUB1 должно быть выполнено в NEAR-формате, a CALL SUB2—в FAR-формате. В первом случае RET имеет NEAR-форму, а во втором он реализуется в FAR-форме. Считается, что подпрограммы типа NEAR необъявленные. Согласование типов подпрограмм, их вызовов и возвратов возлагается на программиста.
Для каждого типа команд возврата существует две ее разновидности:
RET
RET n16
Здесь n16—целое, которое используется для увеличения содержимого SP после возврата. Эта команда может быть применена для удаления параметров, записанных в стек выполнением команды вызова.
Команды условной передачи управления, имеющие вид Jcc disp8, могут осуществлять или не осуществлять переход в зависимости от состояния флажков регистра F. Каждая из этих 18 команд опрашивает соответствующую комбинацию флажков для определения условия перехода в соответствии с табл. 6.7. Если условие не выполняется, то управление передается следующей команде. При выполнении условия управление передается по адресу $ + disp8. Здесь адресное значение disp8 интерпретируется как целое со знаком, обеспечивающее относительную передачу управления в диапазоне –128 ¸ +127 байт. Такой тип передачи управления называют коротким (SHORT).
Существует также вариант безусловной команды JMP с относительным адресом. Для явного указания на использование JMP типа SHORT применяется ключевое слово SHORT:
JMP SHORT M1
Читателю предлагается его сравнить с обычным переходом типа NEAR
JMP M1
Команды управления итерацией служат для организации программных циклов. Они используют регистр СХ в качестве счетчика. Подобно командам условного перехода команды управления итерацией предполагают относительную адресацию в пределах –128 ¸ +127 байт и, следовательно, являются короткими (SHORT):
LOOP disp8 ;СХСХ – 1;
;if CX ¹ 0 then IPIP + disp8
;else exit;
LOOPE/ ;CXCX – 1;
/LOOPZ ;if CX = 0 and ZF = 1 then IPIP + disp8
disp8 ;else exit;
LOOPNE/ ;CXCX – 1;
LOOPNZ ;if CX ¹ 0 and ZF = 0 then IPIP + disp8
disp8 ;else exit;
JCXZ disp8 ;if CX = 0 then IPIP + disp8
;else exit;
Последнюю команду целесообразно применять в начале цикла для его обхода по СХ = 0, т. е. для исполнения нулевых периодов цикла.
Команды управления процессором. В состав группы (табл. 6.13) входит ряд команд управления прерываниями, которые позволяют программам активизировать процедуры обслуживания прерываний:
INT vect ;–(SP)F
;TF0, IF0
;–(SP)CS(4 • vect + 2)
;–(SP)IP(4 • vect)
Taблица 6.13
Команда | Формат | ||
ENTER n, 1* | C8 | n16 | |
LEAVE* | C9 | ||
INT vect | CD | vect | |
INT 3 | CC | ||
INTO | CE | ||
IRET | CF | ||
CLC | F8 | ||
CMC | F5 | ||
STC | F9 | ||
CLD | FC | ||
STD | ED | ||
CLI | FA | ||
STI | FB | ||
HLT | F4 | ||
NOP | |||
LOCK | F0 | ||
WAIT ESC op, ptr | 9B 11011XXX | mod XXX r/m | |
seg: | 001seg110 |
Если vect = 3, то формируется укороченный однобайтовый вариант инструкции прерывания
INT 3
Еще одна инструкция прерывания
INT 0 ;if OF = 1 then INT 4
;else exit;
используется после арифметических или логических команд для активации процедур обслуживания переполнения. По специальной команде выполняется операция выхода из процедуры обслуживания прерывания
IRET ;IP(SP)+
;CS(SP)+
;F(SP)+
Более подробно информация о прерываниях изложена в § 6.6.
Группа из семи команд позволяет изменять содержимое флажков CF, DF и IF в регистре F:
CLC ;CF0
CMC ;CFNOT CF
STC ;CF1
CLD ;DF0
STD ;DF1
CLI ;IF0
STI ;IF1
Если первые три команды поддерживают обычное управление флажков переноса CF, то две следующие необходимы для указания направления размещения строк. Последние две команды эквивалентны командам запрета и разрешения маскируемых прерываний по входу INTR.
Команда HLT вызывает переход МП в состояние останова. Процессор может быть выведен из данного состояния либо подачей активного уровня на линию RESET, либо при получении запроса на прерывание от внешних средств. Команда HLT является альтернативой бесконечному программному циклу в ситуациях ожидания запроса на прерывания.
Команда NOP не вызывает никаких действий МП.
Префикс LOCK может быть использован в многопроцессорной системе для организации доступа к общему ресурсу, такому, как буфер, указатель, блок данных. В таких системах одновременный доступ к одному и тому же ресурсу со стороны двух и более процессоров может привести к ошибке. Для предотвращения этого в состав МС вводятся специальные системные объекты-семафоры (см. § 4.12), которые обеспечивают монопольное владение ресурсом одним процессором. Захват ресурса другими процессорами разрешается только после его освобождения.
Пусть байт SEM—семафор типа: 0—«Свободно»; 1—«Занято». Операция тестирования семафора и его установки в случае состояния «Свободно» может быть модифицирована в операцию считывания семафора с одновременной его установкой в состояние «Занято» и последующим анализом считанного состояния. При этом наиболее важным является этап считывания и установки. Считывание и установка должны выполняться одновременно. Этот этап можно легко осуществить с помощью команды XCHG—обмена состояния семафора с регистром, который предварительно устанавливается в необходимое состояние. Однако фаза исполнения команды XCHG состоит из нескольких циклов обращения к каналу. Для предотвращения захвата магистрали и перехвата семафора в этот период необходимо использовать префикс LOCK. Например:
MOV AL, 1
WAIT: LOCK
XCHG AL, SEM
TEST AL, AL
JNZ WAIT
;Доступ к ресурсу
MOV SEM, 0
Команда WAIT переводит МП в состояние бесконечного ожидания активного уровня на входе TEST. Эта команда оказывается полезной при синхронизации программы с некоторыми внешними событиями.
Команда ESC предоставляет возможность другому процессору (сопроцессору) получить команду, кодируемую в поле ор, а также хранящийся в памяти и кодируемый полем src операнд. При этом функция генерации адреса в соответствии с src возлагается на основной процессор.
Дата добавления: 2019-02-07; просмотров: 542;