1) Чем xlat отличается от xlatb 2) кроме ebx можно ли использовать другие регистры или выражения? например, откомпилил xlat [esi] хотя код и работу не проверял. 3) нужно заменить по очереди четыре байта в eax Есть ли что нибудь лучше, чем тупо вызывать xlat 4-ре раза? SIMD может помочь в векторизации-ускорении xlat? или только тупо xlat mov cl,al mov al,ah xlat mov ch,al .... и того 4-ре xlat и еще куча пересылок байтов... может быть есть какой-нибудь rep? 4) как лучше всего заменить все 4-байта в eax по байтовой таблице?
persicum ничем xlat не требует аргументов, любой аргумент игнорируется компилятором и это не более чем комментарий. Некоторые ассемблеры (напр. nasm) генерируют синтаксическую ошибку в данном случае. p.s. Если волнует оптимизация по скорости, то я бы использовал mov вместо xlat. Еще, xlat не спаривается никогда.
я думаю, вряд ли можно придумать что-то лучшее, чем последовательная замена байтов по одному. p.s. не могу не добавить к что такой инстркукции нет. Адрес таблицы xlat всегда берет из (e)bx
Кажется, немного подразобрался... Это 16-битный xlat берет данные только с адреса bx, а 32-битный xlat может брать откуда хошь [выражение]. У меня компилятор вообще xlat не отрабатывает, а только xlat [ebx] Может правильнее xlatb писать - не пробовал. Во всех учебниках полная путаница... Ага волнует, но xlat может последовательно отработать регистр только в пространстве регистров (кусок кода я приводил), а "эмуляции" будут с памятью работать... А что такое спаривается?
persicum нет. xlat берет адрес таблицы в 16-битном режиме всегда из bx, а в 32-битном всегда из ebx (если нет префикса 0x67). Я уже говорил (#2), что любой аргумент xlat'а либо игнорируется компилятором (напр. masm), либо вызывает синтаксическую ошибку (напр. nasm). да, некоторые компиляторы немного различают xlat и xlatb, xlat предполагает наличие фиктивного аргумента, xlatb - нет. Хотя в конечном итоге в обоих случах команда скомпилируется в один байт 0xD7. в Зубкове очень хорошо описано и про xlat, и про xlatb и про фиктивный аргумент. xlat тоже работает с памятью, неявно. советую почитать статью Агнера Фога (www.agner.org) по оптимизации, там все подробно расписано, что это и для чего. Здесь, на васме, даже перевод лежит.
Проверил, похоже что так оно и есть. Больше всего меня прикалывает, что xlat требует фиктивный адрес, причем требует чтобы потом его проигнорировать!!! Нужно было принять очевидное, чтобы синтаксис допускал только конструкцию xlat [ebx] и не было бы такого бардака и предупреждений об особенности команды xlat. Авторы пишут всюду, не забудьте типа загрузить таблицу в ebx а уж потом пишите xlat [таблица]. Бред какойто, как будто инициализация не требуется для любых задач и переменных... Меня интересует возможность векторизации кода, фрагмент которого производит замену по таблице. Стало быть, есть есть замена байт по таблице то быстодействие всегда будет "8-битное"? И никакие SIMD и регистры на 128-бит не помогут? В случае графических вычислений там хитрее можно типа вращать квадратные регистры. Хотя в SSE2 есть всякие там SHUFD...
persicum используй xlatb имхо, правильней всего поступает nasm: xlat и xlatb синонимы, без аргументов (иначе будет синтаксическая ошибка)
persicum Ес-но, т.к. SIMD работают только с непрерывными блоками памяти, а тебе нужно "надергать" 4 байта по разным адресам