Доброго времени! Я участник проекта http://codeplex.com/cosmos, занимаюсь разработкой траслятора MSIL->Native. Сейчас у нас есть сделанный наполовину статический транслятор IA-32, который для генерации кода использует nasm, и зачатки JIT'а для AMD64. Ввиду специфичности проекта, в последнем нельзя воспользоваться ни одним из существующих ассемблеров x64. Соответственно нужно написать ассемблер x64. Прочтение главы Instruction Formats мануала General-Purpose and System Instructions принесло какую-то кашу в мою голову. Нет ли внятного описания форматов инструкций (желательно с примерами и/или на русском)? P.S. Понятное дело меня в основном интересуют ModRM, SIB и флаги REX префикса.
Про IA-32 на русском "Assembler. Специальный справочник" Юрова. Про amd64 на руском кроме статей ничего не находил. Лучший вариант - справочник Юрова + Intel или AMD manuals.
аквиловский цикл статей на этом сайте. про rex на русском не встречал, но как раз этот байт вроде вполне понятно описан.
обзор архитектуры есть в "The AMD x86-64™ Architecture Programmers Overview", в манулах от Intel есть таблицы опкодов.
Вот про REX префикс недавно переводил. Код (Text): 3-ий том amd. 1.2.7 Перфиксы REX. "REX - префисы" - это группа префиксных байт, которые используется только в 64-битном режиме. Через них можно обращаться к расширеным регистрам AMD64 (на рис. 1-1 на стр. 1 и рис. 1-2 на стр. 2 показано, чему соответствуют биты REX - префикса). REX - префиксы позволяют пользоваться следующими особенностям 64-битного режима: · Использование расширенных регистров общего назначения (табл. 2-3 на стр. 25) и XMM регистров (стр. 2-8 на стр. 30). · Использование 64-битных операндов, для обращения к регистрам общего назначения. · Использование расширенных регистров управления (cr0-cr15) и регистров отладки(dr0-dr15), как описано в "Расширенных Регистрах Управления в 64-бит режимаме" в Томе 2 и "Расширенные Регистры Отладки в 64-бит режимаме" в Томе 2. · Использование однобайтовых регистров (AL-R15b). В табл. 1-9 показаны REX префиксы. Их значения находится в диапазоне, 40-4Fh, в зависимости от специфической комбинации AMD64. REX - префикс обычно используется с коммандами, которые обращается к 64-бит регистру общего назначения или одному из расширенного регистра общего назначения или к регистрам XMM. Только несколько комманд не нуждаются в REX префиксе. Эти исключения перечислены в табл. 1-10. Табл. 1-10. Комманды не требующие REX - перфикса в 64-Bit режиме. CALL (Near) POP reg/mem ENTER POP reg Jcc POP FS JrCXZ POP GS JMP (Near) POPFQ LEAVE PUSH imm8 LGDT PUSH imm32 LIDT PUSH reg/mem LLDT PUSH reg LOOP PUSH FS LOOPcc PUSH GS LTR PUSHFQ MOV CR(n) RET (Near) MOV DR(n) Команда может иметь только один REX префикс, хотя префикс может выразить несколько особенностей расширения. REX префикс предшествует первому байту команды (REX->KOP). Любое использования REX префикса в команде, которая не обращается к расширенному регистру, игнорируется. Предел размера команды "15 байтов" даже вместе с REX - префиксом. Префиксы REX - могут принимать шестнадцать значений с "40" - по "4Fh". Таблица 1-11 и рис. 1-3 по стр. 15 показывает примеры использования префиксов. REX.W: "Длина Операнда". При "REX.W = 1" размер операнда 64-бит. В данном случае префикс "66h" ничего не изменяет(игнорируется).Но если "REX.W = 0",то операнд становится 16-бит. REX.R: "Регистр". Бит REX.R добавляется к полю "reg ModRM" (когда та кодирует "регистры общего назначения", XMM - регистры, регистры управления и отладки) стр. 17. REX.R не изменяет "reg ModRM",когда определяются другие регистры или коды операции (REX.R игнорируется). REX.X: "Индекс". Бит REX.X добавляется к полю "index" байта "SIB" (стр. 17). REX.B: "База". Бит REX.B добавляется к полю "r/m" байта ModRM (чтобы определить регистр общего назначения или регистр XMM),или к полю "base" байта "SIB" (чтобы определить регистр общего назначения). См. таб. 2-2 на стр. 40 для больше о бите REX.B. Примеры кодирования. На рис. 1-3 на стр. 15 четыре примеры того, как биты "R", "X", и "B" связаны с областями байтов ModRM и SIB, и кода операции. (R, X, и B, описаны в табл. 1-11 на стр. 13.) Адресация однобайтовых регистров. В архитектуре доставшейся по наследству (IA-32), однобайтовые регистры (AH, AL, BH, BL, CH, CL, DH, и DL. рис. 2-2 на стр. 24) закодированы в полях "reg" или "r/m" байта ModRM или в области "reg" кода операции, от 0 до 7. С помощю REX - префикса можно обращаться к расширенным однобайтовым регистрам AMD64 (r8b-r15b)(рис. 2-3 на стр. 25). Кодирование специальных регистров. ;!! не понял про что абзац, и не правил. Определенные комбинации в полях "ModRM" и "SIB" по особенному кодируют регистры. Для некоторых, не декодируются области команды, расширенные REX - префиксом (рассматриваются как не требующие заботы), таким образом создавая псевдонимы этих кодирований в расширенных регистрах. Табл. 1-12 на стр. 16 описывает эти случаи. Значения для INC и Команд DEC. По кодировке REX - префиксы совпадают с 16 однобайтовыми коммандами (inc eax-edi, dec eax-edi). И потому они ("inc" и "dec") недоступны в 64-бит режиме (но в режиме совместимости и наследственном они доступны). Теперь в 64-бит режиме они доступны через префикс "FFh" (inc eax-edi (ffh,C0h - ffh,C7h) dec eax-edi (ffh,C8h - ffh,Cfh)).