Поле ModR/M Byte

Тема в разделе "WASM.ASSEMBLER", создана пользователем NeuronViking, 22 май 2009.

  1. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    объясните пожалуйста занчение это поля! читаю мануал и не могу понять, не вижу для себя нормального объяснения.
    например

    BT memory, immediate = 0000 1111 : 1011 1010 : mod 100 r/m : imm8 data

    что такое mod?
    что такое r/m?
    что такое imm8?

    data - это я так понимаю дисплейсмент на данные

    из каких таблиц берутся mod, r/m и imm8? в IA-32 Vol.2 Appendix B не нашел....

    вижу таблицы значений для полей reg, w, s, eee и других, но тех о которых спрашиваю там вроде бы нет.
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Во втором томе перед описанием команд есть спец.разделы "ModR/M and SIB Bytes" и "Addressing-Mode Encoding of ModR/M and SIB Bytes" - там все расписано и табличка приведена для всех значений ModR/M
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    NeuronViking
    Пишем программу
    Код (Text):
    1. .586
    2. .model flat
    3. .code
    4. start: bt eax,7
    5.     bt a,6
    6. retn
    7. a dd 12345678h
    8.       end  start
    компилируем и смотрим через hiew32
    0000 1111 : 1011 1010 : mod 100 r/m : imm8
    bt eax,7; 0FBAE007 0000 1111 : 1011 1010 : 11 100 000 : 0000 0111
    bt dword[4000F9],6; 0FBA25F900400006 0000 1111 : 1011 1010 : 00 100 101 : 1111 1001 0000 0000 0100 0000 0000 0000 :0000 0110
    Поле Mod задаёт, что именно кодируется в Reg/Mem
    Mod | адрес
    0 |[Reg]
    1 |[Reg+8-битное смещение]
    2 |[Reg+32-битное смещение]
    3 |Reg
    В сочетании с Mod, Reg/Mem может кодировать не только регистры, но и различные режимы косвенной адресации
    Двухбитовое поле Mod вместе с трехбитовым полем Reg/Mem образует 2^5=32 режима индексирования.
    Если Mod=3 в R/M находится номер регистра.
    R/M |адрес
    000 |EAX
    001 |ECX
    010 |EDX
    011 |EBX
    100 |ESP
    101 |EBP
    110 |ESI
    111 |EDI
    Вот так интерпретируется значение поля ModR/M в режиме Mod=0.
    R/M |адрес |SIB
    000 | [EAX] |не представлен
    001 | [ECX] |не представлен
    010 | [EDX] |не представлен
    011 | [EBX] |не представлен
    100 | за байтом ModR/M следует байт SIB
    101 |[32-битное смещение]|не представлен
    110 | [ESI] |не представлен
    111 | [EDI] |не представлен
    Назначение поля Reg при этом не изменяется - в нём всегда кодируется номер регистра (либо расширение опкода). Очень хорошо описано у Aquila в Заклинании кода
     
  4. SmanxX1

    SmanxX1 Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    139
    NeuronViking
    Так в манах все достаточно хорошо все описано.

    Как написано в манах mod r/m - это байт режима адресации, содержит в себе информацию об операндах и режиме адресации.
    Например, если в команде один из операндов выбирается из памяти, то mod r/m содержит смещение, базой и индексный регистры.
    Сам байт mod r/m состоит из 3ех полей:
    1.mod - 2 бита, отвечает за способ адресации и количество байт, занимаемых в команде адресом операнда.
    Поле mod используется вместе с полем r/m, т.е. образует 32 возможных значения, 8 из которых обозначения регистров, и 24 соответствуют режимам адресации. Mikl___ Немного не верно сказал. =)
    Про возможные значения mod - лучше почитать в мане.
    2. reg - 3 бита, определяет регистр, находящийся на месте второго операнда.
    3. r/m - 3 бита, определяет регистр на месте первого операнда или же особое значение.
    Это жеж, вроде просто обозначение, что типа операнд в памяти, длиной 8 бит.
     
  5. NeuronViking

    NeuronViking New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2004
    Сообщения:
    476
    Адрес:
    где-то в Сиднее
    спасибо! буду думать =)