Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
Числа | Младший байт | Флаг С | Старший байт |
17F5 | |||
+ | + | + | |
3411 | |||
1 | + 1 | ||
4С06 |
Из приведенных примеров видно, что при суммировании (вычитании) младших байтов чисел можно применять команду ADD (SUB), а при суммировании (вычитании) остальных байтов чисел необходимо использовать команду ADC (SBB), которая будет учитывать состояние разряда С регистра признаков МП.
Программа Прогр. 5.2 на стр. 58 – это программа нахождения суммы чисел, имеющих одинаковую длину. Входные параметры программы: регистр С – длина чисел (в байтах), регистры H, L – адрес младшего байта 1-го слагаемого, регистры D, E – адрес младшего байта 2-го слагаемого. Каждое из чисел записывается в последовательных адресах памяти, начиная с адресов младших байтов. Результат заносится в область памяти, отведенную под 1-е слагаемое. Для получения программы нахождения разности чисел, имеющих одинаковую длину, достаточно заменить в строке 6 команду ADC на команду SBB. В этом случае 1-е слагаемое будет вычитаемым, а 2-е слагаемое – уменьшаемым.
Прогр. 5.2. Программа нахождения суммы чисел, имеющих одинаковую длину.
MVI C, 04h | ;Загрузить в C длину чисел в байтах. | |
LXI H, 0100h | ;Загрузить в HL адрес младшего байта 1-го ; слагаемого. | |
LXI D, 0110h | ;Загрузить в DE адрес младшего байта 2-го ; слагаемого. | |
XRA A | ;Очистить Акк. и флаг С. | |
LAB_1: | LDAX D | ;Записать в Акк. 2-е слагаемое. |
ADC M | ;Сложить Акк. с 1-м слагаемым (с учетом ; переноса). | |
MOV M, A | ;Записать сумму на место 1-го слагаемого. | |
INX H | ;Указать на след. байт 1-го слагаемого. | |
INX D | ;Указать на след. байт 2-го слагаемого. | |
DCR C | ;Уменьшение регистра С (счетчика длины ; числа). | |
JNZ LAB_1 | ;Если байт не старший, то идти на LAB_1. | |
HLT | ;Выход из программы. |
6.1.2. Умножение чисел.
Известно несколько алгоритмов умножения чисел. При одном из них умножение можно заменить многократным сложением, например: 14 * 3 = = 14 + 14 + 14. Существенный недостаток этого способа – значительная длительность процесса сложения. При другом алгоритме умножение осуществляется столбиком. Этот алгоритм применим для умножения двоичных чисел, например:
0110 | = 6 |
0011 | = 3 |
0110 | |
0110 | |
0000 | |
0000 | |
0010010 | = 18 |
При вычислении результата по второму способу необходимо осуществлять многократное суммирование со сдвигом влево множимого при одновременной проверке содержимого разрядов множителей, начиная со стороны его младшего разряда. При этом если в очередном разряде множителя записана 1, то множимое прибавляется к сумме и сдвигается влево на 1 разряд, а если в разряде записан 0 – произойдет только сдвиг множимого. Сдвиг множимого влево можно заменить сдвигом суммы вправо. По этому принципу работает программа умножения двух однобайтных чисел с получением двухбайтного результата Прогр. 5.3.
Входными параметрами программы Прогр. 5.3, алгоритм которой приведен ниже, на Рис. 5.1 (стр. 60), являются следующие регистры: регистр D – множимое, регистр E – множитель. Результат записывается в регистровую пару BC.
Прогр. 5.3. Программа умножения двух однобайтных чисел с получением двухбайтного результата.
MVI D, A1h | ;Запись в D множимого. | |
MVI E, 9Bh | ;Запись в E множителя. | |
LXI B, 0000h | ;Очистить регистры B и C. | |
MVI L, 08h | ;Загрузка счетчика. | |
LAB_1: | MOV A, E | ;Множитель в Акк. |
RAR | ;Сдвиг анализируемого бита в триггер C. | |
MOV E, A | ;Возврат в E сдвинутого множителя. | |
JNC LAB_2 | ;Если бит множителя равен нулю, то идти ; на LAB_2. | |
MOV A, B | ;Загрузка в Акк. старшей частичной суммы. | |
ADD D | ;Прибавление к нему множимого. | |
MOV B, A | ;Возврат в B старшей частичной суммы. | |
LAB_2: | MOV A, B | ;Загрузка в Акк. старшей частичной суммы. |
RAR | ;Сдвиг старшей частичной суммы вправо ; (младший бит в C). | |
MOV B, A | ;Возврат в B старшей частичной суммы. | |
MOV A, C | ;Загрузка в Акк. младшей частичной суммы. | |
RAR | ;Сдвиг младшей частичной суммы вправо ; (C в старший бит). | |
MOV C, A | ;Возврат в C младшей частичной суммы. | |
DCR L | ;Декрементация счетчика. | |
JNZ LAB_1 | ;Если разряд не последний, то идти на LAB_1. | |
HLT | ;Выход из программы. |
6.1.3. Деление чисел.
Деление двоичных чисел, как и чисел, представленных в любой другой системе счисления, основывается на последовательном вычитании делителя из делимого и остатков от деления. Однако двоичное деление реализуется проще, т. к. использование только двух цифр (0, 1) исключает в каждом цикле деления необходимость определения числа делителей, содержащихся в текущем значении делимого или остатка (достаточно только сравнить их). Схема алгоритма деления однобайтных чисел (целых без знака) со сдвигом делимого (или остатков) влево приведена ниже, на Рис. 5.2 (стр. 62). Реализует данный алгоритм программа Прогр. 5.4.
При делении делитель вычитается из все большей части делимого и после каждого вычитания анализируется бит заема (C). Если делитель больше той части делимого, из которой он вычитается, то C = 1. В этом случае цифра частного равна нулю, и делитель суммируется с результатом вычитания для восстановления исходной части делимого (остатка). Если при вычитании заема не возникает (C = 0), то цифра частного равна 1, а результат используется 
как новое промежуточное делимое.
Рис. 5.1. Алгоритм работы программы умножения двух однобайтных чисел с получением двухбайтного результата.
Входными параметрами данной программы являются делимое (в регистре Е) и делитель (в регистре D), а выходными параметрами – частное (в регистре Н) и остаток (в регистре С). Перед началом выполнения программы признак переноса C должен быть сброшен.
Прогр. 5.4. Программа деления двоичных чисел.
MVI E, A9h | ;Загрузка в E делимого. | |
MVI D, 54h | ;Загрузка в D делителя. | |
LXI H, 0008h | ;Загрузить счетчик битов (L) и очистить ; регистр H. | |
MVI C, 00h | ;Очистить регистр промежуточного делимого. | |
LAB_1: | MOV A, E | ;Загрузить делимое в Акк. |
RAL | ;Сдвинуть старший бит в разряд С. | |
MOV E, A | ;Возвратить делимое в регистр E. | |
MOV A, C | ;В Акк. промежуточное делимое из регистра С. | |
RAL | ;Сдвинуть разряд С в младший бит Акк. | |
SBB D | ;Вычесть из содержимого Акк. делитель ; с учетом заема. | |
JNC LAB_2 | ;Если результат положительный, то идти ; на LAB_2 (C = 0). | |
ADD D | ;Сложить содержимое регистра D с Акк. | |
LAB_2: | MOV C, A | ;Возвратить промежуточное делимое в ; регистр С. |
CMC | ;Инвертировать разряд С. | |
MOV A, H | ;Запись цифры частного. | |
RAL | ||
MOV H, A | ||
DCR L | ;Проверены ли все 8 разрядов. | |
JNZ LAB_1 | ;Если нет, продолжать. | |
HLT | ;Выход из программы. |
6.1.4. Вычисление специальных функций.
Для вычисления специальных функций (
,
,
,
,
,
и пр.) применяются специальные алгоритмы. Функции
,
,
можно вычислить, воспользовавшись их разложением в ряд [6] (см. Табл. 5.1, стр. 63). Число членов ряда определяется исходя из условия получения требуемой точности. Для вычисления функции
с точностью до целых чисел можно применить алгоритм, основанный на том, что квадрат числа можно определить сложением последовательности нечетных чисел (см. Табл. 5.2, стр. 63).
Из приведенного примера видно, что какое число необходимо возвести в квадрат, такое количество последовательных нечетных чисел, начиная с 1, и необходимо сложить.
Вычисление специальных функций по приведенным выражениям занимает длительное время и обеспечивает низкую точность. Это обусловлено небольшой длиной машинного слова и ограниченным быстродействием МП. Поэтому, в тех случаях, когда ставятся жесткие условия по быстродействию и точности, применяется вычисление функций с помощью таблиц. Программа Прогр. 5.5 (см. ниже) иллюстрирует это.
Программа Прогр. 5.5 определяет квадрат чисел от 0 до 10 включительно. Входной параметр программы – число x. Оно записывается в регистр L. Выходной параметр – значение x в регистре Н.

