CodeNet / Языки программирования / Ассемблер / СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
СПРАВОЧНИК по системе программирования ТУРБО АССЕМБЛЕР 2.0
Обмен данными
-----------------------------------------------------------------
Выполнять обмен содержимого двух операндов позволяет инст-
рукция XCHG. Это предоставляет удобный способ выполнять операцию,
которая в противном случае потребовала бы трех инструкций. Напри-
мер, инструкция:
xchg ax,dx
выполняет обмен содержимого AX и DX, что эквивалентно выполнению
инструкций:
.
.
.
push ax
mov ax,dx
pop dx
.
.
.
Ввод-вывод
-----------------------------------------------------------------
До сих пор мы обсуждали перемещение данных между константа-
ми, регистрами и адресным пространством процессора 8086. Как вы
можете вспомнить, в процессоре 8086 имеется также второе, незави-
симое адресное пространство, которое называется пространством ад-
ресов ввода-вывода. В общем случае в качестве каналов управления
и обмена данными таких устройств, как дисководы, дисплейные адап-
теры, принтеры и клавиатура, могут использоваться 65536 адресов
ввода-вывода или портов.
Большинство инструкций процессора 8086, включая инструкцию
MOV, имеют доступ только к операндам в пространстве адресов памя-
ти. Обращаться к портам ввода-вывода могут только две инструкции
- IN и OUT.
Инструкция IN копирует содержимое из указанного порта вво-
да-вывода в регистр AL или AX. Адрес порта ввода-вывода, указыва-
емый в качестве источника, можно выбрать одним из двух способов.
Если адрес порта меньше 256 (100h), вы можете указать его в инст-
рукции, например:
in al,41h
Эта инструкция копирует байт из порта ввода-вывода 41h в ре-
гистр AL.
При втором способе вы можете использовать для ссылки на порт
ввода-вывода, из которого нужно выполнить чтение, регистр DX:
.
.
.
mov dx,41h
in al,dx
.
.
.
Для чего регистр DX используется в качестве указателя порта
ввода-вывода? Во-первых, если адрес порта ввода-вывода превышает
255, вы должны использовать DX. Во-вторых, использование регистра
DX позволяет при адресации к портам ввода-вывода получить большую
гибкость. Например, указатель на порт ввода-вывода можно передать
подпрограмме, загрузив его в регистр DX.
Пусть вас не введет в заблуждение синтаксис инструкции IN -
регистры AL и AX являются единственно возможными операндами-при-
емниками. Аналогично, единственными допустимыми операндами-источ-
никами являются регистр DX и значение-константа, меньшая 255.
Поэтому, как бы вам этого ни хотелось, использовать инструкции
типа:
in bh,si
недопустимо.
Инструкция OUT в точности эквивалентна инструкции IN, только
операндом-источником является регистр AL или AX, а порт ввода-вы-
вода, на который указывает регистр DX или постоянное значение,
меньшее 256, является операндом-приемником. Например, следующие
инструкции устанавливают порт ввода-вывода 3B4h в значение 0Fh:
.
.
.
mov dx,3b4h
mov al,0fh
out dx,al
.
.
.
Операции
-----------------------------------------------------------------
Перемещение данных - это, конечно, важная функция, поскольку
компьютер тратит существенную часть своего времени на перемещение
данных из одного места в другое. Однако в равной степени важно
иметь возможность манипулировать данными, выполняя над ними ариф-
метические и логические операции. Поэтому далее мы рассмотрим
арифметические и логические операции, поддерживаемые процессором
8086.
Арифметические операции
-----------------------------------------------------------------
Даже если ваш компьютер РС и не тратит все время на работу с
числами и вычислительные операции, вы знаете, что он может это
сделать, если вам это потребуется. Кроме того, на компьютере РС
может работать множество электронных таблиц, программ баз данных
и инженерных пакетов. Если принять все это во внимание, то стано-
вится достаточно очевидным, что компьютер IBM PС должен обладать
мощными вычислительными способностями.
И это в самом деле так. Однако, хотя работающее на процессо-
ре 8086 программное обеспечение может прекрасно выполнять матема-
тические действия, сам процессор 8086 обеспечивает на удивление
простые арифметические возможности. В процессоре 8086 отсутствуют
инструкции для выполнения арифметических операций с плавающей
точкой (арифметических действий с такими числами, как 5.2 и
1.03Е17), не говоря уже о тригонометрических функциях. Эти опера-
ции выполняются арифметическим сопроцессором 8087. Это не означа-
ет, что программы, работающие на процессоре 8086, не могут выпол-
нять арифметические операции над числами с плавающей точкой. Ведь
электронные таблицы могут работать и на компьютерах РС без сопро-
цессора 8087. Однако программы процессора 8086 выполняют арифме-
тические операции над числами с плавающей точкой медленнее, с по-
мощью последовательности инструкций сдвигов, сложений и проверок,
а не с помощью одной быстро выполняющейся инструкции, как в соп-
роцессоре 8087.
Кроме того, в процессоре 8086 не предусмотрено арифметичес-
ких и логических инструкций, которые могут непосредственно рабо-
тать с операндами, размер которых превышает 16 бит.
В чем же тогда заключается встроенная поддержка арифметичес-
ких операций процессора 8086? Процессор 8086 может выполнять 8- и
16-битовое сложение, вычитание, умножение и деление чисел со зна-
ком и без знака и имеет специальные быстрые инструкции для увели-
чения и уменьшения операндов. В процессоре 8086 предусмотрена
также поддержка операций сложения и вычитания значений, превышаю-
щих 16 бит, хотя для операций с такими значениями требуется нес-
колько инструкций.
Сложение и вычитание
-----------------------------------------------------------------
Во многих примерах программ мы уже встречались с инструкция-
ми ADD (сложение) и SUB (вычитание). Их действие соответствует
названию. Инструкция ADD выполняет сложение операнда-источника
(правого операнда) с содержимым операнда-приемника и записывает
результат в операнд-приемник. Инструкция SUB делает тоже самое,
только она вычитает операнд-источник из операнда-приемника.
Например, инструкции:
.
.
.
.DATA
BaseVal DW 99
Adjust DW 10
.
.
.
.CODE
.
.
.
mov dx,[BaseVal]
add dx,11
sub dx,[Adjust]
.
.
.
сначала загружают значение, записанное в BaseVal, в регистр DX,
затем прибавляют к нему константу 11 (в результате в DX получает-
ся значение 110) и, наконец, вычитают из DX значение 10, записан-
ное в переменной Adjust. Полученное в результате значение 100
сохраняется в регистре DX.
