Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OMT&МП2.doc
Скачиваний:
11
Добавлен:
13.11.2019
Размер:
2.35 Mб
Скачать

Деление

Существует несколько алгоритмов деления. В описании к лабораторной работе № 5 "Выполнение арифметических операций" рассмотрены два алгоритма, позволяю­щие рассчитать частное и остаток от деления двух 8-ми разрядных слов. На практике часто применяется программа упрощенного деления с округлением результата до цело­го. Рассмотрим один из таких алгоритмов, позволяющий делить положительные и от­рицательные представленные в дополнительном коде числа на положительное целое число.

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

  1. В счетчик числа циклов загружаем число N, соответствующее разрядности частного от деления.

Р ис. 10.2. Блок-схема алгоритма умножения чисел

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

  2. Проверяем старший разряд результата операции п2. Если старший разряд результата равен 0, то бит частного равен 1, в противном случае бит частного равен 0.

  3. Уменьшаем содержимое счетчика числа циклов на 1 и переходим к п.2, если счетчик не равен 0.

Отметим, что в процессе расчета биты частного устанавливаются от старшего к младшему, т. е. на первом цикле в п3. определяется самый старший бит, а на последнем цикле — самый младший бит частного.

Алгоритм расчета поясним на следующем примере:

а) 62:6  10,3; N=5

000111110:0110 0 1 010 = +1010

001111100

- 0110_____

110111100 старший бит =1

101111000

+0110_____

000111000 старший бит =0

001110000

- 0110_____

110110000 старший бит =1

101100000

+0110_____

000100000 старший бит =0

001000000

- 0110_____

110000000 старший бит =1

б) (-62):6  -10,3

111000010 : 0110 1 0 1 0 1 = -1110

110000100

+0110_____

001000100 старший бит = 0

010001000

- 0110_____

111001000 старший бит = 1

110010000

+0110_____

001010000 старший бит = 0

010100000

- 0110_____

111100000 старший бит = 1

111000000

+0110_____

010000000 старший бит = 0

В подпрограмме 10.4 приведен пример программы деления 32-х разрядного числа на 16-ти разрядное по рассмотренному алгоритму. Делимое расположено в регистрах R1 и R2, делитель в регистре R3, частное от деления размещается в регистре R2. Регистр R0 используется в качестве счетчика циклов.

Блок - схема подпрограммы 10.4 приведена на рис. 10.3. В начальной части подпрограммы производится проверка на знак делителя. Если содержимое R3 — отрицательное число, то производится изменение знака делителя и делимого.

Если содержимое R3 — положительное число, то переход к собственно алгоритму деления. Далее загружается счетчик циклов R0 и производятся циклы сдвигов и арифметических действий в соответствии с описанным алгоритмом.

Отметим, что программа работоспособна, если частное не превышает по разрядности разрядность регистра R2. В противном случае программа производит вычисле­ния с ошибкой.

В подпрограмме 10.4 в качестве делителя могут быть использованы целые числа в диапазоне от -32768 до +32767.

Подпрограмма 10.4.

(R1,R2):(R3) = (R2)

Метка

Мнемоника

Комментарий

TST R3

Проверка знака делителя

BPL M1

Переход, если делитель положительное число

СОМ R1

Изменение знака делимого

СОМ R2

ADD #1,R2

ADC R1

NEG R3

Изменение знака делителя

M1

MOV #20,R0

Загрузка счетчика циклов

M5

ASL R2

Сдвиг делимого влево

ROL R1

BIT #100000,R1

Проверка старшего разряда делимого

BEQ M2

Переход, если старший разряд равен 0

ADD R3,R1

Сложение старшего слова делимого с делителем

BR МЗ

Безусловный переход

M2

SUB R3,R1

Вычитание из старшего слова делимого делителя

M3

BIT #100000,R1

Проверка старшего разряда ре­зультата

BNE M4

Переход, если старший разряд равен 1

INC R2

Установка текущего разряда частного в 1

M4

SOB R0,M5

Уменьшение содержимого счет­чика на 1. Переход, если содер­жимое R0>0

HALT

Останов

В подпрограмме 10.5 приведена программа деления 48-ми разрядного числа на 32-х разрядное число. Программа составлена на основании приведенного алгоритме деле­ния. Делимое располагается в регистрах R3, R4 и R5, делитель в регистрах R1, R2, частное после выполнения программы располагается в регистре R5, в качестве счетчика числа циклов используется регистр R0.

Отметим, что, несмотря на увеличение разрядности делимого и делителя, в про­грамме 5 остается ограничение на частное, которое должно быть в диапазоне от -32768 то +32767.

Р ис. 10.3. Блок - схема подпрограммы деления

Подпрограмма 10.5

(R3,R4,R5) : (R 1,R2) = (R5)

Метка

Мнемоника

Комментарий

TST R1

Проверка знака делителя

BPL М1

Переход, если делитель положительное число

СОМ R1

Изменение знака делителя

СОМ R2

ADD #1,R2

ADC R1

СОМ R3

Изменение знака делимого

СОМ R4

СОМ R5

ADD #1,R5

ADC R4

ADC R3

M1

MOV #20,R0

Загрузка счетчика числа циклов

M5

ASL R5

Сдвиг делимого влево

ROL R4

ROL R3

BIT #100000,R3

Проверка старшего разряда делимого

BEQ M2

Переход, если старший разряд равен 0

ADD R2,R4

Сложение содержимого регистров R3 и R4 с делителем

ADC R3

ADD R1,R3

BR M3

Безусловный переход

M2

SUB R2,R4

Вычитание из содержимого регистров R3 и R4 делителя

SBC R3

SUB R1,R3

M3

B1T #100000,R3

Проверка старшего разряда результата

BNE M4

Переход, если старший разряд результата равен 1

INC R5

Установка текущего разряда частного в 1

M4

SOB R0,M5

(R0)=(R0)-1. Переход, если содержимое R0>0

HALT

Останов

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]