Рис. 5.2. Алгоритм программы деления двоичных чисел.
Табл. 5.1. Примеры разложения некоторых элементарных функций в степенной ряд (ряд Тейлора).
|
|
|
|
|
|
Табл. 5.2. К вычислению квадратного корня с точностью до целых чисел.
Число | Сумма нечетных чисел | Результат |
1 | 1 | = 1 |
2 | 1 + 3 | = 4 |
3 | 1 + 3 + 5 | = 9 |
4 | 1 + 3 + 5 + 7 | = 16 |
5 | 1 + 3 + 5 + 7 + 9 | = 25 |
Прогр. 5.5. Программа для определения квадрата чисел от 0 до 10 включительно.
LAB_1: | MVI H, 00h | ;Очистить регистр Н. |
LXI D, 0100h | ;Загрузить начальный адрес таблицы. | |
DAD D | ;Получить адрес элемента. | |
MOV H, M | ;Загрузить его в регистр Н. | |
JMP LAB_1 | ;Безусловный переход для организации ; вечного цикла. | |
HLT | ;Выход из программы. | |
;Таблица квадратов целых чисел: | ||
; 0100 – 00h 0106 – 24h | ||
; 0101 – 01h 0107 – 31h | ||
; 0102 – 04h 0108 – 40h | ||
; 0103 – 09h 0109 – 51h | ||
; 0104 – 10h 010A – 64h | ||
; 0105 – 19h | ||
6.2. Задания для самоподготовки
1. Изучить подгруппу арифметических команд МП.
2. Ознакомиться с правилами выполнения команды DAA (десятичная коррекция аккумулятора).
3. Подробно изучить работу программ Прогр. 5.1 – Прогр. 5.5. Рассмотреть результат выполнения каждой программы на конкретных числовых примерах.
6.3. Задания к лабораторной работе
Задание 5.1. Исследование программы сложения массива однобайтных чисел с получением двухбайтного результата.
Порядок выполнения задания:
1. Ввести программу Прогр. 5.1, исправить ошибки, осуществить пуск.
2. Записать в память последовательность из пяти чисел, начиная с адреса 0100h. Исследовать процесс выполнения программы в пошаговом режиме (проверить ее выполнение по данным, записываемым программой в регистр С и аккумулятор).
3. Видоизменить программу Прогр. 5.1 так, чтобы результат выполнения записывался по адресу 0220h и 0221h. Проверить результат ее выполнения. Изменить в программе указатель количества слагаемых на 10 и выполнить программу заново.
Задание 5.2. Исследование программы сложения (вычитания) двух чисел, имеющих одинаковую длину (тип программы задается преподавателем).
Порядок выполнения задания:
1. Ввести программу Прогр. 5.2, исправить ошибки, осуществить пуск.
2. Записать по адресам, указанным в регистрах HL и DE, 1-е слагаемое (вычитаемое) и 2-е слагаемое (уменьшаемое). При этом сначала рассмотреть сложение (вычитание) однобайтных чисел.
3. Исследовать процесс выполнения программы в пошаговом режиме.
4. Исследовать в аналогичной последовательности результат выполнения сложения (вычитания) четырехбайтных и шестибайтных чисел.
Задание 5.3. Исследование программы умножения двух однобайтных чисел с получением двухбайтного результата.
1. Ввести программу Прогр. 5.3, исправить ошибки, осуществить пуск.
2. Исследовать процесс выполнения программы в пошаговом режиме при различных значениях перемножаемых чисел.
Задание 5.4. Исследование программы деления двоичных чисел.
1. Ввести программу Прогр. 5.4, исправить ошибки, осуществить пуск.
2. Исследовать процесс выполнения программы в пошаговом режиме при различных значениях делимого и делителя.
Задание 5.5. Исследование программы вычисления квадрата числа с помощью таблицы.
Порядок выполнения задания:
1. Ввести программу Прогр. 5.5, исправить ошибки, осуществить пуск.
2. Записать в память, начиная с адреса 0100h таблицу квадратов чисел от 0 до 10.
3. Записать в регистр L число, квадрат которого необходимо вычислить.
4. Исследовать процесс выполнения программы в пошаговом режиме и проверить результат вычисления квадрата числа по содержимому регистра Н.
5. Ввести в программу проверку на значение числа, квадрат которого вычисляется. Если задаваемое число больше 10, то программа должна отреагировать на это.
6.4. Содержание отчета
Отчет должен содержать:
1. Название работы, фамилию и инициалы студента, номер группы, цель работы.
2. Полный перечень арифметических команд МП (см. Табл. 0-8, Табл. 0-9).
3. Программы Прогр. 5.1 – Прогр. 5.5 с комментариями и в печатном виде. Программы Прогр. 5.1, Прогр. 5.2 и Прогр. 5.5 должны быть представлены с учетом их изменений в заданиях к лабораторной работе.
4. Результаты выполнения арифметических операций по всем заданиям.
5. Выводы по лабораторной работе.
6.5. Контрольные вопросы
1. Какие команды арифметических операций может выполнять исследуемый МП?
2. Сформулировать правило выполнения МП команды DAA.
3. После каких команд можно осуществить десятичную коррекцию числа в аккумуляторе?
4. Как оценить максимальное время выполнения программы умножения двух чисел?
5. На чем основаны алгоритмы программ умножения и деления чисел?
6. В чем преимущество вычисления функции, заданной в виде таблицы?
7. Представить числа от 0 до 20 в двоично-десятичном коде.
8. Указать возможные способы представления чисел для МП.
Литература
1. Каган Б. М., Сташин В. В. Основы проектирования микропроцессорных устройств автоматики. – М.: Энергоатомиздат, 1987. – 304 с.
2. Электронные промышленные устройства: Учеб. для студ. Вузов спец. “Пром. Электрон.”/ В. И. Васильев, Ю. М. Гусев, В. Н. Миронов и др. – М.: Высш. Шк., 1988. – 303 с.
3. Каган Б. М., Сташин В. В. Микропроцессоры в цифровых системах. – М.: Энергия, 1979. – 193 с.
4. Микропроцессоры. В трех книгах, под ред. Л. Н. Преснухина. Кн. 1. Архитектура и проектирование микро-ЭВМ. Организация вычислительных процессов.
5. Учебный микропроцессорный комплект. Паспорт. РР3.059.004.ПС.
6. Бронштей И. Н., Семендяев К. А. Справочник по математике для инженеров и учащихся втузов. М.: Наука, 1980.
[1] При выполнении команд CPI и CMP содержимое Акк. не изменяется. В случае равенства сравниваемых операндов флаг Z устанавливается в 1, а флаг C – в 0, в случае, когда Акк. больше второго операнда, флаги Z и C устанавливаются в 0, в случае же, когда Акк. меньше второго операнда, флаг Z устанавливается в 0, а флаг C – в 1.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 |


