Особенности выполнения отдельных команд 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Особенности выполнения отдельных команд



Приведем здесь описание лишь некоторых команд, выбранных по принципу частоты их использования или трудности освоения. Описание остальных ко­манд можно найти в [2—5].

Команды пересылки данных составляют четыре подгруппы: общие, обра­щения к стеку, ввода — вывода и пересылки цепочек (последние рассмотрены вместе с другими цепочечными командами). Эти команды, за исключением POPF и SAHF, не влияют на флаги.

Рис. 2.5. Форматы команды MOV

Команда MOV (рис. 2.5) осуществляет пересылку содержимого источника src в получатель dst и имеет обобщенное представление:

MOV dst, src; dstsrc

Команда MOV r1/m, r2/m содержит постбайт и обеспечивает пересылки регистр - регистр/память и память - регистр при использовании любого об-щего регистра и любого способа адресации памяти. Бит w определяет передачу байта или слова, а бит d - направление передачи. Команда MOV r/m, d по-зволяет передать непосредственные данные в общий регистр или ячейку памя-ти. Команда MOV r, d представляет более короткий вариант (специальный формат) предыдущей команды и осуществляет загрузку констант в общие регистры.

Команды MOV ac,m и MOV m,ас предназначены для загрузки и запо-минания содержимого аккумуляторов AL и АХ при использовании прямой адресации. Обращение производится к текущему сегменту данных, и адрес, указанный в команде, представляет смещение в этом сегменте. Если пересыла-ются два байта, то младший располагается по указанному адресу, а стар-ший - по следующему адресу.

Команды MOV sr,r/m и MOV r/m,sr осуществляют пересылки между сегментным регистром и регистром или памятью. При этом передаются только слова, а ячейка памяти может быть определена с помощью любого допустимого способа адресации. Следует учитывать, что в команде MOV sr,r/m нельзя указывать сегментный регистр кода CS, так как при этом результат операции неопределен (выполнение этой команды было бы равносильно специальному безусловному переходу в программе).

Так как не существует команды непосредственной загрузки сегментных регистров, то команда MOV sr,r/m используется для инициализации регистров SS, DS и ES, т. е. для определения соответствующих сегментов памяти. Если, например, в регистр DS необходимо загрузить число 8000, то потребуется две команды:


MOV AX, 8000H; Инициализация регистра DS на 8000

MOV DS, AX;

При этом в качестве промежуточного регистра обычно используется АХ, так как команда MOV ac,d короче более общей команды MOV m/r,d.

Возможна также инициализация сегментных регистров из программной памяти при использовании префикса замены сегмента для замены DS на CS при вычислении адреса ЕА в следующих командах с прямой адресацией:

MOV DS, CS: ADS; Инициализация DS

MOV ES, CS: AES; Инициализация ES

MOV SS, CS: ASS; Инициализация SS

Напомним, что МП ВМ86 обеспечивает защиту процесса инициализации регистров SS и SP, состоящего из двух команд:

MOV SS, CS: ASS

MOV SP, CS: ASP

от прерываний, чтобы гарантировать правильную работу стека. (Операнды ADS, AES, ASS, ASP обозначают адреса ячеек памяти, в которых хранятся базовые адреса соответствующих сегментов.)

Рис. 2.6. Команда XCHG

 

Команда XCHG (рис. 2.6) осуществляет обмен данными между источни-ком и получателем:

XCHG dst,src; dst«src

и имеет два формата. Общий формат позволяет произвести обмен содержимым любой пары общих регистров, а также обмен между общим регистром и ячей-кой памяти при любом допустимом способе адресации. Укороченный формат осуществляет обмен любого общего регистра и аккумулятора АХ. Команда XCHG АХ, АХ, 16-ричный код которой равен 90, используется как команда пустой операции NOP, обеспечивающая задержку ЗТ.

XLAT - однобайтная команда с кодом операции D7 предназначена для быстрого преобразования кодов и заменяет содержимое AL на байт из 256-бай-товой таблицы, начальный (базовый) адрес которой содержится в регистре ВХ (рис. 2.7). Другими словами, содержимое AL используется как индекс таблицы, находящейся в сегменте данных и адресуемой регистром ВХ. При выполнении этой команды к содержимому ВХ прибавляется содержимое AL, а полученный результат используется как смещение относительно DS. Адресуе-мый таким образом байт из памяти пересылается в AL.

