Вот описание кода сборки, отправленного вами:
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.
Надеюсь, это поможет вам лучше понять код на ассемблере.