Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Цифровые устройства и микропроцессоры

.pdf
Скачиваний:
516
Добавлен:
09.06.2015
Размер:
3.6 Mб
Скачать

40

знака содержимое аккумулятора (AL или AX) на операнд источника, а результат двойной длины возвращается в аккумулятор и регистр, используемый для его расширения (в AL и АН в случае 8-разрядных операндов или в АХ и DX в случае 16-разрядных операндов). По результату устанавливаются только два флага: CF и OF, которые покажут 1, если старшая половина результата отлична от нуля.

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

Для деления двоичных чисел без знака имеется команда DIV делитель, который может находиться в памяти или в регистре и иметь размер 8, 16, или 32 бита (начиная с процессора I286). Местонахождение делимого так же, как в команде умножения, зависит от размера операндов (табл. 7).

 

 

 

Таблица 7.

 

 

 

 

Делимое

Делитель

Частное

Остаток

16 бит в рег.АХ

Байт в регистре или

Байт в регистре AL

Байт в регистре AH

 

ячейке памяти 16

 

 

 

бит

 

 

32 бита

16 бит в регистре

Слово 16 бит в реги-

Слово 16 бит в реги-

DX - старшая часть,

или ячейке памяти

стре AX

стре DX

AX-младшая часть

 

 

 

64 бита EDX-

Двойное слово 32

Двойное слово 32

Двойное слово 32

старшая часть, EAX-

бита в регистре или

бита в регистре EAX

бита в регистре EDX

младшая часть

ячейке памяти

 

 

При выполнении операции деления флаги принимают произвольные значения, но возможно возникновение прерывания с номером 0. Эта разновидность прерывания 0 (исключения) возникает внутри микропроцессора изза некоторых ситуаций:

делитель равен нулю;

частное не входит в отведённую под него разрядную сетку.

Для деления чисел со знаком предназначена команда IDIV. Особенностью команды деления IDIV является то, что частное и остаток всегда имеют одинаковые знаки. Прерывание типа 0 возникает в следующих случаях:

делитель равен нулю;

при делении на делитель величиной в байт со знаком частное находится вне диапазона от – 128 до +127;

при делении на делитель величиной в слово со знаком частное находится вне диапазона от – 32768 до = 32768;

при делении на делитель величиной в двойное слово со знаком частное находится вне диапазона от –2 147 483 648 до + 2 147 483 647.

Арифметические операции над неупакованными двоично-десятичными числами

Отдельных команд сложения, вычитания, умножения и деления двоич- но-десятичных чисел не существует, потому что размерность таких чисел может быть сколь угодно большой. Складывать и вычитать можно двоично-

41

десятичные числа как в упакованном формате, так и в неупакованном, а делить и умножать можно только неупакованные ВСD-числа.

Для коррекции операции сложения двух однозначных неупакованных BCD-чисел существует специальная команда ААА, которая ставится после операции сложения и корректирует результат сложения. Команда работает с регистром AL и анализирует значение его младшей тетрады. Если оно меньше 9, то флаг CF сбрасывается в 0, и осуществляется переход к следующей команде. Если это значение больше 9, то выполняется следующее:

к содержимому младшей тетрады AL прибавляется 6, чтобы получившееся число было бы десятичным;

флаг CF устанавливается в 1, фиксируя перенос в старший разряд для того, чтобы его можно было учесть в последующих действиях.

Не лишним будет напомнить, что при записи в память числа в BCD-

коде записываются в памяти, начиная с младшего байта.

При вычитании неупакованных ВСD-чисел используется команда AAS, которая также ставится после команд вычитания SUB и SBB.

Для коррекции команд умножения неупакованных ВСD-чисел применяют команду ААМ. Эту же команду можно применять для преобразования двоичного числа в регистре AL (от 0 до 99) в неупакованное BCD-число, которое будет размещено в регистре AX: старшая цифра результата – в АН, а младшая – в AL.

При выполнении деления неупакованных ВСD-чисел корректирующей командой является команда AAD, но коррекция выполняется до основной операции, выполняющей непосредственно деление одного ВСD-числа на другое ВСD-число. Команду AAD также, как и команду ААМ, можно использовать для перевода неупакованных ВСD-чисел из диапазона 0…99 в их двоичный эквивалент.

