Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы / Lab_moto / 3.doc
Скачиваний:
18
Добавлен:
16.04.2013
Размер:
196.1 Кб
Скачать

Команды умножения и арифметического дополнения.

Команда 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*

*В этом случае произошло переполнение, так как двух байт не хватило для размещения полученного результата. Желающим узнать истинное значение суммы предлагается самостоятельно модифицировать программу таким образом, чтобы суммы размещалась не в двух, а в трех байтах.

Соседние файлы в папке Lab_moto