У меня следующая разборка:
[назначение] = d5 cd e8 ca 68
movzx eax, [ebp+dest]
# value of edx at this point is: F7FBB898
movsx edx, al
# value of edx after this is: FFFFFFD5
# [ebp+var_E] stores 0
movzx eax, [ebp+var_E]
movsx eax, al
# eax = 0 here
add eax, edx
# eax becomes FFFFFFD5
cmp eax, 0D5h
jnz short loc_565564E6
Я дал объяснение и последовательность действий для каждой инструкции ниже:
- Он читает байт из [dest] и сохраняет его в eax.
- Изначально значение edx: F7FBB898. После инструкции movsx edx, al она становится FFFFFFD5. Как я могу убедиться, что в этот момент значение edx будет равно 0x000000d5?
Каким должно быть мое начальное значение в [dest], чтобы после этой операции конечное значение в eax было 0xd5, а не 0xFFFFFFD5
movzx eax, [ebp+dest]
, неоднозначна: она не определяет размер источника памяти, поэтому она может быть расширением нулями байта или слова в EAX. И поскольку EAX затирается в следующей инструкции, совершенно бессмысленно сначала расширять нули в EAX, прежде чем расширять младший байт по знаку в EDX.movsx edx, byte [ebp+dest]
/movsx eax, byte [ebp+var_E]
будут точно эквивалентны первым 4 инструкциям. Вероятно, это сгенерированный компилятором код без оптимизации или с минимальной оптимизацией, что приводит к такому коду, как этот. - person Peter Cordes   schedule 02.04.2019