Арифметические операции над упакованными двоично-десятичными числами

Упакованные ВСD-числа можно только складывать и вычитать, для выполнения других действий их нужно преобразовывать или в неупакованный формат, или в двоичное представление.

Коррекцию результатов сложения производит команда DAA. Она преобразует содержимое регистра AL в две упакованные десятичные цифры. Если результат сложения больше 99, то получившаяся в результате сложения единица запоминается в флаге CF, тем самым учитывается перенос в старший разряд.

Для коррекции результатов вычитания используется команда DAS.

По результатам выполнения арифметических операций устанавливаются все флаги!

К группе арифметических операций относятся также две команды, осуществляющие расширение со знаком 8- и 16разрядных операндов. Эти команды играют вспомогательную роль при подготовке операнда используемого в качестве делимого. При выполнении деления в зависимости от раз-

42

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

(или DX).

4.3.3. Логические команды

Система команд микропроцессора содержит пять команд, поддерживающих реализацию четырёх булевых функций:

поразрядное логическое умножение (логическое И) выполняет команда

AND;

поразрядное логическое сложение (логическое ИЛИ) – команда OR;

поразрядное логическое исключающее сложение (ИСКЛ. ИЛИ) – команда XOR;

поразрядное отрицание (логическое НЕ) – команда NOT.

Кэтой же группе команд относится команда TEST (проверка), которая состоит в поразрядном логическом умножении (И) операндов без занесения результатов умножения в приёмник и служит для анализа содержимого источника по значениям флагов PF, SF и ZF.

Все двухоперандные команды AND, OR, XOR и TEST имеют одинаковые форматы, однооперандная команда NOT осуществляет инвертирование операнда и имеет один формат.

4.3.4.Команды сдвига

Все команды сдвига перемещают биты операнда влево или вправо, они имеют следующую структуру: КОП операнд, счётчик сдвига.

Счётчик циклов может задаваться двумя способами:

статически, когда значение числа сдвигов задаётся с помощью непосредственного операнда;

динамически, при этом значение числа сдвигов заносится в регистр CL перед выполнением команды сдвига. Следует отметить, что несмотря

на то, что регистр AL восьмибитовый, микропроцессор воспринимает только значения пяти младших битов счётчика, то есть значение лежит в диапазоне от 0 до 31.

Все команды сдвига устанавливают флаг переноса CF за счёт сдвига очередного бита. По принципу действия команды сдвига делятся на два типа: команды линейного сдвига и команды циклического сдвига.

Линейный сдвиг. При линейном сдвиге осуществляется следующий алгоритм:

43

очередной сдвигаемый бит устанавливает флаг CF;

бит, вводимый в операнд с другого конца, получает значение 0; Команды линейного сдвига делятся на логические и арифметические.

Ккомандам линейного логического сдвига относятся следующие:

SHL (Shift Logical Left) – логический сдвиг влево. SHR (Shift Logical Right) – логический сдвиг вправо.

Команды арифметического линейного сдвига особым образом работа-

ют со знаковым разрядом операнда:

SAL (Shift Arithmetic Left) – арифметический сдвиг влево. Команда практически совпадает с командой SHL.

SAR ( Shift Arithmetic Right) – арифметический сдвиг вправо. Команды арифметического сдвига позволяют выполнить умножение и

деление операнда на степени двойки, скорость их выполнения выше, чем у команд умножения и деления.

Циклический сдвиг. Подобные команды бывают двух типов:

команды простого циклического сдвига;

команды циклического сдвига через флаг переноса К командам простого циклического сдвига относятся:

ROL (Rotate Left) – сдвигаемые влево биты записываются в тот же операнд справа.

ROR (Rotate Right) –Cдвигаемые вправо биты записываются в тот же операнд.

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

RCL (Rotate through Carry Left) – циклический сдвиг влево через перенос. Сдвигаемые биты поочерёдно становятся значением флага CF.

RCR (Rotate through Carry Right) – циклический сдвиг вправо через пе-

ренос. Сдвигаемые биты поочерёдно становятся значением флага CF

4.3.5. Команды обработки строк данных

