Таблицы представляют некоторые наборы неизменяемых данных. В ряде ситуций таблицы позволяют ускорить выполнение программы, хотя за хранение самой таблицы приедется пожертвовать небольшим количеством дополнительной памяти. А архитектура 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.