Рис. 2.7. Действие команды XLAT Рис. 2.8. Команды LEA, LDS, LE5

 

Команды LEA, LDS, LES (рис. 2.8) отличаются от других команд пересылки тем, что при их выполнении в адресуемый регистр (регистры) передаются не собственно данные из памяти, а их адреса. Основное назначение этих команд - инициализация регистров перед выполнением цепочечных команд или перед вызовом подпрограммы.

Команда LEA r, m обеспечивает вычисление эффективного адреса ЕА ячейки памяти в соответствии с указанным способом адресации и загрузку ЕА (а не содержимого адресуемой ячейки памяти!) в указанный общий регистр. Такая операция может потребоваться, например, для загрузки начального адреса таблицы в регистр ВХ перед выполнением команды XLAT.

Команды LDS r/m и LES r,m загружают адресную информацию из памяти в адресуемый общий регистр и в соответствующий сегментный регистр. Сначала вычисляется адрес ЕА памяти, который, как обычно, суммируется с содержимым регистра DS, затем слово из памяти по вычисленному адресу загружается в общий регистр, а следующее слово - в регистр DS (команда LDS) или ES (команда LES). При этом кодирование поля md=ll (регистровая адресация) не должно использоваться, так как действия команд в этом случае не определены.

 


Команды LDS и LES упрощают коммутацию сегментов данных, поскольку одновременно загружают базовый или индексный регистр и сегментный регистр. Если эти команды подготавливают обращение к цепочке, то в команде LDS указывается регистр DI (цепочка-источник расположена в сегменте данных и адресуется регистром DI), а в команде LES-регистр DI (цепочка-получатель обязательно находится в дополнительном сегменте и адресуется регистром DI).

Арифметические команды выполняются над целыми числами четырех типов: беззнаковыми и знаковыми двоичными, упакованными и неупакованными десятичными.

Беззнаковые двоичные числа могут иметь длину 8 или 16 бит, каждый из которых является значащим, т. е. учитывается при определении значения числа. Это обеспечивает диапазон представления чисел 0-255 и 0- 65 535 соответственно. Для таких чисел имеются команды сложения, вычитания, умножения и деления.

Знаковые двоичные числа также могут содержать 8 или 16 бит, но значащими являются все биты, кроме старшего, который определяет знак числа: 0 - положительное число, 1 - отрицательное число. Соответственно диапазоны значений чисел: от -128 до +128 и от -32 768 до +32 767. Число нуль содержит нули во всех разрядах и считается положительным и четным. Число, имеющее нули во всех разрядах, кроме знакового, равно-27 для 8-битовых чисел и -215 для 16-битовых.

Числа представляются в стандартном дополнительном коде, благодаря применению которого сложение и вычитание как знаковых, так и беззнаковых чисел выполняется с помощью одних и тех же команд (рис. 2.9). Для умножения и деления знаковых чисел предусмотрены специальные команды.

Рис. 2.9. Команды сложения и вычитания

Команда NEG изменяет знак числа, находящегося в общем регистре или ячейке памяти, т. е. формирует его дополнительный код:

NEG dst; dst0-dst

Например, если однобайтовый операнд равен —1 (11111111), то команда NEG изменит его на +1 (00000001). Если операнд равен нулю, его значение не изме­няется. Попытка изменить знак числа — 128 (10000000) или —216не модифици­рует операнд, но устанавливает флаг переполнения OF. Отметим, что команда NEG отсутствует в ВМ80, поскольку в нем не предусмотрено специальных средств по обработке знаковых чисел.

Команды умножения и деления (рис. 2.10). В МП ВМ86 имеется по две команды умножения (MUL и IMUL) и деления (DIV и IDIV), выполняющие операции с беззнаковыми и знаковыми числами (в дополнительном коде) соответственно. Работа с десятичными числами требует использования специ­альных команд коррекции ААМ и AAD.

Команды умножения

MUL (IMUL) src; ext:acacґsrc