Строкой называют последовательность байтов, размещаемую в смежных ячейках памяти. Команды обработки строк данных также называют цепочечными командами. Цепочка – понятие несколько более широкое, чем строка, и предполагает размерность операнда большую, чем байт (слово или двойное слово). Особенность всех цепочечных команд в том, что они, кроме обработки текущего элемента цепочки, осуществляют ещё и автоматическое продвижение к следующему элементу данной цепочки. Команды, обрабатывающие двойное слово, по понятным причинам в системе команд I8086процессора отсутствуют.

Перечислим эти команды:

44

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

MOVS адрес приёмника, адрес источника

MOVSB MOVSW MOVSD

сравнение цепочек, производится сравнение элементов цепочкиисточника с элементами цепочки-приёмника:

CMPS адрес приёмника, адрес источника

CMPSB CMPSW CMPSD

cканирование цепочки, производится поиск некоторого значения в области памяти. Искомое значение предварительно должно быть загружено в аккумулятор.

SCAS адрес приёмника

SCASB SCASW SCASD

загрузка элементов из цепочки, извлекается элемент цепочки и помещается в аккумулятор:

LODS адрес источника

LODSB LODSW LODSD

сохранение элемента в цепочке, переносится значение аккумулятора в элемент цепочки:

STOS адрес приёмника

STOSB STOSW STOSD

Следующие ниже перечисленные команды также отсутствуют в системе команд I8086.

получение элементов цепочки из порта ввода-вывода

INS адрес приёмника, номер порта

INSB

INSW

INSD

вывод элементов цепочки в порт ввода-вывода OUTS адрес приёмника, номер порта

OUTSB

OUTSW

OUTSD

45

В сочетании со многими цепочечными командами используют префиксы повторения:

REP

REPE или REPZ REPNE или REPNZ

Цепочечная команда без префикса выполняется один раз. Размещение префикса перед командой (в поле метки) заставляет её выполняться в цикле.

Префикс REP используется с командами MOVS и STOS, при этом данные команды выполняются до тех пор, пока содержимое в регистре СХ не станет равным нулю (после выполнения каждой команды содержимое регистра CX (ЕСХ) автоматически декрементируется).

Префиксы REPE и REPZ являются синонимами, они заставляют цепочечную команду выполняться до тех пор, пока содержимое регистра СХ (ЕСХ) не равно нулю или флаг ZF равен 1. Наиболее эффективно использовать эти префиксы с командами CMPS и SCAS..

Префиксы повторения REPNE и REPNZ также синонимы, они заставляют цепочечную команду циклически выполняться до тех пор, пока содержимое регистра СХ (ЕСХ) не равно нулю или флаг ZF равен нулю. При невыполнении одного из этих условий работа команды прекращается.Данные префиксы часто используют с командами CMPS и SCAS, но для поиска совпадающих элементов цепочки.

Важно отметить формирование физического операндов: цепочкаис- точник находится в текущем сегменте данных, определяемых регистром DS, цепочка-приёмник должна быть в дополнительном сегменте данных, адресуемом сегментным регистром ES. Таким образом, полные физические адреса операндов цепочечных команд следующие:

адрес источника – пара DS:EI;

адрес приёмника – пара ES:DI.

Для цепочечных команд существует понятие направления обработки

строк:

от начала цепочки к её концу, т. е. в направлении возрастания адресов;

от конца цепочки к её началу, т. е. в направлении убывания адресов.

С этой целью используется флаг направления DF в регистре флагов:

если DF = 0, то значения индексных регистров SI, DI будут автоматически увеличиваться;

если DF=1, то значения индексных регистров SI, DI будут автоматически уменьшаться.

Лекция №8 4.3.6. Команды передачи управления

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

46

точку программы. Это решение может быть безусловным, когда переход к другой команде, находящейся на некотором удалении от текущей команды, обязателен, или условным, когда переход зависит от выполнения некоторых условий. Команды передачи управления изменяют содержимое регистров CS и IP (дальний переход) или только IP (ближний переход).

Группу команд передачи управления можно разделить на четыре типа:

безусловные переходы;

условные переходы;

циклы;

прерывания.

Безусловные переходы. Команды безусловных переходов включают три

мнемокода: JMP (безусловный переход), CALL (вызов подпрограмм) и RET (возврат из подпрограммы).

По команде JMP можно осуществить переход в любую точку программы, расположенную как в текущем сегменте данных (ближний переход), так

