что eax имеет после mov eax, dword ptr [edi] - PullRequest
1 голос
/ 11 января 2012

У меня есть следующий код сборки на Windows, и я хочу убедиться, что я правильно понимаю. edi содержит некоторый адрес, т.е. 0x6090F454

В этом случае, что должно eax иметь после первой mov инструкции?

775672f3  mov eax,dword ptr [edi]

775672f5  mov dword ptr [ebp-50h],0 
775672fc  mov dword ptr [ebp-48h],0 

77567303  cmp eax,0FFFFFFFFh 

Мне кажется, что eax должно иметь значение, но я не уверен в этом. К вашему сведению, код C ++ для вышеуказанной сборки

if (sem->num != INVALID_FLAG) {
    ....
}

Кроме того, вот что хранится в edi.

0:024> dd edi
6090f454  0c0e8fe0 ffffffff 00000000 00000000

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 11 января 2012

Строка:

mov eax,dword ptr [edi]

просто загрузит все, что хранится по адресу edi.Так что это простая загрузка данных.

Поскольку вы не показываете, что находится по адресу edi (0x6090F434), мы не можем точно сказать, что будет eax.1011 * Исходя из приведенного кода C ++, похоже, что edi является адресом поля num.Таким образом, он читает num в регистр, а затем сравнивает его с 0xFFFFFFFF, который является INVALID_FLAG константой.

2 голосов
/ 11 января 2012

EAX будет содержать 32-битное значение в 0x6090F434, предполагая, что адрес «существует», т. Е. Память назначена вашему процессу по этому адресу.

Что кажется очевидным, поэтому мне интересно, действительно ли этохочешь знать?

1 голос
/ 02 февраля 2012

Вот описание кода сборки, отправленного вами:

mov eax,dword ptr [edi] 

Переместите значение, хранящееся по адресу памяти, содержащемуся в регистре edi, в регистр eax.

Ваш вывод windbgдля регистра edi показывает:

6090f454 0c0e8fe0 ffffffff 00000000 00000000

Первое значение здесь - это адрес памяти, содержащийся в регистре edi.Следующее значение 0c0e8fe0 - это слово, расположенное по этому адресу памяти.

Более простой способ понять и визуализировать это:

dword ptr [edi] =  0c0e8fe0
dword ptr [edi+4] = ffffffff
dword ptr [edi+8] = 00000000

Итак, команда dd показывает вам адрес впервый столбец и данные двойного слова в следующих 4 столбцах.

Инструкция на языке ассемблера

mov eax, dword ptr [edi] 

переместит значение 0c0e8fe0 в регистр eax.

АналогичноСледующие 2 инструкции в вашем коде языка ассемблера будут хранить значение 0 по адресу памяти, указанному ebp-50 и ebp-48 соответственно.

Обычно, [ebp-4], [ebp-8] и т. д.on, используются для ссылки на локальные переменные в программе.

Последняя инструкция,

cmp eax,0FFFFFFFFh

Сравните dword, хранящийся в регистре eax, который 0c0e8fe0 с 0FFFFFFFFh.В этом случае значения не равны, и поэтому нулевой флаг не будет установлен.

Обычно в коде языка ассемблера после команды cmp следует условный переход, который проверяет состояние флага.

Таким образом, вы можете использовать инструкцию jz или jnz, следуя инструкции cmp.

Надеюсь, это поможет вам лучше понять код на ассемблере.

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