Поскольку каждое очередное частичное произведение - результат перемножения множимого и разряда множителя, вес которого больше веса разряда, использованного в предыдущей операции умножения, то все цифры полученного произведения сдвигаются влево на одну позицию (двоичный разряд). Для получения результирующего произведения смещенные относительно друг друга частичные произведения складываются. Возникающие при сложении переносы должны быть учтены при формировании окончательного результата.
Анализируя рассмотренный выше пример можно сделать вывод, что для умножения двоичных чисел необходимо осуществить многократное суммирование частичных произведений со сдвигом множимого влево. При этом каждый раз необходимо проверять содержимое разрядов множителя, начиная со стороны его младшего разряда. Если в текущем разряде множителя записана единица, то множимое прибавляется к сумме и сдвигается влево на один разряд. Если же в текущем разряде множителя записан нуль, то необходимо произвести только сдвиг множимого.
На практике сдвиг множимого влево заменяют сдвигом суммы вправо.
7.2.2. Арифметическое деление
Процедура деления несколько сложнее процедуры умножения. Рассмотрим, например, деление числа 20410 (1100 11002) и 1210 (11002).
1100 1100 / 1100
1100 10001
0 1
0
0 11
0
0 110
0
0 1100
1100
0
Двоичное деление начинается с анализа делимого (1100 11002) и делителя (11002). Поскольку делитель (11002) точно укладывается в 11002, то записываем единицу в старший разряд частного. Умножаем делитель на 1 и вычитаем результат из 11002. Разность равна нулю, т. е. меньше делителя, а потому процесс деления можно продолжить.
Объединяем нуль остатка со значением следующего разряда делимого, равным 1. Поскольку делитель (11002) укладывается 0 раз в числе 012, записываем 0 в следующий разряд частного, а число 012 объединяем со следующей цифрой делимого и т. д. Описываемая процедура продолжается до тех пор, пока делимое не оказывается исчерпанным.
Для выполнения арифметического деления используют следующий алгоритм. Путем циклического сдвига через флаг переноса формируют так называемое промежуточное делимое, такое, что при каждом сдвиге содержимое старшего разряда делимого «задвигается» в младший разряд промежуточного делимого.
После каждого сдвига из промежуточного делимого пытаются вычесть делитель. Если это удается (получена положительная разность), то, во-первых, промежуточное делимое заменяют полученной разностью, а во-вторых, в младший разряд частного «задвигают» единицу.
Если вычитание не удается (получена отрицательная разность), то в младший разряд частного «задвигают» нуль, а промежуточное делимое оставляют без изменений.
Далее производится очередной сдвиг старшего разряда делимого в младший разряд промежуточного делимого. Так происходит, пока не будут просмотрены все разряды делимого, начиная с самого старшего.
7.3. Задание к лабораторной работе
Задание №1.
Составить программу умножения двух однобайтных чисел (с получением двухбайтного результата).
Исходные данные: множимое - регистр В; множитель - регистр С.
Результат: произведение - регистровая пара DE.
Вспомогательные регистры: H - «маска»; L - число разрядов множителя.
Для этого необходимо:
а) составить программу в соответствии со следующим алгоритмом:
1. Установить начальные значения регистров D, E, H, L.
2. Проверить значение очередного разряда множителя (единица или нуль) путем сравнения с «маской».
3. Загрузить в аккумулятор старший байт результата.
4. Если в очередном разряде множителя нуль, то перейти к п.6.
5. Прибавить множимое к старшему байту результата.
6. Сдвинуть полученный результат вправо через флаг переноса.
7. Сохранить полученное число как старший байт результата.
8. Загрузить в аккумулятор младший байт результата.
9. Сдвинуть число в аккумуляторе вправо через флаг переноса.
10. Сохранить полученное число как младший байт результата.
11. Уменьшить число разрядов множителя, подлежащих проверке, на единицу.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.