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

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

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