выполняют умножение адресуемого операнда (общего регистра или ячейку памяти) и содержимого аккумулятора ас. При работе с байтами функции аккумулятора ас выполняет регистр AL, а функции его расширения (ext) — регистр АН, так что 16-битовое произведение формируется в регистре АХ. Если перемножаются слова, то множимое располагается в регистре АХ, функции расширения которого выполняет регистр DX, так что 32-битовый результат образуется в регистрах DX и АХ.

Рис. 2.10. Команды умножения и деления

 


Команды умножения беззнаковых и знаковых чисел осуществляют практи­чески одни и те же действия и несколько различаются только влиянием на флаги OF и CF (значения остальных арифметических флагов после выполнения этих команд не определены, т. е. эти флаги могут принимать произвольные состояния). При выполнении команды MUL флаги OF и CF устанавливаются в единицу, если старшая половина произведения, находящаяся в регистрах АН или DX, отличается от нулевой, т. е. разрядность результата действительно превышает разрядность операндов. В противном случае эти флаги принимают нулевые значения. При выполнении команды IMUL флаги OF и CF устанавли­ваются в единицу, если старшая половина разрядов произведения не является расширением знака младшей половины, т. е. не содержит 00 (0000) или FF (FFFF) при умножении байтов (слов). Это означает, что в старшей половине находятся значащие цифры результата. В противном случае OF=CF=0 и старшую половину разрядов произведения можно не сохранять. Отсюда следует, что флаги OF и CF несут однотипную информацию о результатах выполнения команд MUL и IMUL.

Команды деления

производят деление содержимого аккумулятора и его расширения (AH:AL для 8-битового и DX:AX для 16-битового делителя) на содержимое регистра или ячейки памяти src. Частное quot формируется в регистре AL или АХ, а остаток rem — в регистре АН или DX. Дробное частное округляется до цело­го путем отбрасывания дробной части результата. Состояния всех флагов не определены.

Если частное выходит за диапазоны представления чисел в байте (слове) или делитель является нулем, то автоматически генерируется прерывание по ошибке деления (тип 0), а частное и остаток не определены. В результате этого МП переходит к подпрограмме обработки прерывания, полный адрес которой CS:IP берется из ячеек 0000 и 0002.

В ряде случаев, например для предотвращения прерывания, может поя­виться необходимость до выполнения операции деления проверить возможность возникновения прерывания типа 0. Такая проверка осуществляется с помощью команд:

СМР ext,src; сравнение и переход

JNB OVERFLOW; по переполнению

осуществляющих сравнение старшей половины разрядов делимого с делителем и передающих управление по метке OVERFLOW, если левый операнд в коман­де СМР больше или равен правому (что является условием возникновения переполнения при делении).

Частное и остаток после выполнения команды IDIV всегда имеют одинако­вые знаки. Например, при делении числа —47 на +3 из двух возможных ре­зультатов: —15 с остатком —2 и —16 с остатком +1 будет сформирован первый результат.

Однобайтовые команды преобразования разрядности операнда CBW и CWD примыкают к командам деления и осуществляют расширение со знаком операнда, который будет использоваться в качестве делимого. Обе команды не влияют на флаги и не изменяют значения операнда. Команда CBW (код опера­ции 98) реализует преобразование байта в слово путем расширения (копирова­ния) знака содержимого регистра AL в регистр АН. Команда CWD (код опера­ции 99) осуществляет аналогичное преобразование слова в двойное слово путем передачи знака содержимого АХ во все биты регистра DX.

Команды CBW и CWD удобно использовать для превращения делимого одинарной длины в делимое двойной длины, что может потребоваться для корректного выполнения команды IDIV. Выполнение команды CBW перед командой IDIV позволяет осуществлять деление 8-битовых чисел, а выполнение команды CWD—деление 16-битовых чисел.

Алгоритмы умножения и деления в МП ВМ86 реализованы не аппаратно, а в виде микропрограмм. Поэтому длительность команд MLJL, IMUL, DIV, IDIV включает большое число тактов, причем длительность каждой команды зависит не только от разрядности операндов и расположения операнда src (в регистре или в памяти), но и от конкретных значений операндов в пределах, указанных в табл. 2.10 диапазонов длительности команд. В первом столбце в скобках указана длина сомножителей команд умножения и длина делителя (частного) для команд деления.

Таблица 2.10.