ив другом сегменте (дальний переход). При переходе в пределах текущего сегмента используются первые три формата команды JMP (см. приложение 1). Первый формат позволяет перейти к любой команде внутри текущего сегмента, для чего к содержимому IP добавляется в дополнительном коде 16-разрядное смещение, старший разряд которого является знаковым. Второй, укороченный формат позволяет перейти к точке программы, отстоящей не более чем на – 128 – +127 адресов от команды JMP. Третий формат осуществляет загрузку указателя команд IP 16-разрядным числом, размещённым по исполнительному адресу ЕА, которое определяется постбайтом (косвенный переход). Четвёртый и пятый форматы позволяют производить межсегментные переходы: в четвёртом формате во втором и третьем байтах формата указан относительный адрес точки перехода, а в четвёртом и пятом – новое значение CS.

Команда CALL используется в тех случаях, когда некоторый участок программы требует неоднократного повторения, CALL – это команда вызова подпрограммы или процедуры. Она имеет такие же форматы, что и команда JMP, за исключением укороченного. При выполнении команды CALL происходит автоматическое запоминание в стеке текущих значений регистров CS и IP (адрес возврата из подпрограммы). В конце подпрограммы ставится команда RET, по которой из стека возвращаются сохранённые значения в Cs и IP. При возврате из подпрограмм, расположенных в текущем сегменте кода, применяются первые два формата команды RET, причём второй формат отличается от первого тем, что к содержимому указателя стека добавляется константа, записанная во 2-м и 3-м байтах команды. Этот приём позволяет сбрасывать значения, записанные в стек при выполнении этой подпрограммы

ине используемые в дальнейшем.

Для межсегментного возврата применяют третий и четвёртый форматы RET, которые обеспечивают восстановление регистров CS и IP.

47

Условные переходы. Команды условных переходов позволяют принимать решения о переходе в зависимости от некоторых условий. Микропроцессор имеет 18 команд условных переходов, позволяющих проверить:

отношение между операндами со знаком («больше– меньше»);

отношение между операндами без знака («выше – ниже»);

состояние арифметических флагов ZF, SF, CF, OF, PF.

Термины «больше-меньше» и «выше-ниже» происходят от соответсвующих английских терминов «greater-less» и «above-below». Первые буквы этих терминов входят в состав мнемонических обозначений соответствующих команд условного перехода. Мнемокод команд начинается буквой J. Для того, чтобы принять решение о переходе, сначала должно быть сформировано условие, на основании которого и будет принято решение о передаче управления:

это может быть любая команда, изменяющая состояние регистра флагов;

команда сравнения CMP, сравнивающая значения двух операндов;

состояние регистра СХ.

Все команды условных переходов имеют одинаковый формат, в первом

байте задаётся код операции, а во втором – 8-разрядное смещение, которое рассматривается как число со знаком, позволяющее осуществить изменение адреса в диапазоне от –128 до +127. При необходимости более отдалённого перехода по выполнению условия используется дополнительно команда безусловного перехода.

В таблице 8 приведены значения аббревиатур в названиях команд условных переходов.

 

 

 

Таблица 8

 

 

 

 

 

Мнемоническое

Английский

Русский

Тип

обозначение

 

 

операндов

 

E e

Egual

Равно

Любые

 

 

 

N n

Not

Не

Любые

 

G g

Greater

Больше

Числа

 

 

 

 

со знаком

 

L l

Less

Меньше

Числа со

 

 

 

 

знаком

 

A a

Above

Выше, в смысле

Числа

 

 

 

«больше»

без знака

 

B b

Below

Ниже, в смысле

Числа

 

 

 

«меньше»

Без знака

 

В таблице 9 приведён перечень команд условного перехода для команды CMP операнд 1, операнд 2.

48

 

 

 

Таблица 9

 

 

 

 

 

Типы

Мнемониче-

Критерий условного

Значение флагов

операндов

ское

перехода

для осуществления

 

 

обозначение

 

перехода

 

Любые

je

операнд _1= операнд _2

Zf = 1

 

Любые

jne

операнд _1<> операнд _2

Zf = 0

 

Со знаком

jl /jnge

операнд _1< операнд _2

Sf < >of

 

Со знаком

jle /jng

