
- •Однокристальная микроЭвм мс68нс05с8.
- •Практическая часть.
- •1. Арифметические команды. Команды сложения.
- •Команды вычитания.
- •Команды инкремента и декремента.
- •Команды умножения и арифметического дополнения.
- •2. Команды байтовой логики.
- •3. Команды сдвига.
- •Команды логического (или последовательного) сдвига.
- •Команды арифметического сдвига.
- •Команды циклического сдвига.
- •4. Команды работы с битами.
- •5. Команды сравнения и тестирования. Команды сравнения.
- •Команды тестирования.
- •Контрольные вопросы.
- •Задания.
Команды умножения и арифметического дополнения.
Команда MUL (MULtiplication) умножает содержимое аккумулятора на содержимое регистра X. Результат помещается в слове, образованном этими же байтами. Старшим байтом результата является регистр X, младшим-аккумулятор. Команда NEG (NEGate) производит арифметическое дополнение (вычитает текущее значение из 0) либо содержимого одного из регистров, либо содержимого ячейки памяти. Доступны только первые 511 ячеек.
В данном ассемблере команда MUL является командой беззнакового умножения, т.е. ее операнды рассматриваются как байтовые числа от 0 до 256. Байтовые числа могут также рассматриваться как числа со знаком, т.е. числа от -128 до +127. Все числа, у которых бит 7 (знаковый) сброшен, считаются положительными, а укоторых установлен-отрицательными
Пример 1.В данном примере реализуется подпрограмма знакового умножения двух чисел.
0100 B6 50 LDA $50 Загрузить первый множитель в аккумулятор.
0102 2A 01 BPL $0105 Если он отрицателен, то
0104 40 NEGA сделать отрицание.
0105 BE 51 LDX $51 Загрузить второй множитель в аккумулятор.
0107 2A 01 BPL $010A Если он отрицателен, то
0109 50 NEGX сделать отрицание.
010A 42 MUL Умножить.
010B BF 52 STX $52 Сохранить старший байт результата.
010D B7 53 STA $53 Сохранить младший байт результата.
010F B6 50 LDA $50 Загрузить первый множитель в аккумулятор.
0111 B8 51 EOR $51 Если оба множителя положительны, либо оба множителя отрицательны, то
0103 2A 08 BPL $011D выйти из программы.
0105 30 53 NEG $53 Отрицание младшего байта.
0107 24 02 BCC $011B Если младший байт равен нулю, то перешагнуть инкремент.
0119 3C 52 INC $52 Инкремент старшего байта.
011B 30 52 NEG $52 Отрицание старшего байта.
011D 9D NOP Нет операции.
Список тестов:
-
Значение в ячейке $50
Значение в ячейке $51
Результат в ячейках $52 и $53
$FF (-$01)
$FF (-$01)
$0001
$FF (-$01)
$75
$FF8B (-$0075)
$80(-$80)
$01
$FF80(-$0080)
$80(-$80)
$FF(-$01)
$0080
Пример 2.В качестве итогового примера предлагается рассмотреть программу, которая вычисляет сумму квадратов первых n чисел, где число n помещается в ячейку $50, а итоговая сумма заносится в ячейки $51 и $52. Так как значение суммы ограничено числом 65535-максимальным, которое помещается в два байта, корректное значение получится только лишь для чисел n, меньших, либо равных $8E.
0100 3F 51 CLR $51 Обнулить старший байт суммы.
0102 3F 52 CLR $52 Обнулить младший байт суммы.
0104 B6 50 LDA $50 Загрузить в аккумулятор текущее значение счетчика.
0106 97 TAX Скопировать его в регистр X для умножения самого на себя.
0107 42 MUL Умножить.
0108 BB 52 ADD $52 Прибавить к младшему байту результата младший байт предыдущего значения суммы.
010A B7 52 STA $52 Сохранить новое значение.
010C 9F TXA Скопировать в аккумулятор старший байт квадрата текущего числа.
010D B9 51 ADC $51 Прибавить к нему старший байт предыдущего значения суммы, с учетом возможного переноса из младшего байта.
010F B7 51 STA $51 Сохранить новое значение.
0111 3A 50 DEC $50 Уменьшить значение счетчика цикла.
0113 26 EF BNE $0104 Повторять цикл, пока счетчик не обнулится.
Список тестов:
-
Значение в ячейке $50
Результат в ячейках $51 и $52
$15
$0CEF
$09
$011D
$8E
$B7B7
$8F
$0798*
*В этом случае произошло переполнение, так как двух байт не хватило для размещения полученного результата. Желающим узнать истинное значение суммы предлагается самостоятельно модифицировать программу таким образом, чтобы суммы размещалась не в двух, а в трех байтах.