К логическим командам относятся следующие (рис. 2. 11): AND (конъюн­кция, И), OR (дизъюнкция, ИЛИ), XOR (исключающие ИЛИ, сумма по моду­лю два), TEST (неразрушающая проверка, которая выполняет конъюнкцию операндов без изменения их значений, но с влиянием на флаги) и NOT (инвер­сия, НЕ). Все логические операции выполняются поразрядно, т. е. каждый бит операндов обрабатывается независимо от других. Для этого в АЛУ микропро­цессора включены наборы не связанных друг с другом логических элементов, содержащие по 16 двухвходовых элементов, И, ИЛИ и сумматоров по модулю два, а также набор из 16 инверторов.

Команды передачи управления используются в разветвляющихся и цикли­ческих программах, а также при вызове подпрограмм и возврате из них.

Сегментная организация программной памяти определяет два основных типа команд передачи управления: внутрисегментные NEAR (близкие) и меж­сегментные FAR (далекие). При выполнении команд типа NEAR модифициру­ется только регистр IP, и адрес переходов представляется одним словом или даже байтом, если используется короткий вариант перехода с ограниченным диапазоном адресов. При выполнении команд типа FAR изменяется содержи­мое регистров IP и CS и адрес перехода представляется двумя словами (сегмент:смещение), что позволяет перейти в любую точку адресного пространства памяти.

Рис. 5.11. Команды логических операций

В рассматриваемую группу команд входят команды безусловных переходов, вызовов, возвратов, условных переходов, управления циклами и прерываний.

Команды безусловных переходов JMP (рис. 2.12) производят модифика­цию регистра IP или регистров IP и CS без сохранения прежних, значений этих регистров. Имеется три формата (рис. 2.13) команды JMP типа NEAR, осуще­ствляющих переход в пределах текущего кодового сегмента (внутрисегмент­ный, близкий переход), и два формата команды JMP типа FAR, осуществляю­щих переход в любую точку адресного пространства (межсегментный, дальний переход)

Рис. 2.12. Форматы команд JMP и CALL

Двухбайтовая команда JMP disp L во втором байте содержит смещение которое интерпретируется как знаковое целое. Это смещение добавляется (с предварительным расширением знака до 16 бит) к содержимому IP, которое соответствует адресу команды, находящейся после данной команды JMP. Диапазон значений disp L составляет от —128 до +127, причем при положительном смещении осуществляется переход вперед, а при отрицательном — переход назад. Данная команда реализует так называемый короткий переход который в мнемоническом обозначении отмечается указателем SHORT (напри мер, JMP SHORT COUNT — короткий переход к метке COUNT). Она находит широкое применение, поскольку большинство переходов в прикладных про граммах осуществляется на небольшие расстояния.


Трехбайтовая команда JMP disp производит такое же действие, как и пре­дыдущая команда, но содержит 16-битовое смещение disp (ассемблерный указатель NEAR PTR). Это смещение также интерпретируется как знаковое целое, принимающее значения от —32 768 до +32 767, что обеспечивает пере­ход в любую точку текущего кодового сегмента. Напомним, что благодаря игнорированию переноса из бита 16, возникающего при сложении IP и disp, текущий сегмент рассматривается как кольцо. Поэтому диапазон переходов составляет от —IP до 21б—IP, а не от —215 до 215—!. Если, например, IР= 8000 и смещение равно 7FFF или меньше, оно вызовет переход вперед, а сме­щение, равное 8000 или больше, вызовет переход назад.

Первые два рассмотренных формата команды JMP реализуют относитель­ный способ адресации, который обеспечивает позиционную независимость про­грамм. Следующие три формата определяют абсолютные адреса переходов и загружают регистр IP (а при межсегментных переходах и регистр CS) новы­ми значениями, не зависящими от прежних.

Команда JMP r/m осуществляет косвенный внутрисегментный переход (ассемблерный указатель WORD PTR), при котором в регистр IP загружается содержимое регистра или ячейки памяти в соответствии с постбайтовым режи­мом адресации. Необязательные байты disp L, disp H в команде стандартно относятся к режиму адресации памяти.

Команда JMP m реализует косвенный межсегментный переход (ассемблер­ный указатель DWORD PTR) через содержимое двух ячеек памяти: слово из адресуемой с помощью постбайта ячейки загружается в IP, а слово из следую­щей ячейки — в регистр CS. Если в постбайте указывается регистр (rnd=11), то операция не определена.

