Assembler для начинающих


Перекодировка



Перекодировка


    Команда перекодировки 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 является весьма мощным средством
    перекодировки байтовой или символьной информации. Мощность этой
    команды делает ее редко используемой, так как возможность
    использовать ее преимущества возникает не часто. Однако помните об
    этой команде на тот случай, когда она окажется полностью
    оправданной.





Содержание раздела