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

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

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

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.

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