Команда JMP addr реализует прямой межсегментный переход (ассемблер­ный указатель FAR PTR) и содержит 4 байта адреса перехода: два байта сег­ментного смещения offset загружаются в регистр IP, а два байта sr — в ре­гистр CS.

Команды вызова подпрограммы CALL (см. рис. 2.12) имеют такие же форматы, как и команды JMP (кроме команды короткого перехода) и выпол­няются аналогичным образом, за исключением того, что автоматически запо­минается адрес возврата (т. е. адрес команды, следующей за командой CALL). С этой целью при внутрисегментных вызовах в стеке запоминается содержимое IP, а при межсегментных вызовах—сначала содержимое IP, а затем CS. Напомним, что включение в стек каждого слова сопровождается уменьшением содержимого SP на два и что SP адресует последнюю заполненную 16-битовую ячейку стека. Использование стека для временного хранения адресов возврата позволяет легко реализовать правильный порядок возвратов из вложенных подпрограмм.

Перечислим действия, выполняемые 5-байтовой командой прямого меж­сегментного вызова CALL addr:

содержимое регистра SP уменьшается на два;

в адресуемую регистрами SP и SS ячейку памяти пересылается содержи­мое CS;

содержимое SP уменьшается на два;

в адресуемую регистрами SP и SS ячейку памяти засылается содержимое регистра IP;

в IP загружается смещение offset;

в CS загружается сегментный адрес seg.

В микропроцессоре ВМ86 отсутствуют команды условных вызовов под­программ (в отличие от ВМ80) и поэтому при необходимости условный вызов реализуется двумя командами. Например, если требуется вызвать подпрограм­му SUBR при ненулевом результате операции, т. е. реализовать отсутствую­щую команду CNZ, то выполняется команда условного перехода, проверяю­щая противоположное условие, и осуществляется “перескок” через команду вызова CALL:

JZ SKIP

CALL SUBR

SKIP:...

 


В зависимости от того, как определен тип подпрограммы SUBR, ассемблер сформирует необходимую команду внутрисегментного вызова.

Команды возвратов (из подпрограмм) RET (рис. 2.14). Каждая подпрог­рамма должна содержать хотя бы одну команду возврата RET, которая воз­вращает управление программе, осуществившей вызов. Такая передача управ­ления осуществляется путем извлечения из стека адреса возврата, включенного в него командой вызова подпрограммы. Поэтому команды возврата не содер­жат никакой адресной информации и неявно адресуют вершину стека. Тип команды возврата (внутрисегментный NEAR или межсегментный FAR) вы­бирается в соответствии с типом команды CALL, осуществившей вызов данной подпрограммы.

Однобайтовая команда внутрисегментного возврата RET (код операции СЗ) выполняет следующие действия: слово из вершины стека загружается в IP, а содержимое SP увеличивается на два.

Однобайтовая команда межсегментного возврата RET (код операции СВ) осуществляет следующие действия: слово из вершины стека передается в IP; производится инкремент SP на два; слово из следующей ячейки стека передает­ся в CS; производится инкремент SP на два. В результате в регистрах IP и CS оказывается полный адрес возврата, а SP адресует новую вершину стека.

Рис. 2.14. Команды возврата из подпрограмм

Две трехбайтовые команды RET (внут­рисегментный возврат с кодом операции С2 и межсегментный возврат с кодом СА) содер­жат два байта данных, интерпретируемых как беззнаковое целое. Они производят такие же действия, как и соответствующие одно­байтовые команды возврата, но дополнитель­но прибавляют содержащиеся в них данныек указателю стека SP (после извлечения из стека адреса возврата).

Эти команды упрощают возврат из тех подпрограмм, параметры которых пере­даются в стеке. Прибавление к SP числа, равного числу байтов в блоке параметров, эквивалентно удалению этого блока из стека.

В микропроцессоре ВМ86 нет команд условного возврата, и поэтому услов­ный возврат из подпрограмм обеспечивается командой условного перехода противоположного смысла и безусловного возврата, как это делалось при эмуляции команд условного вызова:

JZ SKIP

RET

SKIP:......

