Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Булатов В.Н. Архитектура микропроцессороной системы, состав машинных команд и основы программирования микропроцессорной .pdf
Скачиваний:
97
Добавлен:
02.05.2014
Размер:
7.1 Mб
Скачать

5Команды сдвигов и приращений.

5.1Команды приращений

Начнем изучение указанной группы команд с наиболее простой. Это команды приращений (команды инкремента-декремента) dst. Суть действия этих команд:

dsr:=<dsr>+1, если была команда инкремента; dst:=<dsr>-1, если была команда декремента.

Эти команды существуют для перебора адресов данных, для организации счетчиков и воздействуют своими результатами на флажки, кроме CF. То, что сохраняется CF —это сделано специально. Дело в том, что счетчики функционально реализованы как генераторы кодов двоичных чисел. Сколько, например, может быть комбинаций у двухразрядного реверсивного счетчика? 22=4. Нарисуем диаграмму его

состояний (состояния представлены в двоичном коде):

Рисунок 6

Суть этого автомата — организовать переход от одного состояния счетчика к последующему. Поэтому арифметического действия здесь нет, и переполнения быть не может, а значит и не может быть воздействия на флажок переполнения (CF). Он остается неизменным.

Втом числе, когда есть переход от 11 к 00 или наоборот.

1)Команда инкремента.

а) Ассемблер: INC dst; Комментарий: dst:=<dst>+1. б) Машинный КОП:

2) Команды декремента.

а) Ассемблер: DEC dst; Комментарий: dst:=<dst>-1. б) Машинный КОП:

34

Пример 1 — Пусть в ячейке ОЗУ с адресом 1FD5 находится значение FF. Эту ячейку необходимо обнулить.

Ответ: Составляем команду инкремента:

INC BYTE [1FD5]

После выполнения этой команды в заданной ячейке памяти: FF+1=00.

Пример 2 — Пусть в регистре CX все биты находятся в состоянии

«0», то есть <CX>=0000.

Ответ: Применим к нему команду DEC CX. После выполнения команды в CX будет FFFF, то есть все биты будут установлены в «1».

Эти примеры показывают, что при выполнении команд INC dst и DEC dst у счетчика нет крайних комбинаций, так как цикл является замкнутым.

5.2 Команды сдвига

МП 8086 реализует 8 типов сдвигов. Эти 8 типов делятся на

2группы:

1)логические сдвиги;

2)арифметические сдвиги.

Давайте сначала разберемся с характеристиками этих сдвигов.

1)Логический сдвиг. Главная его отличительная особенность – цикличность (неразрывность) сдвигаемого слова. Например:

2)Арифметический сдвиг. Главная отличительная собенность – заполнение освобождающихся при сдвиге разрядов нулями (правда, есть исключение, но об этом чуть ниже). Это необходимо, например, для умножения:

46 Х32

92

35

138*

1472

Здесь второе произведение, поскольку оно умножается на 30, сдвигаем влево на 1 десятичный разряд, а на место * мы должны поставить 0. Но так как нас этому не учили, мы его и не ставим (потому что этот ноль ничего не значит в общей сумме). Но в алгоритме арифметического сдвига этот ноль должен появляться безусловно.

Чтобы не рассматривать 8 форматов КОП команд, обобщим их в

один:

В таблице 4 приведены ассемблеры всех команд сдвига с комментариями ввиде схем. Из формата КОП следует, что появился некий новый признак

V(D9).

Таблица 4 —Команды сдвига

36

Дело в том, что МП 8086 может выполнить сдвиг на один разряд или сразу на несколько. Это определяет разряд D9 в КОП. Рассмотрим случаи для различных значений V.

а) V=0; сдвиг на 1 разряд (i=1). Обязательная форма ассемблера (примеры):

1) ROL BX,1; (содержимое BX сдвинуть циклически влево на 1 разряд);

2)SHL BYTE [1CD0],1 (содержимое ячейки ОЗУ с адресом 1CD0 сдвинуть арифметически влево на 1 разряд);

б) V=1; сдвиг на число разрядов, где число по умолчанию берется из регистра CL (i=CL). Обязательная форма ассемблера (примеры):

1)RСL AX,CL; (Содержимое AX сдвинуть циклически влево на число разрядов, где число сдвигов n=<CL>;

2)SHL WORD [1CD0],CL (содержимое слова, хранящегося в ячейках памяти M1CD1, M1CD0 , сдвинуть арифметически влево на число разрядов, где число сдвигов n=<CL>.

Сформулируем краткие характеристики к схемам (таблица 4)

выполнения команд сдвига, учитывая, что указанные схемы практически полностью отражают действия команд.

Команды 3-й и 4-й строчки отличаются от 1-й и 2-й тем, что в команде циклического сдвига появляется дополнительный разряд : CF. Это свойство позволяет, в случае необходимости, спрятать один бит слова в CF, произвести нужные операции над оставшейся частью слова

ивернуть обратным сдвигом спрятанный бит в CF на место.

Вчастности, это можно использовать при преобразовании отрицательного числа из прямого кода в дополнительный и наоборот.

Нижние четыре строчки таблицы касаются арифметических

сдвигов. Причем, тип команды: 1102 — формальный, а результаты ее выполнения — бессмысленны. А вот нижняя команда используется достаточно часто.

Из схемы следует, что тип 1112 отличается от типа 1012 тем, что вместо нулей при арифметическом сдвиге вправо освобождающиеся разряды заполняются содержимым старшего бита. А учитывая, что в старшем бите у чисел со знаком находится знак (вспомним, что «+» = 0, «-» = 1), то этот тип сдвига, сохраняя знак, сдвигает само число вправо. При этом, если число положительное, то освобождающиеся разряды заполняются нулями (после знака). А если отрицательное число, то — единицами. При преобразовании числа в прямой код эти единицы превращаются в нули.

Пример 3 — Пусть в регистре XD находятся данные OFFE. Сдвинуть арифметически это число влево на 3 разряда.

Ответ: Составляем программу в ассемблере: MOV CL, 03; Задаем в CL число сдвигов SHL DX, CL; и сдвигаем <DX> влево.

37