Система команд ВМ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;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.113 сек.