Команды условных переходов (рис. 2.15). Имеется 18 команд условных переходов, которые представлены единым двухбайтовым форматом, позволяю­щим осуществлять короткие (в пределах от — 128 до +127) переходы относи­тельно указателя команд IP. При выполнении этих команд анализируется некоторое условие, соответствующее текущим состояниям отдельных флагов (кроме флага AF) или некоторым комбинациям флагов (табл. 2.11). Если условие выполнено, то осуществляется переход и однобайтовое смещение, расширенное со знаком до 16 бит, добавляется к содержимому IP. Если условие не выполнено, выполняется следующая по порядку команда. Время выполнения команд составляет восемь тактов в первом случае и четыре такта во втором.

Рис. 2.15. Форматы команд условных переходов и управления циклами

Команды условных переходов обеспечивают ограниченный диапазон пере­ходов, для расширения которого необходимо сочетать их с командами безус­ловных переходов. Большинство команд условных переходов имеет по два мнемонических обозначения, которые подчеркивают содержательный смысл проверяемого условия и введены для удобства программирования. Обобщенное мнемоническое обозначение команд имеет вид Jcond label, где cond соответ­ствует проверяемому условию (первая графа табл. 2.11), двоичный код которо­го СССС (вторая графа табл. 2.11) помещается в соответствующее поле первого байта формата команды. Операнд label обозначает команду, к которой осуществляется переход. В качестве label может использоваться метка, а также метка плюс/минус константа или выражение, вычисление которого дает кон­станту.

Команды условных переходов позволяют проверить все отношения между знаковыми и беззнаковыми числами. В мнемокодах этих команд при сравнении знаковых чисел для обозначения условия “больше” используется буква G (Gre­ater), а для обозначения “меньше” — буква L (Less). Для аналогичных усло­вий при сравнении беззнаковых чисел используются соответственно буквы A (Above) и В (Below). Условие равенства обозначается буквой Е (Equal), а невыполнение некоторого условия—буквой N (Not).


Первые восемь команд в табл. 2.11 предназначены в основном для исполь­зования после команд сравнения СМР, в которых второй операнд вычитается из первого. В результате сравнения двух операндов и последующего перехода в зависимости от состояния флагов реализуются решения, соответствующие операторам отношений <, >, £, ³, ¹, =. Последние восемь команд мож­но использовать в любой ситуации, когда в зависимости от значения указанно­го в табл. 2.11 флага следует предпринять одно из двух действий.

Команды условных переходов реализуют относительную адресацию, как и первые два формата команды безусловного перехода JMP. При этом встает задача определения конкретного значения смещения dispL, которое должно быть добавлено к регистру IP для осуществления перехода к указанной метке. Решение этой задачи рассмотрим на примере следующего фрагмента программы:

0050 AGAIN: INC CX

0052 ADD AX, [BX]

0054 JNS AGAIN

0056 MOV RESULT, CX

В левом столбце приведены эффективные адреса команд, т. е. содержимое IP при выборке каждой команды.

—0050

0056

—6

Вычисление показывает, что при ассемблировании команды JNS следует установить смеще­ние dispL=FA, соответствующее дополнительному коду числа -6.

Команды управления циклами (см. рис. 2.15) используются для удобства реализации вычислительных циклов (итераций). Они осуществляют условный переход в зависимости от состояния регистра CX, который выполняет функции счетчика циклов. Команды LOOP, LOOPE и LOOPNE, кроме того, декрементируют регистр CX перед выполнением условного перехода, что исключает ис­пользование соответствующей команды декремента. Как и в командах услов­ных переходов, в данном случае при выполнении условия управление переда­ется команде, расположенной в диапазоне адресов от —128 до +127, задаваемых смещением в байте 2 команды.

Команда LOOP, которая обычно ставится в конце цикла, осуществляет декремент CX - 1 и если СХ¹0, то добавляет смещение dispL к регистру IP; в противном случае (СХ=0 и цикл окончен) выполняется следующая по по­рядку команда. Таким образом, смысл этой команды состоит в повторении цикла CX раз, т. е. в выполнении переходов до тех пор, пока СХ¹0.


Команда JCXZ имеет противоположный смысл и осуществляет переход только при СХ=0. Ее удобно использовать в начале цикла, особенно в ситуа­ции, когда цикл может не выполняться ни разу. Если команда LOOP выполняет постпроверку содержимого CX, то команда JCXZ выполняет его предпроверку.

