
- •А.М. Формакидов
- •М.А. Григорьев
- •Содержание
- •Предисловие
- •Описание лабораторного макета
- •Устройство и принцип работы умк
- •Указания мер безопасности
- •Подготовка умк к работе
- •Подготовка к работе макетного тэз м1
- •Теоретическая часть Директива «Индикация и изменение содержимого оперативного запоминающего устройства»
- •Директива «Идентификация и изменение содержимого регистров»
- •Формат директивы:
- •Директива «Заполнение массива памяти константой»
- •Формат директивы:
- •Директива «Определение контрольной суммы массива памяти»
- •Формат директивы:
- •Директива «Перемещение массива памяти в адресном пространстве»
- •Формат директивы:
- •Директива «Передача управления программе пользователя»
- •Формат директивы:
- •Последовательность нажатия клавиш:
- •Задание для выполнения лабораторной работы
- •Состав отчета по лабораторной работе
- •Контрольные вопросы
- •Лабораторная работа №2 «Исследование простейших команд, запуск и выполнение простых программ»
- •Порядок выполнения работы
- •Теоретическая часть
- •Задание для выполнения лабораторной работы
- •Состав отчета по лабораторной работе
- •Контрольные вопросы
- •Лабораторная работа №3 «Режимы адресации. Исследование выполнения команд арифметических и логических операций»
- •Порядок выполнения работы
- •Теоретическая часть
- •Задание для выполнения лабораторной работы
- •Состав отчета по лабораторной работе
- •Контрольные вопросы
- •Лабораторная работа №4 «Исследование выполнения команд пересылки данных, управления, ввода-вывода и работы со стеком»
- •Порядок выполнения работы
- •Теоретическая часть
- •Задание для выполнения лабораторной работы
- •Состав отчета по лабораторной работе
- •Контрольные вопросы
- •Лабораторная работа №5 «Изучение машинных циклов команд мп кр580вм80а. Выполнение арифметических операций умножения и деления»
- •Порядок выполнения работы
- •Теоретическая часть
- •Задание для выполнения лабораторной работы
- •Состав отчета по лабораторной работе
- •Контрольные вопросы
- •Лабораторная работа №6 «Программирование и режим работы программируемого параллельного интерфейса. Управление клавиатурой и дисплеем с помощью программируемого параллельного интерфейса кр580вв55»
- •Порядок выполнения работы
- •Теоретическая часть
- •Задание для выполнения лабораторной работы
- •Состав отчета по лабораторной работе
- •Контрольные вопросы
- •Система команд микропроцессора кр580вм80а
Состав отчета по лабораторной работе
Отчет должен содержать:
Рисунок 43 – Блок-схема программы определения максимального из массива чисел
титульный лист;
цель и задачи лабораторной работы;
программы, разработанные при выполнении заданий лабораторной работы;
результаты выполнения индивидуальных заданий;
выводы по лабораторной работе.
Контрольные вопросы
1. Перечень, назначение и процесс выполнения команд пересылки данных.
Рисунок 44 – Блок-схема «копирного» сравнения чисел
2. Организация и назначение стековой памяти.
3. Перечень, назначение и процесс выполнения команд обмена данными со стеком.
4. Как изменяется вершина стека при операциях с данными в стеке?
5. Каков порядок записи данных в стек при выполнении команды PUSH H, если (SP) = 0А37, (H) = 12, (L) = 34?
6. Каков порядок извлечения данных из стека при выполнении команды POP H, если (SP) = 9000, (8FFE) = 12, (8FFF) = 34, (9000) = 56, (9001) = 78, (9002) = 9A?
7. Каков порядок записи в стек данных при выполнении команды 0800 CALL 0850, если (SP) = 9000?
8. Перечень, назначение и процесс выполнения команд обмена данными с внешними устройствами (IN PORT, OUT PORT).
9. Назначение и процесс выполнения команд управления JMP ADDR, CALL ADDR, PCHL, RET, EI, DI, HLT, NOP, JC ADDR, CZ ADDR, RPO.
10. Назначение и процесс выполнения команд работы со стеком PUSH RP, POP RP, XTHL, SPHL.
Лабораторная работа №5 «Изучение машинных циклов команд мп кр580вм80а. Выполнение арифметических операций умножения и деления»
Цель и задачи работы
Цель: знакомство с принципами работы на УМК в пошаговом режиме работы (покомандном и поцикловом), изучение машинным циклов и составление операционных схем исполнения команд МП КР580ВМ80А, изучение алгоритмов выполнения арифметических операций умножения и деления.
Задачи: научиться производить отладку программ с использованием пошагового режима работы УМК, изучить машинные циклы команд МП КР580ВМ80А, уметь составлять операционные схемы и временные диаграммы выполнения команд, исследовать программы выполнения арифметических операций умножения и деления.
Порядок выполнения работы
1. Ознакомиться с методическим указанием.
2. Изучить машинные циклы команд МП КР580ВМ80А, примеры выполнения различных команд и соответствующие временные диаграммы работы МП.
3. Изучить основные алгоритмы выполнения арифметических операций умножения и деления.
4. Подготовить УМК к работе.
5. Изучить и выполнить индивидуальное задание.
6. Разработать отчет по лабораторной работе.
7. Подготовить ответы на контрольные вопросы.
Теоретическая часть
Интервалы времени, кратные машинному такту работы микропроцессора и связанные с выполнением микрооперации и команды, характеризуют специальными понятиями:
– машинный цикл – интервал времени, в течение которого происходит один внешний обмен данными между МП и внешним устройством (памятью или периферийным устройством);
– командный цикл – интервал времени, в течение которого выполняется команда. Командный цикл может состоять из одного или нескольких машинных циклов.
Время выполнения команды определяется ее форматом и реализуемыми действиями. На выполнение команд в МП КР580ВМ80А расходуются от одного до пяти машинных циклов. Машинный цикл состоит из 3 – 5 тактов. Первые три такта всех машинных циклов предназначены для выполнения действий, связанных с внешним обменом между МП и адресуемым в машинном цикле внешним устройством. Такты Т4 и Т5 в машинном цикле зарезервированы для выполнения операций внутри микропроцессора. К таким операциям относятся дешифрация кода команды, необходимые внутренние передачи и преобразования данных, выполнение сдвиговых, арифметических и логических операций.
В соответствии с предложенным разработчиками принципом синхронизации работы МП легко определить число машинных циклов, затрачиваемых на выполнение любой команды. Минимальное количество машинных циклов исполнения команды определяется форматом команды и равняется числу байтов команды. Если собственно выполнение команды требует дополнительных обращений к внешнему устройству, то командный цикл увеличивается на соответствующее число машинных циклов. Например, однобайтная команда пересылки данных из регистра источника RD в регистр приемник RS (MOV RD,RS) выполняется за один машинный цикл, поскольку собственно исполнение команды не требует дополнительных внешних обращений. Трехбайтная команда вызова подпрограммы CALL ADDR выполняется за пять машинных циклов. При ее выполнении к трем машинным циклам выборки команды добавляются два машинных цикла, затрачиваемых для запоминания в стеке 16-битного адреса возврата из подпрограммы.
При реализации всего списка команд МП КР580ВМ80А используется 10 видов машинных циклов:
1. Извлечение кода команды (М1).
2. Чтение данных из памяти.
3. Запись данных в память.
4. Извлечение данных из стека.
5. Запись данных в стек.
6. Ввод данных из внешнего устройства.
7. Запись данных во внешнее устройство.
8. Цикл обслуживания прерывания.
9. Останов.
10. Обслуживание прерываний при работе МП БИС в режиме останов.
Тип выполняемого цикла МП указывает на первом такте каждого машинного цикла с помощью 8-разрядного слова состояния, выдаваемого на ШД. Значения разрядов слова состояния используются далее для формирования управляющих сигналов, действующих в течение всего текущего машинного цикла. Для сохранения на время выполнения цикла слово состояния записывается в регистр-защелку – регистр слова состояния МП. На рис. 45 приведена схема записи слова состояния.
В первом такте Т1 по переднему фронту сигнала С2 регистр адреса РА выставляет на ША адрес ячейки памяти или внешнего устройства. Одновременно с появлением адреса на ША, МП вырабатывает синхросигнал SYN, а на шину данных ШД выдает байт слова состояния МП.
В начале такта Т2 положительным фронтом импульса С1 на выходе ГТИ формируется строб STB, которым слово состояния записывается во внешний регистр слова состояния (Рг.СС). Положительным фронтом С2 заканчивается сигнал SYN и МП формирует управляющие сигналы текущего машинного цикла.
а)
б)
Рисунок 45 – Фиксация слова состояния микропроцессора
Назначение отдельных разрядов байта слова состояния МП КР580ВМ80А, а также соответствие сигналов состояния отдельным видам машинных циклов приведено в табл. 1, 2 (см. раздел «Описание лабораторного макета» данного учебного пособия).
Цикл команды состоит из двух фаз: выборки команды и ее исполнения. Фаза выборки команды одинакова для всех команд микропроцессора. Последняя операция фазы исполнения команды, а именно размещение результата в аккумуляторе или в одном из регистров, также одинакова для целого ряда команд. Классификация команд по типам отражается в самом коде команды, таким образом, существенно упрощается схема декодирования команды.
Пример выполнения некоторых команд иллюстрируется на рис. 46. В арифметической команде сложения содержимого регистра с содержимым аккумулятора ADD S (рис. 46, а) в единственном цикле ВЫБОРКА вначале осуществляется выборка байта кода операции, для чего в такте T1 на адресную шину выдается содержимое программного счетчика PC, которое затем увеличивается на 1 в такте Т2 для адресации следующей команды. Команда извлекается в такте Т3 и по ней в такте Т4 осуществляется подготовка операндов к выполнению операции сложения – операнд из регистра (S) пересылается по внутренней шине в регистр (БР1), а операнд из аккумулятора пересылается в регистр (БР2). В пятом такте, который выполняется в течение действия такта Т2 следующей команды, осуществляется сложение операндов с сохранением результата в аккумуляторе. Совмещение тактов позволяет повысить производительность процессора.
В команде сложения содержимого ячейки памяти с содержимым аккумулятора ADD M (рис. 46, б) цикл ВЫБОРКА, состоящий из тактов Т1 – Т4, выполняется почти аналогично, а цикл М2 используется для выполнения операции сложения. Для выборки операнда из памяти в такте Т1 на адресную шину выдается его адрес из пары (HL), по которому в такте Т3 операнд выбирается в регистр (БР1). В четвертом такте, которой также выполняется в течение такта Т2 следующей команды, осуществляется сложение операндов.
В командах ввода/вывода (IN, OUT) (рис. 46, в) для выборки используются два цикла, в каждом из которых на адресную шину выдается содержимое программного счетчика, увеличиваемого в Т2 на единицу. Первый байт выбирается в регистр команд, второй – в регистры (W), (Z). В третьих циклах команд – циклах ввода/вывода – на адресную шину выдается адрес порта (параллельно на младшие и старшие разряды шины), по которому затем осуществляется обмен с адресуемым портом.
В команде обращения к подпрограмме CALL ADR (рис. 46, г) команда выбирается в течение трех машинных циклов по адресам, формируемым в программном счетчике: в первом цикле в регистр (РК) выбирается байт кода операции, во втором – младшие разряды адреса (второй
78

79

80

байт команды) в регистр (Z), в третьем – старшие разряды адреса (третий байт команды) в регистр (W). Таким образом, адрес подпрограммы хранится в паре (WZ). В тактах Т4, Т5 цикла M1 осуществляется подготовка адреса стека – уменьшение содержимого (SP) на единицу. По этому адресу в цикле М4 в ячейку стека, адресуемую содержимым (SP), записывается старший байт адреса возврата, и адрес стека уменьшается на 1. Затем в цикле M5 в ячейку стека записывается младший байт адреса возврата. Адрес перехода на подпрограмму заносится в счётчик команд (РС) в цикле M1 следующей команды с последующим увеличением его на 1.
Временная диаграмма типичного машинного цикла показана на рис. 47. Длительность такта в МП КР580ВМ80А задается периодом синхроимпульсов фазы С1, внутренние микрооперации инициируются импульсами из последовательности С2. Начало каждого машинного цикла (такт Т1) отмечается появлением сигнала на выходе SYN (начало связано с фронтом импульса С2 c некоторой задержкой, а конец – с фронтом следующего импульса С2). В течение этого интервала выдается информация о состоянии процессора (текущее слово состояния МП).
Фронт импульса С2 в такте T1 также вызывает загрузку адреса на адресную шину. Адрес сохраняется до появления фронта импульса С2 после такта Т3. Выдав адрес на адресную шину, процессор в такте Т2 осуществляет проверку сигналов подтверждения состояний ОЖИДАНИЕ, ЗАХВАТ, ОСТАНОВ. Если, например, память не готова к обмену, на линии RDY выдается сигнал низкого уровня. При этом процессор переходит в состояние ОЖИДАНИЕ, выдает сигнал высокого уровня на линию WI, подтверждающий запрос памяти (переключение сигнала на линии WI осуществляется фронтом импульса С1).
Процессор остается в состоянии ОЖИДАНИЕ до тех пор, пока сигнал на линии RDY не переходит в состояние высокого уровня. Если информация о готовности предшествует спаду импульса С2, то следующий импульс С1 переводит линию WI в состояние низкого потенциала, и процессор переходит в состояние Т3. В этом состоянии осуществляется обмен информацией с памятью или внешним устройством через шину данных.
При вводе данных в процессор по фронту импульса С2 в такте Т2 снимается информация о состоянии, и шина готова к приему данных. Данные, вводимые в процессор, должны быть стабильными в течение интервала времени, начало которого предшествует спаду импульса С1 или фронту импульса С2 в такте ТЗ, а конец следует за фронтом импульса С2. При этом процессор формирует сигнал высокого уровня на линии DВIN (сигнал формируется в пределах действия фронтов импульсов С2 в тактах Т2 и Т3). Длительность сигнала зависит от длительности такта ожидания Тw, находящегося между тактами Т2, ТЗ.
При выводе данные появляются на шине по фронту импульса С2 (одновременно информация о состоянии снимается) и выдаются на шину
Рисунок 47 – Временные диаграммы типового
машинного цикла МП КР580ВМ80А
до появления новой информации о состоянии. При этом процессор формирует сигнал низкого уровня на линии WR. Сигнал появляется по фронту импульса С1, следующего за тактом Т2 (это могут быть такты ТЗ или Тw), а оканчивается по фронту С1 в такте, следующем за Т3. Таким образом, его длительность также зависит от длительности такта ожидания Тw.
Все машинные циклы содержат такты T1, Т2, ТЗ. Такты Т4 и Т5 используются для выполнения команды. Завершив цикл M1, процессор переходит к циклу М2 выполняемой команды или к циклу M1 следующей команды, если команда одноцикловая.
В последнем такте последнего машинного цикла проверяется наличие запроса прерывания и, если он имеется, ЦП переходит к выполнению цикла M1 специального типа. В течение этого цикла содержимое программного счетчика не увеличивается на 1, а выдается сигнал подтверждения прерывания. Из устройства, вызвавшего прерывание, должна быть послана команда RST, в которой указывается вектор прерывания – адрес подпрограммы, обслуживающей прерывание.
Примеры временных диаграмм выполнения некоторых команд показаны на рис. 48.
Рисунок 48, а – Временные диаграммы выполнения команды ADD S
84

