Сборка x86 - как идентифицировать регистр для регистрации инструкций
Я пытаюсь идентифицировать все регистры, чтобы зарегистрировать инструкцию в заданном распущенном списке инструкций..
Я использую Capstone в качестве двигателя дизассемблера.
Изучив "Руководство разработчика программного обеспечения для архитектуры Intel® 64 и IA-32", я обнаружил, что мне нужно посмотреть на биты MOD в байте MOD\RM, и если его значение равно 11b, то инструкция находится между двумя регистрами.
это работало нормально, пока я не наткнулся на следующие инструкции (в шестнадцатеричном формате)
1) 81 EC 24 06 00 00
2) 83 C4 30
в соответствии с Capstone ( http://www.cenigma.org/4AM3UGY):
1) sub esp, 0x624
2) add esp, 0x30
в первой инструкции MOD\RM='EC' (11101100b), поэтому MOD=11b во второй инструкции MOD\RM='C4' (11000100b), поэтому снова MOD=11b
и то и другое не регистрируется для регистрации!
что мне не хватает? есть ли что-то большее, чем просто биты MOD?
Спасибо!
1 ответ
Из руководства Intel:
Если инструкция не требует второго операнда [регистр / память], то поле Reg/Opcode может использоваться как расширение кода операции. Это использование представлено шестой строкой в таблицах (с пометкой "/ цифра (код операции)").
Если мы тогда посмотрим EC
из первого примера вашего примера в соответствующей таблице мы видим, что он может соответствовать случаю, когда вы используете ESP/SP/AHMM4/XMM4
без какого-либо дополнительного регистра / операнда памяти. В этом случае должно быть /5
в описании инструкции.
И направляюсь к описанию SUB
в том же руководстве мы видим это:
81 /5 id SUB r/m32, imm32
Итак, мы получили вычитание 32-битного непосредственного из 32-битного регистра, который является одним из ESP/SP/AHMM4/XMM4
(и, конечно, из тех, ESP
это единственный 32-битный регистр).
См. 2.1.5 Кодирование в режиме адресации байтов ModR/M и SIB в руководстве Intel для получения дополнительной информации.