Фактически команда LOOP label эквивалентна двум командам

DEC CX

JNZ label

и ее использование кроме удобства программирования позволяет экономить один байт объектного кода и один такт Т. При большом числе повторений цикла экономия времени может оказаться значительной.

Команда LOOPE/LOOPZ по сравнению с командой LOOP вводит допол­нительное условие повторения цикла: ZF=1. Это позволяет выходить из вы­числительного цикла как по окончании заданного числа циклов, так и при получении ненулевого результата (или неравенстве сравниваемых операндов). Команда LOOPNE/LOOPNZ вводит дополнительное условие противоположно­го смысла: ZF=0, которое позволяет прекращать цикл при получении нулевого результата (или по равенству сравниваемых операндов).

Команды обработки цепочек. Имеется пять однобайтовых команд (рис. 2.16), предназначенных для обработки одного элемента цепочки. Напомним, что под цепочкой (строкой) понимается последовательность любых контекстно связанных байтов или слов, находящихся в смежных ячейках памя­ти. Цепочечной команде может предшествовать однобайтовый префикс повторения REP, который вызывает повторение действия команды над следую­щим элементом. Это позволяет обрабатывать цепочки значительно быстрее, чем при организации программного цикла. Повторение рассчитано на максималь­ную длину цепочки 64 Кбайт и может заканчиваться по одному или двум усло­виям. Требуемое число повторений указывается в регистре СХ, содержимое которого автоматически декрементируется при каждом повторении операции. Когда содержимое СХ становится равным нулю, МП выполняет следующую команду. При выполнении повторяющейся цепочечной команды МП восприни­мает внешние прерывания.

В качестве операндов команды могут иметь цепочку-источник, цепочку-получатель или то и другое одновременно. Цепочка-источник по умолчанию размещается в текущем сегменте данных, и все элементы адресуются регистром SI. Имеется возможность использовать другой сегмент, указав его в префиксе смены сегмента. Цепочка-получатель всегда размещается в дополнительном сегменте, и ее элементы адресуются регистром DI. Для начальной загрузки адресов в регистры можно использовать команды LEA, LDS и LES.

При выполнении цепочечной команды содержимое SI и DI автоматически изменяется на ±1 (при обработке байта) или на ±2 (при обработке слова), чтобы адресовать следующие элементы цепочек. Флаг DF определяет направление изменения адресов: автоинкремент (DF=0) или автодекремент (DF=1).

Каждая цепочечная команда способна оперировать как с байтами, так и со словами, причем тип элементов цепочек ассемблер может определить по атрибутам операндов. Однако многие версии ассемблера допускают указание типа элементов путем добавления букв В (байт) или W (слово) к мнемоническим обозначениям цепочечных команд: MOSB или MOVSW, CMPSB или SMPSW и т. д. При этом операнды в команде становятся необязательными (ассемблер их игнорирует, так как адресация цепочек известна заранее) и могут указываться только для удобства программирования.

Префикс повторения (см. рис.2.16) обеспечивает повторяющееся (циклическое) выполнение цепочечной команды. При отсутствии префикса команда оперирует только одним элементом цепочки. Префикс повторения имеет пять мнемокодов: REP/REPE/REPZ и REPNE/REPNZ, которые определяют только два объектных кода, различающихся однобитным полем z, и введены для лучшего отражения содержательного смысла команды. Префикс повторения не влияет на флаги. Он обеспечивает автоматическое декрементирование регистра СХ на каждом повторении команды и проверку содержимого СХ на нуль.

Рис. 2.16. Команды обработки цепочек


Префикс REP используется с командами пересылки MOVS и STOS и ини­циирует действие “повторять, пока не будет достигнут конец цепочки”, т. е. по ка СХ№0. Префиксы REPE и REPZ действуют аналогично и имеют такой же машинный код, как и префикс REP. Они используются с командами сравнения CMPS и SCAS и оперируют с флагом ZF, состояние которого определяется результатом исполнения этих команд, причем появление ZF=1 останавливает процесс повторения команд. Префиксы REPNE и REPNZ также применяются командами CMPS и SCAS, но используют противоположное условие ZE=0. Наличие дополнительных проверяемых условий позволяет окончить выполнен этих команд по результату вычислений до завершения перебора всех элементов цепочки.

