- •1. Теоретическая часть.
- •1.1.Группа команд арифметических операций
- •Группа команд логических операций.
- •2. Практическая часть.
- •2.1. Примеры использования арифметических команд.
- •Команды загрузки регистров а и х данными из памяти.
- •Команды вычитания.
- •Команды инкремента и декремента.
- •0050 80 7E 7c 7a 78 76 74 72 70 6e 6c 6a 68 66 64 62
- •0060 60 5E 5c 5a 58 56 54 52 50 4e 4c 4a 48 46 44 42 ' Команды умножения и арифметического дополнения.
- •2.2.Примеры использования команд байтовой логики.
- •2.3.Примеры использования команд сдвига.
- •Команды логического (или последовательного) сдвига.
- •Команды арифметического сдвига.
- •Команды циклического сдвига.
- •2.4. Примеры использования команд сравнения и тестирования. Команды сравнения.
- •0050 00 01 02 03 04 05 06 07 08 09 0A 0b 0c 0d 0e 0f ................
- •0060 00 01 02 03 04 05 06 07 08 09 0A 0b 0c 0d 0e 0f ................
- •0050 00 Ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 ................
- •0060 Ff fe fd fc fb fa f9 f8 f7 f6 f5 f4 f3 f2 f1 f0 ................
- •Команды тестирования.
- •0050 00 01 02 03 04 05 06 00 00 00 00 00 00 00 00 00 ................
- •0050 06 01 02 03 04 05 06 00 00 00 00 00 00 00 00 00 ................
- •Контрольные вопросы.
- •Задания.
Команды вычитания.
3. Пример использования команд вычитания SUB и SBC.
В качестве примера рассмотрим вычисление по формуле Z=(X+5)-Y, где двухбайтовые операнды X и Y располагаются в ячейках с адресами 0E0h (0E0h-старший байт, 0E1h-младший) и 0E2h (0E2h-старший байт, 0E3h-младший) соответственно, а результат Z помещается в слове по адресу 0E4h (0E4h-старший байт, 0E5h-младший).
LDA 0E1 ;Загрузить в аккумулятор младший байт операнда X.
ADD #05 ;Прибавить #5.
STA 0E5 ;Временно сохранить промежуточный результат.
LDA 0E0 ;Загрузить в аккумулятор старший байт операнда X.
ADC #00 ;Прибавить бит переноса от предыдущего сложения.
STA 0E4 ;Временно сохранить промежуточный результат.
LDA 0E5 ;Загрузить в аккумулятор младший байт суммы (X+5).
SUB 0E3 ;Вычесть младший байт операнда Y.
STA 0E5 ;Сохранить младший байт результата Z.
LDA 0E4 ;Загрузить в аккумулятор старший байт суммы (X+5).
SBC 0E2 ;Вычесть старший байт операнда Y с учетом возможного заема во время ;предыдущей операции вычитания.
STA 0E4 ;Сохранить старший байт результата Z.
Список тестов:
-
Значение в ячейках 50 и $51
Значение в ячейках $52 и $53
Результат в ячейках $54 и $55 после вычитания младшего байта
Содержимое регистра CC после выполнения команды SUB
Результат в ячейках $54 и $55 после вычитания старшего байта
Содержимое регистра CC после выполнения команды SBC
$10FB
$1005
$11FB
111.xN.C
$00FB
111.x.Z.
$FF80
$0F10
$FF75
111.x...
$F075
111.xN..
$FFFF
$0001
$0003
111Hx...
$0003
111Hx.Z.
$0000
$0008
$00FD
111.xN.C
$FFFD
111.xN.C
Команды инкремента и декремента.
4. Пример использования команд INC и DEC
Команды INC и DEC соответственно увеличивают или уменьшают на единицу значение в регистре или одной из первых 511 ячеек памяти.
Предположим, что нам нужно разместить по адресам $50-$6F числа убывающей арифметической прогрессии (Ti=Ti-1-K), где T1 хранится по адресу $70, a модуль разности-по адресу $71.
LDA #$20 Будем вычислять 20 членов прогрессии.
STA $72 Проинициализировать ячейку $72-счетчик цикла.
LDA $70 Загрузка в аккумулятор значения первого члена прогрессии.
CLRX Очистить содержимое индексного регистра для индексной адресации со смещением первой ячейки памяти из списка.
STA $50, X Поместить текущее значение аккумулятора в ячейку X относительно смещения $50.
SUB $71 Вычислить значение следующего члена прогрессии.
INCX Увеличить значение X для адресации следующей ячейки памяти.
DEC $72 Уменьшить счетчик цикла.
BNE $0107 Пока не заполним все 20 ячеек, повторять цикл.
Если ввести в ячейки $70 и $71 значения $80 и $02 соответственно, то после выполнения программы содержимое интересующего нас участка памяти будет таким:
0050 80 7E 7c 7a 78 76 74 72 70 6e 6c 6a 68 66 64 62
0060 60 5E 5c 5a 58 56 54 52 50 4e 4c 4a 48 46 44 42 ' Команды умножения и арифметического дополнения.
5. Пример использования команды MUL.и NEG
Команда MUL) умножает содержимое аккумулятора на содержимое регистра X. Результат помещается в слове, образованном этими же байтами. Старшим байтом результата является регистр X, младшим - аккумулятор. Команда NEG производит арифметическое дополнение (вычитает текущее значение из 0) либо содержимого одного из регистров, либо содержимого ячейки памяти. Доступны только первые 511 ячеек.
В данном ассемблере команда MUL является командой беззнакового умножения, т.е. ее операнды рассматриваются как байтовые числа от 0 до 256. Байтовые числа могут также рассматриваться как числа со знаком, т.е. числа от -128 до +127. Все числа, у которых бит 7 (знаковый) сброшен, считаются положительными, а укоторых установлен-отрицательными
В данном примере реализуется подпрограмма знакового умножения двух чисел.
0100 B6 50 LDA $50 Загрузить первый множитель в аккумулятор.
BPL $0105 Если он отрицателен, то
NEGA сделать отрицание.
LDX $51 Загрузить второй множитель в аккумулятор.
BPL $010A Если он отрицателен, то
NEGX сделать отрицание.
MUL Умножить.
STX $52 Сохранить старший байт результата.
STA $53 Сохранить младший байт результата.
LDA $50 Загрузить первый множитель в аккумулятор.
EOR $51 теля положительны, либо оба множителя отрицательны, то
BPL $011D выйти из программы.
NEG $53 Отрицание младшего байта.
BCC $011B Если младший байт равен нулю, то перешагнуть инкремент.
INC $52 Инкремент старшего байта.
NEG $52 Отрицание старшего байта.
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
6. Программа вычисления суммы квадратов числовой последовательности.
В качестве итогового примера предлагается рассмотреть программу, которая вычисляет сумму квадратов первых n чисел, где число n помещается в ячейку $50, а итоговая сумма заносится в ячейки $51 и $52. Так как значение суммы ограничено числом 65535-максимальным, которое помещается в два байта, корректное значение получится только лишь для чисел n, меньших, либо равных $8E.
CLR $51 Обнулить старший байт суммы.
CLR $52 Обнулить младший байт суммы.
LDA $50 Загрузить в аккумулятор текущее значение счетчика.
TAX Скопировать его в регистр X для умножения самого на себя.
MUL Умножить.
ADD $52 Прибавить к младшему байту результата младший байт предыдущего значения суммы.
STA $52 Сохранить новое значение.
TXA Скопировать в аккумулятор старший байт квадрата текущего числа.
ADC $51 Прибавить к нему старший байт предыдущего значения суммы, с учетом возможного переноса из младшего байта.
STA $51 Сохранить новое значение.
DEC $50 Уменьшить значение счетчика цикла.
BNE $0104 Повторять цикл, пока счетчик не обнулится.
Список тестов:
-
Значение в ячейке $50
Результат в ячейках $51 и $52
$15
$0CEF
$09
$011D
$8E
$B7B7
$8F
$0798*
*В этом случае произошло переполнение, так как двух байт не хватило для размещения полученного результата. Желающим узнать истинное значение суммы предлагается самостоятельно модифицировать программу таким образом, чтобы суммы размещалась не в двух, а в трех байтах.