- •Введение
- •1. Краткие теоретические сведения по ассемблеру мп к1801вм1
- •1.1. Регистровая модель
- •1.2. Адресное пространство
- •1.3. Методы адресации
- •1.3.1. Методы прямой адресации
- •1.3.2. Методы косвенной адресации
- •1.3.3. Методы адресации, использующие в качестве рон r7
- •2. Алгоритмы сортировки
- •2.1. Оценка алгоритма сортировки
- •2.2. Классификация алгоритмов сортировки
- •2.3. Сортировка пузырьком
- •3. Определение четности чисел
- •3.1. Определение чисел кратных двум
- •3.2. Определение числа единиц в числе
- •4. Определение кратности любому числу
- •5. Определение модуля числа
- •6. Многословное умножение
- •Заключение
- •Приложения Приложение 1. Оформление отчета по курсовой работе
- •Результаты работы программы
- •Приложение 2. Список команд
- •Приложение 3. Эмулятор Ersatz-11
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 секунд.
Без изменения алгоритма работы программы от этого недостатка не избавиться.
Другим недостатком является отсутствие контроля нуля в делителе. Данный недостаток легко устраняется путем предварительной проверки делителя. По требованию преподавателя такая ситуация должна быть обработана и отмечена специальным образом.