xlat и поиск в таблицах

Последнее обновление: 02.07.2023

Таблицы представляют некоторые наборы неизменяемых данных. В ряде ситуций таблицы позволяют ускорить выполнение программы, хотя за хранение самой таблицы приедется пожертвовать небольшим количеством дополнительной памяти. А архитектура x86-64 предоставляет специальную инструкцию xlat для упрощения поиска в таблицах.

Например, возьмем программу, которая переводит символ из нижнего регистра в верхний:

.data
    character byte "b"
.code
main proc  
    xor rax, rax
    mov al, character
    cmp al, 'a'
    jb notLower
    cmp al, 'z'
    ja notLower
    and al, 5fh ; преобразуем код символа в верхний регистр
    mov character, al
notLower:
; остальная часть программы
    ret
main endp
end

В регистр AL передается код символа из переменной AL. Далее проверяем код символа - соответствует ли он диапазону для букв в нижнем регистре. Если соответствует, с помощью операции AND применяем маску 5fh, которая убирает 6-бит и тем самым преобразует символ в верхний регистр. Однако если символ изначально представляет букву в верхнем регистре или представляет не букву, а цифру или что-то еще, то переходим к метке notLower

Таблицы позволяют сократить код программы:

.data
table byte 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
    byte 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64
    byte 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96
    byte 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90
character byte "b"
.code
main proc       
    xor rax, rax
    mov al, character
    lea rbx, table
    xlat
    mov character, al
; остальная часть программы
    ret
main endp
end

Здесь таблица представлена переменной table, которая хранит коды символов ASCII. Причем, начиная с 97 байта по 123 размещены коды символов ASCII в верхнем регистре, на которые будут заменяться символы в нижнем регистре. Эти коды символов в верхнем регистре располагаются по индексам соответствующих им символов в нижнем регистре. Например, буква "a" имеет код 97. По индексу 97 в таблице располагается код символа "A" - число 65.

Для замены символов применяется инструкция xlat, которая фактически аналогична инструкции

mov al, [rbx + al * 1]

Эта инструкция использует текущее значение регистра AL в качестве индекса в массиве, базовый адрес которого находится в RBX. Она выбирает байт по этому индексу в массиве и копирует этот байт в регистр AL.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850