операнд _1<= операнд _2

Sf < >of or zf =1

 

Со знаком

jg /jnle

операнд _1> операнд _2

Sf = of and zf = 0

 

Со знаком

jge /jnl

операнд _1= >операнд _2

Sf = of

 

Без знака

Jb/jnaе

операнд _1<операнд _2

Cf =1

 

Без знака

jbе /jnа

операнд _1<= операнд _2

Cf =1 or Zf =1

 

Без знака

ja /jnbе

операнд _1> операнд _2

Cf = 0 and Zf = 0

 

Без знака

jae /jnb

операнд _1= >операнд _2

Cf = 0

 

Мнемоническое обозначение части команд условного перехода отражает название флага, с которым они работают. В таблице 10 приведены названия флагов и соответствующие команды условного перехода.

 

 

 

Таблица 10

 

 

 

 

Название флага

Номер бита

Команда

Значение флага для

 

в регистре флагов

условного

осуществления

 

 

перехода

перехода

Флаг переноса CF

1

JC

CF=1

Флаг чётности PF

2

JP

PF=1

Флаг нуля ZF

6

JZ

ZF=1

Флаг знака SF

7

JS

SF=1

Флаг переполнения OF

11

JO

OF-1

Флаг переноса CF

1

JNC

CF=0

Флаг чётности PF

2

JNP

PF=0

Флаг нуля ZF

6

JNZ

ZF=0

Флаг знака SF

7

JNS

SF=0

Флаг переполнения OF

11

JNO

OF=0

Регистр CX, кроме того, что он является регистром общего назначения, имеет определённое функциональное назначение – он выполняет роль счётчика в командах управления циклами и при работе с цепочками символов.В связи с этим существуют две команды условного перехода:

JCXZ – переход, если СХ нуль ( для I8086);

JECXZ – переход, если ЕСХ нуль.

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

49

программирование циклов. Эти команды используют регистр СХ(ЕСХ) как счётчик цикла.

LOOP – повторить цикл.

LOOPЕ/LOOPZ – повторить цикл, пока СХ< >0 или ZF=0.

LOOPNE/LOOPNZ – повторить цикл, пока СХ< >0 или ZF=1.

Работа команды LOOP заключается в выполнении следующих дейст-

вий:

декремента регистра СХ (ЕСХ);

сравнение регистра СХ (ЕСХ) с нулём.

Если СХ (ЕСХ) > 0, то управление передаётся на метку перехода; если СХ (ЕСХ) = 0, то управление передаётся на следующую после LOOP

команду.

Алгоритм работы команды LOOPЕ/LOOPZ таков:

декремент регистра СХ (ЕСХ);

сравнение регистра СХ (ЕСХ) с нулём;

анализ состояния флага нуля ZF.

Если СХ (ЕСХ) > 0 и ZF = 1, то управление передаётся на метку пере-

хода;

если СХ (ЕСХ) = 0 или ZF = 0, то управление передаётся на следующую после LOOP команду.

Работа команды LOOPNE/LOOPNZ заключается в выполнении следующих действий:

декремента регистра СХ (ЕСХ);

сравнение регистра СХ (ЕСХ) с нулём.

анализа состояния флага нуля ZF.

Если СХ (ЕСХ) > 0 и ZF = 0, то управление передаётся на метку пере-

хода;

если СХ (ЕСХ) = 0 или ZF = 1, то управление передаётся на следующую после LOOP команду.

Команды прерывания. Программные прерывания бывают трёх типов:

INT type – прерывание по номеру вектора (type);

INTO – прерывание при переполнении;

IRET – возврат из подпрограммы прерывания.

Во втором байте команды INT type помещается 8-разрядный номер вектора прерываний, полученный процессором номер вектора умножается на 4, чтобы найти точку входа в таблицу векторов. В таблице векторов, максимальный размер которой один килобайт, на каждый вектор отводится по 4 байта: в первых двух байтах помещается значение IP, во вторых двух байтах

– значение CS. Новые значения регистров CS и IP помещаются в соответствующие регистры микропроцессора, таким образом адрес соответствующей подпрограммы определён. Для того, чтобы адрес возврата в основную программу не был утрачен, предварительно производятся следующие действия: текущие значения регистра CS и указателя команд записываются в стек, так-