Сборка 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 для получения дополнительной информации.

Другие вопросы по тегам