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.