Кодирование инструкций вызова сборки x86

#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