- •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 ................
- •Контрольные вопросы.
- •Задания.
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 ................
Пример 5.Приведенная ниже программа по своему действия аналогична программе из примера 1. для команд сравнения, но использует командуBITдля проверки числа на установленный старший (7) бит, который, как известно, определяет знак числа.
0100 B6 50 LDA $50 Загрузить значение ячейки $50.
0102 A5 80 BIT #$80 Протестировать старший бит.
0104 27 01 BEQ $0107 Если он сброшен то пропустить следующую команду.
0106 40 NEGA Иначе изменить знак.
0107 B7 51 STA $51 Сохранить результат в ячейке $51.
Набор тестов тоже полностью аналогичен.
В качестве заключительного примера приведем здесь программу деления. Делимое находится в ячейке с адресом $50, делитель- в ячейке с аресом $51, частное помещается по адресу $52, а остаток- по адресу $53.
0100 B6 50 LDA $50 Загрузить делимое из ячейки с адресом $50.
0102 3F 52 CLR $52 Очистить ячеку $52.
0104 B1 51 CMP $51 Сравнить делимое с делителем.
0106 25 26 BCS $012E Если делитель больше то выйти из программы.
0108 33 52 COM $52 $FF в ячейку $52.
010A 5F CLRX Очистить счетчик сдвигов.
010B 38 51 LSL $51 Сделать логический свиг делителя влево.
010D 25 07 BCS $0116 Если старший бит вышел за пределы байта, обработать этот случай отдельно.
010F 5C INCX Увеличить счетчик сдвигов.
0110 B1 51 CMP $51 Сравнить делимое с делителем.
0112 25 0B BCS $011F Если делимое больше то выйти из цикла.
0114 20 F5 BRA $010B Переход на начало цикла.
0116 36 51 ROR $51 Вернуть обратно старший бит.
0118 B0 51 SUB $51 Вычесть делимое из делителя.
011A 39 52 ROL $52 Сохранить битC в младшем бите ячейки с адресом $52.
011C 5D TSTX Проверить содержимое счетчика сдвигов.
011D 27 0D BEQ $012C Если 0 то перейти дальше.
011F 34 51 LSR $51 Сдвинуть вправо делитель.
0121 B1 51 CMP $51 Сравнить с делимым.
0123 25 02 BCS $0127 Если делитель больше, обойти вычитание.
0125 B0 51 SUB $51 Вычесть делимое из делителя.
0127 39 52 ROL $52 Сохранить битC в младшем бите ячейки с адресом $52.
0129 5A DECX Уменьшить счетчик сдвигов.
012A 26 F3 BNE $011F Если счетчик не 0 то продолжать цикл.
012C 33 52 COM $52 Дополнение ячейки с адресом $52.
012E B7 53 STA $53 Остаток в ячейку с адресом $53.
Работу программы нетрудно проверить самим.
В программе выполняется деление в столбик. Сначала производится сдвиг делителя до тех пор, пока он не станет больше делимого (адреса $010B..$0114). Если старший значащий бит делителя выходит за пределы байта, то этот случай рассматривается отдельно (адреса$0116..$011D). После этого делимое сдвигается вправо и вычитается из делимого, а в результат записывается бит переноса (адреса$011F..$012A). При этом, чтобы не инвертировать каждый раз бит переноса, инвертируется результат (адреса$0108 и$012C).
Контрольные вопросы.
1. Объясните логику работы команд сложения и вычитания с учетом флага CрегистраCC при обработке многобайтовых чисел.
2. Опишите работу команд, выполняющих операцию циклического сдвига аккумулятора.
3. Придумайте не менее двух способов инвертирования содержимого аккумулятора.
4. Придумайте по два способа занесения в аккумулятор чисел $00 и $FF, используя только логические команды.
5. Дайте описание и приведите пример использования команды ASR.
6. Каким образом можно обращаться к битам и работать с ними, без ипользования команд работы с битами?
7. Опишите способы адресации команд ADC, ADD, SUB, SBC, AND, ORA, EOR, CMP, CPX.
8. Опишите способы адресации команд LSL, LSR, ASL, ASR, ROL, ROR COM, DEC, INC, NEG, TST, BIT.
9. Опишите способы адресации команд BSET, BCLR.
10. Опишите способы адресации команды MUL.
11. Почему в программе из примера на команды ASL, ASR правильными будут значения в ячейках $52 и $53, а неправильными - в ячейке $51?
12. Как можно организовать циклический сдвиг многобайтового слова?
13. Почему программы для нахождения модуля числа (пример 1 для команд сравнения, пример 2 для команд тестирования) не будут находить модуль числа $80 (-128.)?
14. Сколько байт в памяти могут занимать команды ADD, LSL,MUL, BCLR?
15. Чем отличаются команды ASR и LSR?
16. Чем отличаются команды NEGи COM?
17. Чем отличаются команды LSL иASL?
18. Чем отличаются команды LSL иROL?
19. Как работают команды CMP, BIT, TST?
20. Для чего чаще всего используются команды INCиDEC?