- •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 ................
- •Контрольные вопросы.
- •Задания.
2.3.Примеры использования команд сдвига.
Все команды сдвига сдвигают содержимое либо одного из регистров, либо одной из первых 511 ячеек памяти.
Команды логического (или последовательного) сдвига.
Команда LSL (Logical Shift Left) сдвигает содержимое своего операнда на 1 бит влево: старший (7) бит принимает значение 6-го, 6 бит - 5-го и т.д. 1 бит принимает значение младшего (0-го). Начальное содержимое старшего (7) бита копируется во флагCрегистраCC, а младший (0) бит сбрасывается-принимает значение 0. КомандаLSR (Logical Shift Right) выполняет аналогичный сдвиг вправо. Соответственно старший (7) бит принимает значение 0, а начальное значение младшего (0-го) бита копируется во флагCрегистраCC.
Примечание: далее будем использовать более точный по смыслу термин "последовательный сдвиг".
Пример использования команд последовательного сдвига.Ниже мы рассмотрим программу, которая с помощью команд последовательного сдвига обменивает содержимое младшей и старшей тетрад содержимого ячейки $50. При этом в ячейки $51 и $52 помещаются промежуточные результаты-байты с новыми значениями младшей и старшей тетрад соответственно, а в ячейку $53 -требуемое значение. Программу желательно выполнять в пошаговом режиме, обращая внимание на состояние флагов после каждой команды сдвига.
0100 B6 50 LDA $50 Загрузить начальное значение.
0102 44 LSRA Сдвинуть его вправо четыре
0103 44 LSRA раза-тем самым сдвинув
0104 44 LSRA старшую тераду на место
0105 44 LSRA младшей.
0106 B7 51 STA $51 Сохранить промежуточное значение
в ячейке $51.
0108 B6 50 LDA $50 Еще раз загрузить начальное значение.
010A 48 LSLA Сдвинуть его влево четыре
010B 48 LSLA раза-тем самым сдвинув
010C 48 LSLA младшую тетраду на место
010D 48 LSLA старшей.
010E B7 52 STA $52 Сохранить еще одно промежуточное
значение в ячейке $52.
0110 BA 51 ORA $51 Логически сложить два промежуточных
значения.
0112 B7 53 STA $53 Сохранить окончательный результат
по адресу $53.
Список тестов:
-
Значение в ячейке $50
Значение в ячейке $51
Значение в ячейке $52
Результат в ячейке $53
$A5
(10100101B)
$0A
(00001010B)
$50
(01010000B)
$5A
(01011010B)
$1E
(00011110B)
$01
(00000001B)
$E0
(11100000B)
$E1
(11100001B)
$92
(10010010B)
$09
(00001001B)
$20
(00100000B)
$29
(00101001B)
$20
(00100000B)
$02
(00000010B)
$00
(00000000B)
$02
(00000010B)
Команды арифметического сдвига.
Команда ASL (Arithmetic Shift Left) как по своему действию, так и по откомпилированным кодам команд представляет собой то же самое, что и командаLSL. То естьASLиLSL-это две различные мнемоники для одной и той же операции. В отличие от этого, командаASR (Arithmetic Shift Right)не является полным аналогом командыLSR. Единственное, но существенное различие заключается в том, что старший (7) бит не сбрасывается, а сохраняет то значение, которое он имел до выполнения операции. Это позволяет, в частности, корректно работать с числами в дополнительном коде с сохранением знака, например выполнять деление на 2 сдвигом вправо.
Примечание: вследствие того, что командыASL и LSLимеют одинаковый код, дизассемблер всегда интерпретирует этот код исключительно как команду LSL.
Пример для команды ASR. Этот пример лишь наглядно иллюстрирует, каким образом выполняется арифметический сдвиг по сравнению с последовательным. Число, записанное в ячейке $50, сдвигается вправо (то есть делится на 2) командой последовательного сдвига и результат помещается в ячейку $51. Потом тоже самое повторяется, но до операции сдвига и после нее у числа меняется знак, а результат заносится по адресу $52. И, наконец, эти же действия повторяются, но уже c использованием команды арифметического сдвига, а получившееся число заносится в ячейку $53. Для корректной работы программы в качестве исходного значения необходимо использовать только положительные числа (с нулем в старшем (7) бите, или меньшими $80). Если сравнивать результаты, то будет видно, что правильные результаты будут получены при использовании командыLSR(адрес$0102) для сдвига положительного числа или командыASR для сдвига отрицательного числа (адрес$0108), тогда как командаLSR(адрес$010F) при сдвиге отрицательного числа дает совершенно неверный результат.
Примечание: результатом того, что округление числа всегда идет в меньшую сторону (для отрицательного числа это даст большую по модулю величину) для нечетного числа в ячейке $50 результат по адресу $53 будет на единицу больше, чем в ячейке $51, тогда как настоящее значение, которое получается после деления на 2, будет равняться их среднему арифметическому.
0100 B6 50 LDA $50 Загрузить первоначальное значение из ячейки $50.
0102 44 LSRA Разделить его на 2.
0103 B7 51 STA $51 Сохранить результат по адресу $51.
0105 B6 50 LDA $50 Еще раз загрузить первоначальное значение из ячейки $50.
0107 40 NEGA Изменить знак.
0108 44 LSRA Разделить на 2 без учета знака.
0109 40 NEGA Снова изменить знак.
010A B7 52 STA $52 Сохранить результат по адресу $52.
010C B6 50 LDA $50 И еще раз загрузить первоначальное значение из ячейки $50.
010E 40 NEGA Изменить знак.
010F 47 ASRA Разделить на 2 с учетом знака.
0110 40 NEGA Опять изменить знак.
0111 B7 53 STA $53 Сохранить результат по адресу $53.
Список тестов:
-
Значение в ячейке $50
Значение в ячейке $51
Значение в ячейке $52
Результат в ячейке $53
$24
$12
$92
$12
$25
$12
$93
$13
$78
$3C
$BC
$3C
$12
$09
$89
$09