- •Лабораторная работа №3.
- •Inc Инкремент
- •3.2. Практическая часть.
- •3.2.1. Арифметические команды. Команды сложения.
- •Команды вычитания.
- •Команды инкремента и декремента.
- •Команды умножения и арифметического дополнения.
- •3.2.2. Команды байтовой логики.
- •3.2.3. Команды сдвига.
- •Команды логического (или последовательного) сдвига.
- •Команды арифметического сдвига.
- •Команды циклического сдвига.
- •3.2.4. Команды работы с битами.
- •3.2.5. Команды сравнения и тестирования. Команды сравнения.
- •Команды тестирования.
- •3.3. Контрольные вопросы.
- •3.4. Задания.
Команды тестирования.
По команде TST (TeST) происходит тестирование содержимого либо одного из регистров, либо одной из первых 511 ячеек памяти. По команде устанавливаются некоторые флаги регистра CC и по своему действию эта команда аналогична сравнению с нулем.
Команда BIT (BIt Test) тестирует группу битов в аккумуляторе, сответствующие которым биты в операнде установлены. Операнд можно задавать теми же способами, что и у предыдущей команды. По своему действию команда полностью идентична команде AND, за исключением того, что команда BIT не изменяет содержимое аккумулятора.
Пример 4. Рассмотрим пример реализации следующего задания: определить длину строки, которая располагается в последовательных ячейках памяти, начиная с адреса $51. Признаком конца строки служит нулевой байт. Длину строки поместить в ячейку с адресом $50.
Примечание: фактически программа преобразует строку из формата, принятого в языке C, в формат, принятый в языке Pascal.
0100 5F CLRX Очистить индексный регистр для адресации первого байта со смещением $51.
0101 6D 51 TST $51,X Протестировать содержимое байта с текущим индексом со смещением $51.
0103 27 03 BEQ $0108 Если ноль, закончить цикл.
0105 5C INCX Увеличить содержимое индексного регистра для адресации следующего байта.
0106 20 F9 BRA $0101 Продолжить цикл.
0108 BF 50 STX $50 Сохранить полученную длину строки по адресу $50.
Содержимое памяти до выполнения программы:
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 Если ноль, то перейти дальше.
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 Если счетчик не ноль, то продолжать цикл.
012C 33 52 COM $52 Дополнение ячейки с адресом $52.
012E B7 53 STA $53 Занести остаток в ячейку с адресом $53.
В программе выполняется деление “в столбик”. Сначала производится сдвиг делителя до тех пор, пока он не станет больше делимого (адреса $010B..$0114). Если старший значащий бит делителя выходит за пределы байта, то этот случай рассматривается отдельно (адреса $0116..$011D). После этого делимое сдвигается вправо и вычитается из делимого, а в ячейку с результатом записывается бит переноса (адреса $011F..$012A). При этом, чтобы не инвертировать каждый раз бит переноса, инвертируется результат (адреса $0108 и $012C).