Информация о форматах инструкций на русском.

Тема в разделе "WASM.X64", создана пользователем LOST, 18 мар 2008.

  1. LOST

    LOST Милованов Виктор

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    2
    Адрес:
    Москва
    Доброго времени!

    Я участник проекта 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 префикса.
     
  2. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Про IA-32 на русском "Assembler. Специальный справочник" Юрова. Про amd64 на руском кроме статей ничего не находил.
    Лучший вариант - справочник Юрова + Intel или AMD manuals.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    аквиловский цикл статей на этом сайте.
    про rex на русском не встречал, но как раз этот байт вроде вполне понятно описан.
     
  4. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    обзор архитектуры есть в "The AMD x86-64™ Architecture Programmers Overview", в манулах от Intel есть таблицы опкодов.
     
  5. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Вот про REX префикс недавно переводил.

    Код (Text):
    1. 3-ий том amd.
    2. 1.2.7 Перфиксы REX.
    3.  
    4. "REX - префисы" - это группа префиксных байт, которые используется только в 64-битном режиме.
    5. Через них можно обращаться к расширеным регистрам AMD64 (на рис. 1-1 на стр. 1 и рис. 1-2 на стр.
    6. 2 показано, чему соответствуют биты REX - префикса).
    7.  REX - префиксы позволяют пользоваться следующими особенностям 64-битного режима:
    8.  
    9. · Использование расширенных регистров общего назначения (табл. 2-3 на  
    10.    стр. 25) и XMM регистров (стр. 2-8 на стр. 30).
    11. · Использование 64-битных операндов, для обращения к регистрам общего
    12.    назначения.
    13. · Использование расширенных регистров управления (cr0-cr15) и регистров отладки(dr0-dr15),
    14.   как описано в "Расширенных Регистрах Управления в 64-бит режимаме" в Томе 2 и
    15.    "Расширенные Регистры Отладки в 64-бит режимаме" в Томе 2.
    16. · Использование однобайтовых регистров (AL-R15b).
    17.  
    18. В табл. 1-9 показаны REX префиксы. Их значения находится в
    19. диапазоне, 40-4Fh, в зависимости от специфической комбинации AMD64.
    20.  
    21.  REX - префикс обычно используется с коммандами, которые обращается к 64-бит регистру
    22. общего назначения или одному из расширенного регистра общего назначения или к регистрам XMM.
    23. Только несколько комманд не нуждаются в REX префиксе. Эти исключения перечислены в табл. 1-10.
    24.  
    25. Табл.   1-10. Комманды не требующие REX - перфикса в 64-Bit режиме.
    26.       CALL (Near)          POP reg/mem
    27.       ENTER                POP reg
    28.       Jcc                  POP FS
    29.       JrCXZ                POP GS
    30.       JMP (Near)           POPFQ
    31.       LEAVE                PUSH  imm8
    32.       LGDT                 PUSH imm32
    33.       LIDT                 PUSH reg/mem
    34.       LLDT                 PUSH reg
    35.       LOOP                 PUSH FS
    36.       LOOPcc               PUSH GS
    37.       LTR                  PUSHFQ
    38.       MOV CR(n)            RET (Near)
    39.       MOV DR(n)
    40.  
    41.  Команда может иметь только один REX префикс, хотя префикс может выразить несколько особенностей расширения.
    42. REX префикс предшествует первому байту команды (REX->KOP). Любое использования REX префикса в команде,
    43. которая не обращается к расширенному регистру, игнорируется. Предел размера команды "15 байтов" даже
    44. вместе с REX - префиксом.
    45.  
    46. Префиксы REX - могут принимать шестнадцать значений с "40" - по "4Fh". Таблица 1-11 и рис. 1-3 по стр.
    47. 15 показывает примеры использования префиксов.
    48.  
    49. REX.W: "Длина Операнда".
    50.     При "REX.W = 1" размер операнда 64-бит. В данном случае префикс "66h" ничего не
    51.    изменяет(игнорируется).Но если "REX.W = 0",то операнд становится 16-бит.
    52.  
    53. REX.R: "Регистр".
    54.    Бит REX.R добавляется к полю "reg ModRM" (когда та кодирует "регистры общего назначения",
    55.    XMM - регистры, регистры управления и отладки) стр. 17. REX.R не изменяет "reg ModRM",когда определяются
    56.    другие регистры или коды операции (REX.R игнорируется).
    57.  
    58. REX.X: "Индекс".
    59.    Бит REX.X добавляется к полю "index" байта "SIB" (стр. 17).
    60.  
    61. REX.B: "База".
    62.     Бит REX.B добавляется к полю "r/m" байта ModRM (чтобы определить регистр общего назначения или
    63.    регистр XMM),или к полю "base" байта "SIB" (чтобы определить регистр общего назначения).
    64.    См. таб. 2-2 на стр. 40 для больше о бите REX.B.
    65.  
    66. Примеры кодирования.
    67.    На рис. 1-3 на стр. 15 четыре примеры того, как биты "R", "X", и "B"
    68.   связаны с областями байтов ModRM и SIB, и кода операции.
    69.   (R, X, и B, описаны в табл. 1-11 на стр. 13.)
    70.  
    71. Адресация однобайтовых регистров.
    72.    В архитектуре доставшейся по наследству (IA-32), однобайтовые регистры (AH, AL, BH, BL, CH, CL, DH, и DL.
    73.   рис. 2-2 на стр. 24) закодированы в полях "reg" или "r/m" байта ModRM  или в
    74.   области "reg" кода операции, от 0 до 7. С помощю REX - префикса можно обращаться
    75.   к расширенным однобайтовым регистрам AMD64 (r8b-r15b)(рис. 2-3 на стр. 25).
    76.  
    77. Кодирование специальных регистров. ;!! не понял про что абзац, и не правил.
    78.    Определенные комбинации в полях "ModRM" и "SIB" по особенному кодируют регистры.
    79.   Для некоторых, не декодируются области команды, расширенные REX - префиксом
    80.   (рассматриваются как не требующие заботы), таким образом создавая псевдонимы этих кодирований в
    81.   расширенных регистрах. Табл. 1-12 на стр. 16 описывает эти случаи.
    82.  
    83. Значения для INC и Команд DEC.
    84.     По кодировке REX - префиксы совпадают с 16 однобайтовыми коммандами (inc eax-edi, dec eax-edi).
    85.    И потому они ("inc" и "dec") недоступны в 64-бит режиме (но в режиме совместимости и
    86.    наследственном они доступны). Теперь в 64-бит режиме они доступны через префикс
    87.    "FFh" (inc eax-edi (ffh,C0h - ffh,C7h) dec eax-edi (ffh,C8h - ffh,Cfh)).
     
  6. LOST

    LOST Милованов Виктор

    Публикаций:
    0
    Регистрация:
    18 мар 2008
    Сообщения:
    2
    Адрес:
    Москва
    С REX'ом разобрался. Теперь нужно понять как работают SIB и ModRM в long mode.
     
  7. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    LOST
    также как и обычно, но с учёром REX
    как-же это ты с ним разобрался если это не понял?
     
  8. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    не так же
    R/M = 101 соответствует RIP-relative адресации
     
  9. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    rei3er
    да
    спасибо что поправили:)