2014-11-26 3 views
-1

Если я шаг через отладчик в OllyDbg я вижуЧто делает MOV EAX, DWORD PTR DS: [ESI + EBP * 8]?

MOV EAX, DWORD PTR DS: [ESI + EBP * 8]

и регистр ESI = 0040855C и EBP = 00000000.

Мои проблема в том, я не знаю 2 регистра * 8

+0

Не знаете, что вас смущает. Он просто загружает dword из памяти по адресу 'esi + ebp * 8', что, конечно,' 0040855C', так как 'ebp' равно нулю. (Умножение имеет приоритет, как вы могли бы помнить из школы.) – Jester

ответ

2

MOV EAX, DWORD PTR DS: [ESI + EBP * 8]

MOV - перемещение

EAX - в EAX (как правило, это будет значение, которое вы только что рассчитывали)

DWORD PTR - от значения, на который указывает

[DS: - в сегменте данных]

[ESI + EBP * 8] - ESI плюс 8 раз EBP.

Переместить значение в EAX в адрес, на который указывает ESI + EBP * 8 (ESI плюс 8 раз EBP, это означает, как именно это написано)

Это, вероятно, используется для загрузки данных из массива, где 8 - увеличить счетчик (который является EBP) до размера хранимой вещи (8 байтов), а ESI содержит адрес начала массива. Таким образом, если ЕВР равен нулю, то хранить данные в ESI + 0, если EBP = 1, то в конечном итоге при хранении ESI + 8 и т.д.

+0

Последний абзац вашего ответа неверен! Вы должны обменять ESI и EBP. Кроме того, обычный синтаксис INTEL определяет, что первым операндом является место назначения. (См. Мой ответ) –

+0

А, мой плохой, исправленный! Я давно не возился с сборкой Intel, и я как бы предположил базовый указатель EBP плюс индексацию ESI, потому что это более распространенный способ их использования. – cactus1

1

В обычном синтаксисе INTEL эта инструкция перемещает значение из памяти в EAX.

MOV EAX,DWORD PTR DS:[ESI+EBP*8] 

Это, как правило, используется для экстракта значение из массива.
Массив расположен в памяти в DS: ESI.
Элементы индексируются через EBP.
Шкала 8 означает, что каждый элемент имеет длину 64 бит, и эта инструкция только считывает нижнее слово.

Смежные вопросы