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

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

Команда CMP (CoMPare) сравнивает содержимое аккумулятора с непосредственным значением, либо с содержимым ячейки памяти. Фактически происходит вычитание операнда из аккумулятора с той лишь разницей, что результат никуда не заносится (содержимое аккумулятора не изменяется). Однако, операция влияет на состояние соответствующих флагов. КомандаCPX (ComPare X) является полным аналогом командыCMP, где вместо аккумулятора в сравнении участвует регистрX.

Пример 1. Этот пример будет вычислять модуль числа, находящегося в ячейке $50 и записывать результат в ячейку $51.

0100 B6 50 LDA $50 Загрузить значение из ячейки $50.

0102 A1 80 CMP #$80 Сравнить с $80.

0104 25 01 BCS $0107 Если число меньше $80 (т.е. положительное), то перейти на команду сохранения его без изменения.

0106 40 NEGA Иначе изменить знак у числа.

0107 B7 $51 STA $51 Сохранить результат.

Примечание: как нетрудно видеть, программу можно несколько упростить, не выполняя сравнения и осуществляя переход, по флагу знака числа N в регистре CC. Желающим предлагается самостоятельно составить такой вариант программы. Приведенная программа предназначена лишь для иллюстрации команды сравнения.

Список тестов:

Значение в ячейке $50

Результат в ячейке $51

$01

$01

$FF

$01

$72

$72

$D2

$2F

Пример 2. Приведенная ниже программа просматривает содержимое памяти с адресами $50-$6F, используя индексную адресацию со смещением, и для ячеек памяти с индексами, меньшими $10 выполняется логическое отрицание, для остальных-арифметическое отрицание. Просмотр идет в порядке уменьшения адресов с целью упрощения проверки на окончание цикла.

0100 AE 20 LDX #$1F Загрузить максимальное значение смещения

0102 A3 10 CPX #$10 Сравнить текущее значение с $10.

0104 25 04 BCS $010A Если меньше, то перейти на выполнение команд арифметического отрицания.

0106 63 50 COM $50, X Иначе выполнить команду логического отрицания.

0108 20 02 BRA $010C И перейти, чтобы пропустить команду арифметического отрицания.

010A 60 50 NEG $50, X Выполнить команду арифметического отрицания.

010C 5A DECX Уменьшить значение счетчика.

010D 26 F3 BHS $0102 Повторять цикл до тех пор, пока значение счетчика не станет меньше нуля.

Если заполнить изменяемую область памяти двумя одинаковыми последовательностями символов $00-$0F, то можно наглядно увидеть различие между командами арифметического и логического отрицания.

Содержимое памяти до выполнения программы:

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 ................

Пример 3. Приведенная ниже программа иллюстрирует использование арифметических, логических команд и сдвигов в программе, которая преобразует значение ячейки памяти $50 в символьное представление этого числа в шестнадцатиричном виде и помещает эти два символа в ячейки памяти $51 и $52.

0100 B6 50 LDA $50 Загрузить начальное значение.

0102 A4 0F AND #$0F Оставить из него только младшую тетраду.

0104 AE 52 LDX #$52 Загрузить индекс для адресации байта для символьного представления младшей тетрады.

0106 CD 01 14 JSR $0114 Вызвать подпрограмму преобразования числа от $00 до $0F в код символьного представления соответствующей цифры.

0109 B6 50 LDA $50 Снова загрузить исходное значение.

010B 44 LSRA Выполнить четыре циклических сдвига

010C 44 LSRA вправо, чтобы переместить

010D 44 LSRA содержимое старшей тетрады

010E 44 LSRA в младшую и очистить

предыдущее содержимое старшей.

010F 5A DECX Уменьшить значение индекса для адресации байта для символьного представления старшей тетрады.

0110 CD 01 14 JSR 0114 Вызвать подпрограмму преобразования числа от $00 до $0F в код символьного представления соответствующей цифры.

0113 9D NOP Пустая команда.

Подпрограмма преобразования:

0114 AB 30 ADD #$30 Добавить значение кода символа "0" для представления цифр.

0116 A1 3A CMP #$3A Сравнить со значением, соответствующим буквам A-F.

0118 25 02 BCS $011C Если меньше, то пропустить следующую команду.

011A ADD #$07 Получаем код символа, соответствующий буквам A-F (коды $41..$46).

011С F7 STA , X Сохранить в ячейке с указанным индексом.

011D 89 RTS Возврат из подпрограммы.

Список тестов:

Значение в ячейке $50

Результат в ячейке $51

Результат в ячейке $52

Символьное представление содержимого памяти с адресами $50-$5F

$00

$30

$30

x00xxxxx

$3F

$33

$46

x3Fxxxxx

$A5

$41

$35

xA5xxxxx

$BF

$42

$46

xBFxxxxx

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