2014-07-17 4 views
1

Я новичок в обратном проектировании и иногда смущаюсь, когда я сталкиваюсь с инструкцией LEA. Я хочу узнать, как узнать, является ли инструкция lea массивом или указателем ссылки. Многие люди говорят, что LEA инструкция используется в качестве опорной инструкцииДемонтаж с использованием Olly или IDA

Например: lea ecx, [eax] --meaning что-то вроде «Int а = & б» в C++;

И некоторые люди говорят, что он используется для загрузки содержимого регистра в другой регистр

Например: lea ecx, [eax] --meaning содержимое загружается в ECX [EAX];

, но я выбираю первый вариант. Но когда я запутался в когда я вижу что-то подобное в Olly:

lea ecx, dword ptr ss:[ecx+eax*2] 

или

lea ecx, dword ptr ds:[ecx+eax*2] 

и так далее.

Прошу пояснить смысл этих инструкций, чтобы узнать, когда это означает ссылочный указатель или массив на C++ или даже знать как (массив, так и ссылочный указатель) в olly или IDA. Я ценю заранее. Спасибо.

ответ

-2

В C/C++ доступ к указателю или массиву по существу является одним и тем же. Прямой lea ecx, [eax], скорее всего, будет разыменованием указателя, поскольку смещения нет. Что-то более сложное, как lea ecx, dword ptr ss:[ecx+eax*2], вероятно, имеет доступ к массиву, так как есть указатель базы (ecx) плюс индекс раз размер (+eax*2). Для этого нет жесткого правила.

+2

'lea' не выполняет разыменования,' mov' делает. –

+0

@IgorSkochinsky Вы делаете хороший момент. Я ошибался. Я не уверен, что точка 'lea ecx, [eax]' была бы вместо использования 'mov ecx, eax'. – rjp

+0

'lea ecx, [eax]' бессмысленно. но 'lea ecx, dword ptr ss: [ecx + eax * 2]' - это просто математика (без необходимости читать дополнительный операнд из памяти) –