- •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.5. Загрузка указателя
Поскольку механизм адресации микропроцессора 8088 требует определения как сегмента, так и смещения каждой переменной, желательно загрузить всю эту адресную информацию единственной командой. Эту работу выполняют команды LDS и LES. Команда
LDS SI, EXDWORD
загружает регистровую пару DS:SI значениями сегмента и смещения, содержащимися в переменной EXDWORD. Команда LDS загружает в регистр SI значение смещения, расположенное по адресу EXDWORD, а в регистр DS - значение сегмента, расположенное по адресу EXDWORD+2. Команда LDS одна загружает два 16=битовых регистразначением указателя, взятого из некоторой ячейки памяти. Так как эта команда устанавливает и сегментный регистр, и регистр смещения, программа может сразу адресоваться к объекту, на который этот адрес указывает. Программа может организовать указатель из сегмента исмещения во время ассемблирования с помощью оператора DD, который порождает 32=битовое поле данных. Если операндом DD является адресное выражение, двухсловное поле будет содержать сегмент и смещение адресного значения в том же самом формате, который используется в командах LDS и LES.
Команда LES идентична LDS, за исключением того, что оназагружает регистр ES. С помощью одной команды записать значения сегмента и смещения нельзя. Программа должна записывать значение указателя двумя командами пересылки слов, а не одной командойзаписи указателя. Это приемлемо, так как программа обычно читает указатель гораздо чаще, чем записывает его. Обычно программа записывает указатель один раз, во время инициализации, и можетбыть, иногда меняет его во время смены режимов работы системы. А вот читается указатель, вероятно, достаточно часто. В последующих главах есть примеры, в которых значения указателей и читаются, изаписываются.
4.1.6. Пересылка флагов
Набор команд микропроцессора 8088 имеет команды LAHF и SAHF в первую очередь для совместимости с набором команд микропроцессора 8080. Команда LAHF берет 8 младших бит регистра флагов - а эти флаги совпадают с флагами микропроцессора 8080 - и засылает их в регистр AH. Команда SAHF действует наоборот, младший байт регистра флагов загружает из регистра AH.
Вам потребуюся эти две команды, если вы переводите программу из системы команд микропроцессора 8080 в команды микропроцессора 8088. Они необходимы, чтобы отобразить стековые операции с аккумулятором микропроцессора 8080 в стековые операции микропроцессора 8088.
4.1.7. Перекодировка
Команда перекодировки XLAT преобразует информацию из одногопредставления в другое. Команда XLAT преобразует значение в регистре AL в другое значение, выбираемое из таблицы, на которую указывает регистр BX. На Фиг.4.4 схематически показано, как работает эта команда. Регистр BX вместе с выбранным сегментным регистром определяет точку начала таблицы перекодировки в памяти. К этому адресу таблицы команда прибавляет содержимое регистра AL, значение между 0 и 255. Данные, расположенные по этому адресу, команда XLAT пересылает в регистр AL. Команда XLAT выполняет операцию просмотра таблицы.
Команду XLAT хорошо использовать при кодировании и декодировании текстовых данных. С помощью этой команды программа может организовать простую замену кодов символов. В следующем примере десять символов кода ASCII от 0 до 9 перекодируются в целях передачи. Этот метод может использоваться в системе дляперекодировки информации, передаваемой из одной машины в другую. Когда данные принимаются, другая программа возвращает закодированные символы к их первоначальному виду. На Фиг. 4.5 демонстрируется кодировка и декодировка.
На Фиг.4.5 изображены две таблицы перекодировки, одна для передачи, а другая для приема. Чтобы передать значение 5, программа находит значение 5 в таблице передачи (а), из которой извлекает значение 6, которое передает. Когда это значение принимается, программа декодирования ищет 6 в таблице приема (b), чтобы перекодировать его в истинное значение 5.
На Фиг. 4.6 показана подпрограмма, которая производит это декодирование. Подпрограмма перекодирования читает начальное значение из порта ввода-вывода, и возвращает кодированное или декодированное значение в вызывающую программу через регистр AL. Одна и та же программа выполняет как кодирование, так и декодирование, меняя таблицы кодировки.
С начала подпрограмма читает данные из вводного порта 40H в регистр AL. Затем она вычитает значение "0" в коде ASCII из значения данных, чтобы получить цифровое значение. Это означает, что символ "0" дает значение 0 в регистре AL, символ "1" дает 1, и т.д. Команда LDS загружает указатель нужной таблицы в пару регистров DS:BX. Загружая этот указатель из ячейки памяти - в
Microsoft (R) Macro Assembler Version 5.00 1/1/80 04:00:38
Фиг. 4.6 Пример перекодировки Page 1-1
PAGE ,132
TITLE Фиг. 4.6 Пример перекодировки
0000 CODE SEGMENT
ASSUME CS:CODE, DS:CODE
; Эта программа вводит значение из порта 040H и
; декодирует его, используя таблицу перекодировки.
; Так как одна и та же программа используется как для
; кодировки, так и декодировки, указатель TABLE_POINTER
; указывает на соответсвующую таблицу перекодировки.
; Вызывая подпрограмму, необходимо установить
; этот указатель на соответствующую таблицу.
0000 TRANSLATE PROC NEAR ; Подпрограмма TRANSLATE
0000 E4 40 IN AL,040H ; Ввод значения из порта
0002 2C 30 SUB AL,"0" ; Значение относительно символа 0,
; т.е. относительно начала таблицы
0004 C5 1E 000A R LDS BX,TABLE_POINTER ; (DS,BX) указывает на таблицу
0008 D7 XLAT XMIT_TABLE ; Перекодировка числа
0009 C3 RET
000A 000E ---- R TABLE_POINTER DD XMIT_TABLE
000E 35 37 39 31 33 36 38 XMIT_TABLE DB '5791368024'
30 32 34
0018 37 33 38 34 39 30 35 RECV_TABLE DB '7384905162'
31 36 32
0022 TRANSLATE ENDP
0022 CODE ENDS
END
Фиг. 4.6 Пример перекодировки
примере TABLE_POINTER - подпрограмма может использовать любую таблицу перекодировки. В этой программе имеются две табдицы, одна из них для передачи, названная XMIT_TABLE, которая соответствует Фиг.4.5(а), другая - таблица приема, названная RECV_TABLE, - соответствует Фиг.4.5(б). Перед вызовом подпрограммы головная программа должна записать нужный адресный указатель в переменную TABLE_POINTER. Если головная программа принимает коды, она должна поместить адрес таблицы RECV_TABLE в переменную TABLE_POINTER. Заметим, что эта подпрограмма может проделать любую перекодировку, поскольку таблицу перекодировки назначает вызывающая программа.
Команда XLAT выполняет перекодировку по таблице, на которую указывает пара регистров DS:BX. В регистре AL находится значение между 0 и 9. Команда XLAT складывает это значение с содержимым указателя и загружает перекодированное значение в регистр AL. Команда RET возвращает управление в вызывающую программу. Другим обычным случаем использования команды XLAT является смена кода представления символов в одной машине на код представления в другой машине. IBM PC, работает в коде ASCII, а большинство машин фирмы IBM используют код EBCDIC (Extended Binary=Coded=Decimal Interchange Code - расширенный двоично=кодированный десятичный код обмена информации). Чтобы связываться с такими машинами, в программе надо перекодировать символы, и команда XLAT естественным образом подходит для этой функции.
Итак, команда XLAT является весьма мощным средством перекодировки байтовой или символьной информации. Мощность этой команды делает ее редко используемой, так как возможность использовать ее преимущества возникает не часто. Однако помните об этой команде на тот случай, когда она окажется полностью оправданной.