Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB3_W95.DOC
Скачиваний:
23
Добавлен:
16.04.2013
Размер:
87.04 Кб
Скачать

Команды тестирования.

По команде 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).

Соседние файлы в предмете Отладка микроконтроллеров ЭВМ