#assembly #encoding #x86
#сборка #кодирование #x86
Вопрос:
Как закодировать инструкцию рядом с абсолютным косвенным вызовом?
call r/m32
Его код операции — FF / 2, и я знаю, что означает / 2, но как это влияет на кодировку в двоичной форме? Означает ли это, что мы устанавливаем второй бит равным 1 в байте ModR / M? Кто-нибудь может дать мне полный пример того, как кодировать почти косвенный вызов, пожалуйста?
Комментарии:
1. Второй бит поля reg, да. Это не второй бит modrm, скорее, это 5-й.
2. @Jester Хм, хорошо. Большое вам спасибо.
Ответ №1:
call [0x12345678]
- код операции = 0xFF
- mod = 00b, reg = 010b, rm = 101b, так что modrm = 0x15
- disp32 = 0x12345678
Таким образом, FF 15 78 56 34 12
Ответ №2:
/2 означает, что байт ModR/m использует только поля mod и r/m. Инструкция имеет только один операнд. Это 32-битное значение смещения. Следовательно, mod = 00 и r/m = 101 (режим только смещения), а поле reg байта ModR/m равно двоичной форме 2 в обозначении /2 (reg = 010).
|| Mod || Reg || R/M ||
|| 00 || 010 || 101 || = 15H