85

МП КР580ВМ80А выполняет только простейшие арифметические операции – сложение и вычитание. Для выполнения умножения и деления нужны специальные подпрограммы.
Существует несколько алгоритмов умножения. Простейший из них – последовательность сложений. Например: 25×3 = 25+25+25. Примеры программ умножения, реализованных по данному алгоритму приведены в этом учебном пособии (лабораторная работа №4, табл. 49 – 51). Существенный недостаток этого алгоритма – значительная длительность процесса вычисления. Второй алгоритм – умножение в столбец, основанное на последовательных сдвигах и суммировании. Отметим, что сдвиг возможен как влево, так и вправо (рис. 49).
Рисунок 49 – Операция умножения со сдвигом влево и вправо
При вычислении результата по второму алгоритму необходимо осуществить многократное суммирование со сдвигом влево множимого при одновременной проверке содержимого разрядов множителя начиная со стороны его младшего разряда. При этом если в очередном разряде множителя записана «1», то множимое прибавляется к сумме и сдвигается влево на один разряд, а если в разряде записан «0», то произойдет только сдвиг множимого. Сдвиг множимого влево можно заменить сдвигом суммы вправо.
Алгоритм умножения при сдвиге влево.
1. Загрузить в счетчик числа циклов число N, соответствующее размерности операндов.
2. Обнулить регистр-накопитель. Его разрядность 2×N.
3. Проанализировать младший (текущий) бит множителя. Если он равен нулю, то переход к пункту 5.
4. Прибавить множимое к регистру-накопителю.
5. Сдвинуть множимое влево на 1 разряд (или сумму вправо на 1 разряд).
6. Сдвинуть множитель вправо на один разряд (младший бит теряется).
7. Уменьшить счетчик числа циклов на единицу.
8. Переход к пункту 3, если счетчик не равен нулю.
Алгоритм умножения при сдвиге вправо отличается от вышеприведенного тем, что в пункте 3 анализируется старший (текущий) бит множителя, в пункте 5 – множимое сдвигается вправо (или результат влево), в пункте 6 множитель сдвигается влево (старший бит теряется).
Рассмотрим подпрограмму, реализующую умножение двух 8-ми разрядных чисел по первому алгоритму (табл. 52). Начальный адрес подпрограммы – 0800; входные параметры: регистр Е – множимое, регистр D – множитель, регистр L – счетчик числа циклов (первоначально равен разрядности операндов). Результат перемножения записываетcя в регистровую пару ВС.
Таблица 52
Умножение двух однобайтовых чисел без знака (сдвиг влево)
Адрес |
Машинный код |
Метка |
Мнемоника команды |
Операнд |
Комментарий |
0800 |
01 00 00 |
START |
LXI B, |
0000 |
(BC) ← 0000 |
0803 |
2E 08 |
|
MVI L, |
08 |
(L) ← 08 |
0805 |
A7 |
|
ANA A |
|
|
0806 |
7A |
M1 |
MOV A,D |
|
(A) ← (D) |
0807 |
1F |
|
RAR |
|
Сдвиг (A) вправо через перенос |
0808 |
57 |
|
MOV D,A |
|
(D) ← (A) |
0809 |
78 |
|
MOV A,B |
|
(A) ← (B) |
080A |
D2 0E 08 |
|
JNC |
080E |
если C = 0 (PC) ← 080E |
080D |
83 |
|
ADD E |
|
(A) ← (A) + (E) |
080E |
1F |
M2 |
RAR |
|
Сдвиг (A) вправо через перенос |
080F |
47 |
|
MOV B,A |
|
(B) ← (A) |
0810 |
79 |
|
MOV A,C |
|
(A) ← (C) |
0811 |
1F |
|
RAR |
|
Сдвиг (A) вправо через перенос |
0812 |
4F |
|
MOV C,A |
|
(C) ← (A) |
0813 |
2D |
|
DCR L |
|
(L) ← (L) – 1 |
0814 |
C2 06 08 |
|
JNZ |
0806 |
если Z = 0 (PC) ← 0806 |
0817 |
C9 |
|
RET |
|
(PC) ← M(SP) (PC) ← M(SP + 1) (SP) ← (SP) + 2 |
В этой подпрограмме команды MOV А,D; RAR; МОV D,А сдвигают вправо множитель, тем самым его младший (текущий) бит попадает в разряд С регистра признаков F. Если он равен 1, то к регистру-накопителю ВС прибавляется множимое – команды: МOV А,В; АDD Е. В противном случае команда ADD E пропускается (выполняется команда JNC M2). В подпрограмме содержимое регистра-накопителя сдвигается на один разряд вправо в каждом цикле, поэтому множимое прибавляется к старшему регистру в паре ВС. Возникающий при этом сигнал переполнения запоминается в разряде С регистра признаков F и при сдвиге пары ВС вправо занимает свое место в старшем бите. Для сдвига вправо регистровой пары ВС необходимы команды – RAR; MOV В,А; МОV А,С; RAR; MOV С,А. Команда DCR L уменьшает счетчик циклов на 1 и, если он не равен 0, команда JNZ M1 передает управление в начало цикла.
В подпрограмме табл. 53 реализуется алгоритм умножения при сдвиге вправо. Здесь анализ разрядов множителя начинается со старшего бита.
Таблица 53
Умножения двух однобайтовых чисел без знака (сдвиг вправо)
Адрес |
Машинный код |
Метка |
Мнемоника команды |
Операнд |
Комментарий |
0800 |
3E 08 |
START |
MVI A, |
08 |
(A) ← 08 |
0802 |
06 00 |
|
MVI B, |
00 |
(B) ← 00 |
0804 |
21 00 00 |
|
LXI H, |
0000 |
(HL) ← 0000 |
0807 |
EB |
M1 |
XCHG |
|
(HL) ↔ (DE) |
0808 |
29 |
|
DAD H |
|
(HL) ← (HL) + (HL) |
0809 |
EB |
|
XCHG |
|
(HL) ↔ (DE) |
080A |
D2 0E 08 |
|
JNC |
080E |
если C = 0 (PC) ← 080E |
080D |
09 |
|
DAD B |
|
(HL) ← (HL) + (BC) |
080E |
3D |
M2 |
DCR A |
|
(A) ← (A) – 1 |
080F |
C8 |
|
RZ |
|
если Z = 0 (PC) ← M(SP) (PC) ← M(SP + 1) (SP) ← (SP) + 2 |
0810 |
29 |
|
DAD H |
|
(HL) ← (HL) + (HL) |
0811 |
C3 07 08 |
|
JMP |
0807 |
(PC) ← 0807 |
Предварительно множимое загружается в регистр С, множитель – в регистр D. Результат будет подучен в регистровой паре НL. Первая команда организует счетчик числа циклов в регистре А. Затем обнуляются регистр B и регистровая пара HL. Очистив регистр В, получаем 8-ми разрядное множимое в регистровой паре ВC. В этом случае для прибавления множимого к регистру-накопителю НL можно использовать команду DAD В. Команда XCHG меняет местами содержимое регистровых пар НL и DE. Теперь в старшем байте пары НL находится множитель. Что находится в младшем байте – неважно. Команда DAD Н эквивалентна сдвигу влево на один разряд содержимого регистровой пары НL, т.е. множителя. Тем самым старший (текущий) разряд множителя попадает в разряд С регистра признаков F. Если он равен 1, то множимое прибавляется к регистру-накопителю. Вторая команда XCHG снова меняет местами содержимое регистровых пар НL и DE. Команда JNC M2 обеспечивает пропуск операции прибавления множимого к накопителю, если старший (текущий) разряд множителя равен нулю. Команда DCR A уменьшает счетчик числа циклов на единицу и, если он станет равным нулю, то выполняется возврат из подпрограммы (команда RZ). В противном случае, прежде чем перейти к новому циклу (команда JMP M1), нужно сдвинуть множимое вправо, либо результат – влево. Здесь выбрано второе (команда DAD Н).
Результатом операции деления является частное и остаток, существует несколько алгоритмов деления. Простейший из них –последовательность операций вычитания. Вычитание производится до тех пор, пока остаток не станет меньше делителя. В этом случае при вычитании сигнал заёма для старшего разряда установит в регистре признаков F бит С в единицу. Алгоритм деления следующий:
1) обнулить регистр для частного;
2) загрузить в регистр для остатка делимое;
3) вычесть из остатка делитель;
4) если полученный остаток меньше делителя (признак С = 1), то переход к пункту 7;
5) увеличить частное на единицу;
6) переход к пункту 3;
7) восстановить остаток – прибавить к остатку делитель.
Программа, реализующая данный алгоритм, приведена в табл. 54.
Таблица 54
Деление двух однобайтовых чисел без знака
Адрес |
Машинный код |
Метка |
Мнемоника команды |
Операнд |
Комментарий |
0800 |
16 00 |
START |
MVI D, |
00 |
(D) ← 00 |
0802 |
78 |
|
MOV A,B |
|
(A) ← (B) |
0803 |
91 |
M1 |
SUB C |
|
(A) ← (A) – (C) |
0804 |
DA 0B 08 |
|
JC |
080B |
если C = 1 (PC) ← 080B |
0807 |
14 |
|
INR D |
|
(D) ← (D) + 1 |
0808 |
C3 03 08 |
|
JMP |
0803 |
(PC) ← 0803 |
Продолжение таблицы 54
Адрес |
Машинный код |
Метка |
Мнемоника команды |
Операнд |
Комментарий |
080B |
81 |
M2 |
ADD C |
|
(A) ← (A) + (C) |
080C |
C9 |
|
RET |
|
(PC) ← M(SP) (PC) ← M(SP + 1) (SP) ← (SP) + 2 |
В данной подпрограмме делимое находится в регистре В, делитель в С, частное – в D, остаток – в А.
Рассмотренный алгоритм отличается простотой, но и невысоким быстродействием. Кроме того, время выполнения операции деления зависит от величины операндов. Поэтому на практике чаще применяются алгоритмы, основанные на операциях сдвига и вычитания. Один из таких алгоритмов поясним на следующем примере (рис. 50).
Рассматриваемый алгоритм осуществляет деление N-разрядного числа за N циклов. В каждом цикле выполняется одна операция вычитания. При этом, если вычитаемое больше уменьшаемого, то С = 1.
Алгоритм расчета следующий.
1. Загрузить в счетчик числа циклов число N, соответствующее разрядности операндов. Обнулить частное и промежуточное делимое (остаток).
2. Сдвинуть старший бит делимого через разряд С регистра признаков F в младший бит промежуточного делимого (остатка).
3. Вычесть делитель из промежуточного делимого (остатка). Проверить полученный остаток.
4. Если С = 0, перейти к пункту 6.
5. Если С = 1, восстановить промежуточное делимое (остаток), прибавляя к полученному в пункте 3 остатку делитель.
6. Инвертировать содержимое разряда С и сдвинуть его в младший бит частного.
7. Уменьшить счетчик числа циклов на единицу. Перейти к пункту 2, если счетчик не равен нулю. В противном случае осуществить возврат в основную программу.
В табл. 55 приведена программа деления 8-ми разрядных двоичных чисел. Предварительно в регистр С загружается делимое, а в регистр D – делитель. Частное формируется в регистре Н, а промежуточное делимое (остаток) – в Е. Первая команда загружает в регистр Н число 00, а в регистр L – число 08. В регистре L организуется счетчик числа циклов. Вторая команда очищает регистр Е, в котором будет находиться промежуточное делимое и окончательный остаток.
Рисунок 50 – Деление однобайтовых чисел с помощью операций сдвига и вычитания
Теперь нужно из старшего бита (нескольких бит) делимого вычесть делитель. Для этого из регистра С (делимое) перемещаем старший бит в разряд признака С. Это делают команды MOV А,С; RAL; MOV С,А. На последующих циклах в разряд признака С будут попадать следующие по старшинству биты делимого. Далее в аккумулятор пересылается содержимое регистра Е (команда MOV A,E). Командой RAL содержимое А сдвигается влево, содержимое разряда С помещается на место младшего разряда. Команда SUB D вычитает из промежуточного делимого (содержимое А) делитель (содержимое D). При этом в аккумуляторе образуется промежуточный остаток. Проверяется новое значение разряда С. Если С = 1, то прежде всего необходимо восстановить промежуточное делимое – команда ADD D. Если С = 0, то команда АDD D пропускается. Команда MOV Е,А возвращает промежуточное делимое (остаток) в регистр Е. Следует обратить внимание, что после выполнения команды SUB D значение разряда признака С есть инверсия текущего бита результата (команда ADD в данном случае не меняет С = 1). Команда СMC инвертирует содержимое разряда признака С – получаем бит результата (частного). Он «вдвигается» в регистр Н со стороны младшего разряда (команды МОV А,Н; RAL, MOV H,A). Команды DCR L и JNZ завершают цикл.
Таблица 55
Деление двух однобайтовых чисел без знака
Адрес |
Машинный код |
Метка |
Мнемоника команды |
Операнд |
Комментарий |
0800 |
21 08 00 |
START |
LXI H, |
0008 |
(HL) ← 0008 |
0803 |
1E 00 |
|
MVI E, |
00 |
(E) ← 00 |
0805 |
79 |
M1 |
MOV A,C |
|
(A) ← (C) |
0806 |
17 |
|
RAL |
|
Сдвиг (A) влево через перенос |
0807 |
4F |
|
MOV C,A |
|
(C) ← (A) |
0808 |
7B |
|
MOV A,E |
|
(A) ← (E) |
0809 |
17 |
|
RAL |
|
Сдвиг (A) влево через перенос |
080A |
92 |
|
SUB D |
|
(A) ← (A) – (D) |
080B |
D2 0F 08 |
|
JNC |
080F |
если C = 0 (PC) ← 080F |
080E |
82 |
|
ADD D |
|
(A) ← (A) + (D) |
080F |
5F |
M2 |
MOV E,A |
|
(E) ← (A) |
0810 |
3F |
|
CMC |
|
|
0811 |
7C |
|
MOV A,H |
|
(A) ← (H) |
0812 |
17 |
|
RAL |
|
Сдвиг (A) влево через перенос |
0813 |
67 |
|
MOV H,A |
|
(H) ← (A) |
0814 |
2D |
|
DCR L |
|
(L) ← (L) – 1 |
0815 |
C2 05 08 |
|
JNZ |
0805 |
если Z = 0 (PC) ← 0805 |
0818 |
C9 |
|
RET |
|
(PC) ← M(SP) (PC) ← M(SP + 1) (SP) ← (SP) + 2 |
Для вычисления специальных функций (
)
применяются специальные алгоритмы.
Функции
можно вычислить, воспользовавшись их
разложением в ряд:
Число членов ряда определяется из условия получения требуемой точности.
Для вычисления функции
с точностью до целых чисел можно применить
алгоритм, основанный на том, что квадрат
числа можно определить сложением
последовательности нечетных чисел
(табл. 56).
Таблица 56
Квадраты чисел
Число |
Сумма нечетных чисел |
Результат |
1 |
1 |
1 |
2 |
1+3 |
22 |
3 |
1+3+5 |
32 |
4 |
1+3+5+7 |
42 |
5 |
1+3+5+7+9 |
52 |
Исходя из приведенного примера видно, что какое число необходимо возвести в квадрат, такое же количество последовательных нечетных чисел начиная с 1 необходимо сложить.
Вычисление специальных функций по приведенным выражениям занимает длительное время и обеспечивает низкую точность. Это обусловлено сравнительно небольшой длиной машинного слова и ограниченным быстродействием МП БИС. Поэтому в тех случаях, когда ставятся жесткие требования по быстродействию и точности, применяется вычисление функций с помощью таблиц. Проиллюстрируем этот метод на примере программы вычисления квадрата числа (табл. 57).
Программа определяет квадрат чисел от 0 до 10 включительно. Входной параметр программы – число х. Оно записывается в регистр L. Выходной параметр – значение х2 в регистре Н.
Таблица 57
Определение квадрата числа с помощью таблицы
Адрес |
Машинный код |
Метка |
Мнемоника команды |
Операнд |
Комментарий |
0900 |
26 00 |
|
MVI H, |
00 |
(H) ← 00 |
0902 |
11 00 0A |
|
LXI D, |
0A00 |
(DE) ← 0A00 |
0905 |
19 |
|
DAD D |
|
(HL) ← (HL) + (DE) |
0906 |
66 |
|
MOV H,M |
|
(H) ← (M) |
0907 |
FF |
|
RST 7 |
|
Прервать выполнение программы |
0A00 |
00 |
|
|
00 |
Таблица квадратов чисел |
0A01 |
01 |
|
|
01 |
|
0A02 |
04 |
|
|
04 |
|
0A03 |
09 |
|
|
09 |
|
0A04 |
10 |
|
|
10 |
|
0A05 |
19 |
|
|
19 |
|
0A06 |
24 |
|
|
24 |
|
0A07 |
31 |
|
|
31 |
|
0A08 |
40 |
|
|
40 |
|
0A09 |
81 |
|
|
81 |
|
0A0A |
64 |
|
|
64 |