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

После выполнения программы: DX=7FFO.

6 Арифметико-логические команды

По назначению арифметико-логические команды (команды АЛУ) разделяются на две группы:

а) арифметические; б) логические.

По кодам операции они разделяются на (2 типа x 8 видов) =

16 команд. Схемы выполнения 2-х типов команд АЛУ приведены на

рисунке 7.

Рисунок 7 — Схема выполнения команд АЛУ

Рассмотрим обобщенные КОПы для этих типов команд АЛУ. а) 1-й тип: машинный код команд АЛУ для команд типа: dst:=<dst> операция <src>.

б) 2-й тип: машинный код команд АЛУ с непосредственными данными (вместо src указывают данные в качестве второго числа): dst:=<dst> операция data.

Здесь в разряде D9 указывают знаковый признак данных.

1)Если S=0, то data — беззнаковый операнд, и длина его соответствует: при W=0 —байт; при W=1 — слово.

2)Если S=1, то:

а) data длиной только в 1 байт;

б) D7 —знак; число воспринимается в дополнительном коде;

в) если dst — слово, то data расширяется до слова (знак переносится в D15).

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

В таблице 5 представлены команды в ассемблере и комментарии для всех типов команд. Коды типов команд приводятся не по порядку, а по смыслу, связанному с назначением групп родственных команд. Все команды АЛУ, приведенные в таблице 5, воздействуют на флаги.

Таблица 5 —Команды АЛУ

Вид

Ассембле

Комментарий для команд АЛУ, содержащих:

п/п

команд

р

а) dst и src (тип 1)

б) dst и data (тип2)

 

ы

 

 

 

1

000

ADD

dst:=<dst>+<src>

dst:=<dst>+data

2

010

ADC

dst:=<dst>+<src>+<cf>

dst:=<dst>+data+<cf>

3

101

SUB

dst:=<dst>-<src>

dst:=<dst>-data

4

011

SBB

dst:=<dst>-<src>-<cf>

dst:=<dst>-data-<cf>

5

001

OR

dst:=<dst> <src>

dst:=<dst> data

(дизъюнкция —ИЛИ)

 

 

 

6

100

AND

dst:=<dst> <src>

dst:=<dst> data

(конъюнкция —И)

 

 

 

7

110

XOR

dst:=<dst>+<src>

dst:=<dst>+data

(сложение по модулю 2)

 

 

 

8

111

CMP

<dst>-<src>

<dst>-data

(компарация — сравнение)

 

 

 

Рассмотрим команды АЛУ в порядке номеров пунктов таблицы 5.

6.1 Команды сложения

а) Сложение содержимым dst и src; результат — в dst.

Ассемблер с комментариями (примеры):

ADD AX,BX ; AX:=<AX>+<BX>

ADD SI,[1CDO] ; SI:=<SI>+<M1СD0>

в) Сложение содержимого dst и данных, указанных в команде. Ассемблер c комментариями (примеры):

39

ADD CX,1350

; CX:=<CX>+1350

ADD

BYTE

[1500], 2F ; M1500:=<M1500>+2F

ADD

WORD

[1500],20 ; M1501,M1500:=<M1501,M1500>+(-02)

Составим машинный код последней команды, используя таблицу 5 для определения вида команды и таблицу 3 (глава 3) для определения адреса dst:

83 06 00 15 FE

КОП Адрес data

FE —это не что иное, как дополнительный код отрицательного числа: 20 (H-код). Действительно, если преобразовать -02 из прямого кода в дополнительный, то и получим FE:

 

 

S Мантисса

 

-216 = 1 0000010

 

S —место знака

 

 

 

инверсия

 

 

1

1111101

 

 

+0

0000001

 

= FE16

 

1

1111110

 

Следовательно, эту же операцию можно представить так: ADD WORD [1500],FE? Оказывается, нельзя. Поскольку не указан знак, а любой редактор ассемблера дополняет байт или слово в части старших бит нулями (то есть их можно не указывать), то в результате работы транслятора для команды ADD WORD [1500],FE получится следующий машинный код:

8306 0015 FE00

КОП Адрес data

И полный ассемблер этой команды будет таков:

ADD WORD [1500],OOFE

А это совсем другая команда.

6.2 Команда сложения с учетом переноса

Эта команда складывает не просто 2 числа, а добавляет к ним <CF>. Это замечательная команда, потому что без нее невозможно было бы достаточно просто складывать многобайтовые числа. Возьмем пример для десятичных чисел:

59

+36

85 и 1 держим в уме. Единица —это перенос: CF = 1. Естественно, что если при сложении старших чисел не учитывать

перенос от предыдущей суммы, то результат будет неверным. Чтобы 2-я сумма была корректной, необходимо ее сложить с переносом:

8

40

+<CF> от предыдущего сложения

 

 

 

9

 

 

 

 

 

 

 

Итого: 95.

 

 

 

 

 

 

Рассмотрим пример сложения многобайтовых чисел.

 

Пример

1 —

Пусть

1-ое

слагаемое

находится

в

M1501,M1500 (двухбайтовое число), а второе слагаемое — в BX. Сумму

поместить в M1601,M1600.

 

 

 

 

 

Ответ: Если складывать по байтам, то это будет выглядеть так:

 

ADD

BL,[1500]; Сложить младшие байты чисел

 

 

MOV

[1600],BL; и переслать младшую часть суммы в M1600.

 

ADC

BH,[1501]; Сложить старшие байты слагаемых и + возмож-

MOV

[1601],BH; ный перенос от предыдущей суммы и M1601.

 

6.3 Операция вычитания

Эта команда выполняется чуть сложнее, чем команда сложения.

Вотличие от сложения, операция вычитания простыми логическими средствами не реализуется. Операция вычитания производится следующим образом:

а) вычитаемое преобразуется в дополнительный код; б) дополнительный код вычитаемого складывается с

уменьшаемым.

Само собой разумеется, что все это выполняется автоматически.

Вотличие от сложения, перенос в этом случае направляется в CF через инвертор. Посмотрим на абстрактных примерах, что из этого выходит.

Пусть A —уменьшаемое, B —вычитаемое.

Случай 1: A>B. Пусть A=1000, B=0101 (двоичные числа). Преобразуем B в дополнительный код (без знака):

0101

инверсия

1010 + 0001

Bдоп=1011 — дополнительный код B. Теперь складываем: A+Bдоп:

1000

+1011

1 0011

Перенос = 1. Но этот перенос при вычитании инвертируется, и только потом попадает в CF. Значит, в этом случае CF=0. Еще раз: 10002- 01012= 00112 и CF=0. (Кстати, результат получили в прямом коде).

Случай 2: A<B. Пусть A=0101, а B=1000. По той же технологии преобразуем B:

1000

инверсия

0111

41