- •2.4. Машинный язык и язык Ассемблера
- •2.5. Синаксис языка Ассемблера
- •2.6. Принципы работы Ассемблера
- •2.7. Биты, байты и слова
- •2.8. Нумерация бит
- •2.9. Набор символов
- •2.10. Принципы работы компьютера
- •2.11. Процедуры
- •2.12. Стек
- •2.13. Прерывания
- •3.1. Модель программирования 8088
- •3.2. Регистры общего назначения
- •3.3. Регистры адресации
- •3.4. Прямая адресация
- •3.5. Вычисление адресов
- •3.6. Адресация через базу и смещение
- •3.8. Байт mod r-m
- •3.9 Физическая адресация
- •3.10. Сегментные регистры
- •3.11. Предназначение сегментов
- •3.12. Оператор Segment
- •3.13. Оператор Assume
- •3.14. Управляющие рагистры
- •3.14.1. Указатель инструкций (ip)
- •3.14.2. Указатель стека
- •3.14.3. Регистр флагов
- •3.14.4. Флаг знака
- •3.14.5. Флаг нуля
- •3.14.6. Флаг четности
- •3.14.7. Флаг переноса
- •3.14.8. Дополнительный флаг переноса
- •3.14.9. Флаг переполнения
- •3.14.10. Флаг захвата
- •3.15. Векторы прерываний
- •Глава 4 - Набор команд микропроцессора 8088
- •4.1. Пересылка данных
- •4.1.1. Команда пересылки
- •4.1.2. Команда замены
- •4.1.3. Команды ввода и вывода
- •4.1.4. Загрузка исполнительного адреса
- •4.1.5. Загрузка указателя
- •4.1.6. Пересылка флагов
- •4.1.7. Перекодировка
- •4.2. Операции со стеком
- •4.3. Передача параметров
4.1.2. Команда замены
Команда замены XCHG просто меняет местами содержимое двух ячеек. Эта команда может поменять местами содержимое двух регистров, или регистра и памяти. При этом в качестве операндов не могут использоваться сегментные регистры.
Команда XCHG заменяет три команды пересылки и не требует промежуточной ячейки памяти. Если бы команда замены не существовола, программе потребовалось бы три пересылки, чтобы обменять значения в регистре AX и в регистре BX. Сначала она должна была бы переслать содержимое регистра AX в рабочую ячейку, затем переслать содержимое регистра BX в регистр AX, и наконец, переслать содержимое рабочей ячейки в регистр BX. Команда XCHG одна выполняет эту операцию.
4.1.3. Команды ввода и вывода
Для выполнения операций ввода и вывода микропроцессор 8088 имеет команды IN и OUT соответственно. Каждое устройство ввода-вывода IBM PC имеет один или больше встроенных регистров, с которыми могут работать эти команды. Каждое устройство ввода-вывода имеет адрес для каждого регистра в устройстве. Это адресное пространство отличается от адресного пространтва памяти; всего существует 256, или 65536 адресов ввода-вывода, доступных микропроцессору 8088. В IBM PC - 512 из этих адресов назначены системному каналу ввода-вывода и могут использоваться различными адаптерами. Другие 256 адресов используются на системной плате для управления подключенными туда устройствами ввода-вывода.
Команда IN пересылает данные из устройства ввода-вывода в регистр AL. Эта команда может указать адрес устройства ввода-вывода двумя различными способами. Если адрес устройства находится в пределах 0 - 255, он может содержаться в команде как непосредственное значение. Если адрес больше 255, команда сообщает это косвенно. В случае косвенной команды адрес устройства ввода-вывода содержится в регистре DX. Регистр DX может содержать адреса всех устройств ввода-вывода, включая те, номера которых меньше 256.
Аналогично работает команда OUT, за исключением того, что она записывает регистр AL в регистр устройства ввода-вывода. Адреса в команде OUT указываются так же, как и в команде IN.
Команды IN и OUT также могут пересылать слова в устройства ввода-вывода и из них. В случае работы со словами источником и приемником является регистр AX. Так как у микропроцессора 8088однобайтовая внешняя шина, устройства ввода-вывода IBM PC работают только с байтами при любых операциях ввода-вывода. Это означает, что операции ввода-вывода слов не используются в персональной ЭВМ. Однако пословные операции ввода-вывода имеют смысл в системе с микропроцессором 8086, который имеет тот же набор команд.
4.1.4. Загрузка исполнительного адреса
Команда загрузки действительного адреса LEA очень похожа на команду MOV. Но вместо пересылки данных из ячейки памяти в регистр команда LEA загружает в регистр адрес двнных. Так как набор команд микропроцессора 8088 разрешает иметь в команде только один адрес памяти, в качестве приемника результата всегда указывается регистр. Команда LEA может ссылаться на операнд источника с помощью любого типа адресации, который можно указать байтом mod=r/m.
Во многих случаях команда LEA идентична команде MOV с непосредственным операндом. Команды
MOV BX, OFFSET EXWORD LEA BX, EXWORD
делают одно и то же. Первая команда - это непосредственнаяпересылка, которая использует смещение переменной EXWORD. Оператор OFFSET говорит ассемблеру о том, что в регистр BX надо загрузить смещение адресного значения (все адресные значения имеют две части - сегмент и смещение) переменной EXWORD. Команда LEA вычисляет действительный адрес переменной EXWORD и помещает его в регистр BX. В этом случае команды выполняют одинаковые действия.
Но если бы программа загружала в регистр BX адрес десятого байта массива, на который указывает регистр DI, команда LEA выглядела бы следующим образом
LEA BX, 10[DI]
Микропроцессор выполнил бы вычисление адреса, используя информацию из байта mod=r/m в точности, как в случае команды MOV. Затем он поместил бы вычисленное смещение, а не данные, по этому адресу в регистр BX. Аналогичной команде с непосредственнымоперандом MOV, которая могла бы выполнять ту же функцию, нет. У ассемблера здесь нет способа определения непосредственного значения, так как адрес неизвестен во время ассемблирования.