Таблица 2.12

Цепочечные команды пересылки МOVS, LODS и STOS на флаги не влияют, а команды неразрушающего сравнения СМPS и SCAS устанавливают значения флагов в соответствии с разностью операндов, сохраняя значения самих операндов. Время выполнения цепочечных команд (в тактах синхронизации) указано в табл. 2.12, где n - число повторений, которое предварительно заносится в регистр СХ.

Команды с префиксом повторения при обработке длинных цепочек могут выполняться в течение значительного времени. Поэтому для сокращения времени реакции на внешние прерывания МП воспринимает внешние сигналы прерывания после обработки каждого элемента цепочки. (Сигнал INTR=1 должен установиться не более чем за один такт до окончания цикла обработки).

После возврата из прерывания операция возобновляется, как обычно, с точки прерывания. Однако во время обработки прерывания МП помнит действие только одного префикса, непосредственно предшествующего команде. Поэтому, если с цепочечной командой используется несколько префик­сов (префикс замены сегмента, префикс блокировки), необходимо запрещать прерывания на время ее выполнения.

Обобщенные обозначения цепочечных команд и выполняемые ими дейст­вия при различных префиксах приведены в табл. 2.13.

Таблица 2.13.


Команду CMPS удобно применять для нахождения одинаковых (REPE CMPS) или различающихся (REPNE CMPS) элементов цепочек. Достижение конца цепочки при выполнении этих команд соответственно означает, что це­почки полностью различны (не содержат одинаковых элементов) или пол­ностью совпадают (не содержат различающихся элементов). Команда SCAS производит сравнение элемента цепочки с некоторым эталоном, содержащимся в аккумуляторе. Вариант REPE SCAS осуществляет просмотр цепочки до тех пор, пока значение элемента не отличается от эталона или не достигается конец цепочки, а вариант REPNE SCAS — просмотр цепочки до обнаружения эле­мента, равного эталону, или до достижения конца цепочки.

Команду LODS удобно использовать в программных циклах вместо двух команд: MOV, ac,src и INC SI (или DEC SI в зависимости от направления продвижения по цепочке). Отметим, что команда LODS оперирует элементами цепочки, расположенной в сегменте данных, причем имеется возможность замены сегмента, а команда STOS оперирует элементами цепочки, которая всегда находится в дополнительном сегменте. В последнем случае префикс замены сегмента не указывается, а при его наличии — игнорируется.

 

Дополнительная литература

1. Брябин В.М. Программное обеспечение персональных ЭВМ. - М.: Наука, 1988.

2. Григорьев В.Л. Программирование однокристальных микропроцессоров.- М.: Энергоатомиздат, 1987.

3. Дао Л. Программирование микропроцессора 8088/Пер. с англ.- М.: Мир,1988.

4. Казаринов Ю. М., Номоконов В. Н., Филиппов Ф. В. Применение микропроцессоров и микроЭВМ в радиотехнических системах.- М.: Высшая школа, 1988.

5. Лю Ю-Чжен, Гибсон Г. Микропроцессоры семейства 8086/8088. Архитектура, программирование и проектирование микрокомпьютерных систем /Пер. с англ.- М.: Радио и связь, 1987.


 

9.3.Список литературы, используемой при подготовке к лабораторным работам.

 

1) Электроннный учебник PC BOOK (Текстовый файл формата DOS, 1.2 Мбайт).

2) Лекции по курсу «Адаптеры и контроллеры».

3) Микропроцессоры и микроЭВМ в системах автоматического управления. Справочник под редакцией С.Т. Хвоща. Машиностроение, 1987г.

4) Аппаратура персональных компьютеров и ее программирование IBM/PC/XT/AT и PS/2. М: Радио и связь, 1995 г.

5) Финогенов К.Г.. Самоучитель по системным функциям MS DOS. М: Радио и связь, 1995 г.

6). Гук М. Аппаратные средства PC. Энциклопедия - СПб. Питер Ком, 1998.

 

 



Поделиться:


Последнее изменение этой страницы: 2017-02-17; просмотров: 215; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.129.19.251 (0.107 с.)