Идентификация адреса для расчета insns в asm - PullRequest
1 голос
/ 06 марта 2011

Я смотрю на x86 asm и хочу попробовать прочитать его и определить ошибку в моем коде cpp и ОПТИМИЗИРОВАТЬ. Но асм имеет много накладных расходов от инструкций по вычислению адресов. И я не могу найти способ идентифицировать тех, кто вычисляет адрес, из тех, которые выполняют другие задачи. например, добавление может использоваться как для вычисления адреса mem, который будет использоваться в более позднем insn, так и для выполнения обычной операции добавления, которая доступна в моем коде.

есть ли способ сделать это легко, например, они использовали фиксированные регистры для вычисления адреса? или я должен проследить код от начала до конца?

РЕДАКТИРОВАТЬ: кажется, нет никакого четкого способа идентифицировать их. Но справедливо ли предположить, что только mov, add, sub и lea являются инструкциями для вычисления адреса? или в x86 есть что-то более сложное?

спасибо

Ответы [ 2 ]

3 голосов
/ 06 марта 2011

Нет, не совсем.Большинство регистров общего назначения и используются для всех видов расчетов.Некоторые компиляторы даже достаточно умны, чтобы использовать инструкции для вычисления адресов, такие как LEA, для вычисления других вещей.

Возможно, вам придется найти, где переменная загружена в регистр, и следовать ей оттуда.

2 голосов
/ 06 марта 2011

Вы можете проследить код от конца до начала.Например, есть инструкции, которые читают или записывают регистры в память (например, mov eax, [ebx] с использованием синтаксиса Microsoft).Когда вы видите такую ​​инструкцию, вы можете определить, какой регистр используется в качестве адреса (ebx в моем примере), затем вернуться к коду и посмотреть, как рассчитывается регистр.

Остерегайтесь "инструкции «переход» - если ваш код имеет много условного выполнения, может быть трудно «вернуться в код», и может быть проще просто «проследить код от начала до конца».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...