объясните пожалуйста занчение это поля! читаю мануал и не могу понять, не вижу для себя нормального объяснения. например 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 и других, но тех о которых спрашиваю там вроде бы нет.
Во втором томе перед описанием команд есть спец.разделы "ModR/M and SIB Bytes" и "Addressing-Mode Encoding of ModR/M and SIB Bytes" - там все расписано и табличка приведена для всех значений ModR/M
NeuronViking Пишем программу Code (Text): .586 .model flat .code start: bt eax,7 bt a,6 retn a dd 12345678h 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 в Заклинании кода
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 бит.