Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_КП_1801.doc
Скачиваний:
10
Добавлен:
27.08.2019
Размер:
2.81 Mб
Скачать

4. Определение кратности любому числу

Часто в задании к курсовой работе предлагается выбрать числа, которые кратны определенному числу. Кратность числа двум рассматривается в разделе «Определение четности чисел» и здесь рассматриваться не будет.

Ассемблер К1801ВМ1 содержит команды знакового целочисленного деления и умножения, а также команды для операций с плавающей запятой, которые также являюся знаковыми. Работа с командами с плавающей запятой в данном пособии не рассматривается.

Разрядность операндов для умножения составляет 16 бит с получением 16- или 32-разрядного произведения. Для деления разрядность делимого 32 бита а делителя 16 бит. Разрядность частного и остатка составляет 16 бит. Следует еще раз обратить Ваше внимание на то, что и операнды и результат являются знаковыми числами в дополнительном коде. Если работа со знаковыми числами представляет сложность следует переходить к работе с модулем числа.

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

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

Рис. 8. Алгоритм деления вычитатнием

Даный алгоритм расчитан на переход от знакового деления к делению модулей чисел. Ниже представлен вариант кода, который осуществляет деление четырех слов на три. По адресам 400 – 406 находиться делимое, по адресам 410 – 414 делитель. Старшинство слов – стандартное (младший адрес, младшее слово).

Результат в регистрах: R5, R4 – частное, R2, R1, R0 – остаток.

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

Адрес

Метка

Мнемокод

Комментарий

1000

CLR R4

Очистить частное

CLR R5

1004

NEXT

ADD #1, R4;

Увеличить частнок

ADC R5

SUB 410, 400

Вычесть младшее слово делителя

с учетом переноса

SBC 402

SBC 404

SBC 406

BMI END

Если число изменило знак,

закончить вычисление

SUB 412, 402

Вычесть среднее слово делителя

SBC 404

SBC 406

BMI END

Проверить знак

SUB 414, 404

Вычесть старшее слово делителя

SBC 406

BMI END

Проверить знак

BR NEXT

Иначе продолжить вычитать

1074

END

SUB #1, R4;

Скорректировать частное

SBC R5

MOV 400, R0

Скорректировать остаток

MOV 402, R1

MOV 404, R2

ADD 410, R0

ADC R1

ADC R2

ADD 412, R1

ADC R2

ADD 414, R2

HALT

Остановиться

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

400) 2222

402) 2222

404) 0

406) 0

410) 2

412) 0

414) 0

программа работала около 10 секунд.

Без изменения алгоритма работы программы от этого недостатка не избавиться.

Другим недостатком является отсутствие контроля нуля в делителе. Данный недостаток легко устраняется путем предварительной проверки делителя. По требованию преподавателя такая ситуация должна быть обработана и отмечена специальным образом.