Как знак команды MOVSX расширяет ввод в этом случае?
У меня есть следующие разборки:
[dest] = 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, все инструкции становятся FFFFFFD5. Как я могу убедиться, что значение edx будет 0x000000d5 на данный момент?
Каким должно быть мое начальное значение в [dest], чтобы после этих операций конечное значение в eax было 0xd5, а не 0xFFFFFFD5
1 ответ
Решение
Вы должны использовать movzx
(Двигаться с нулевым расширением) вместо movsx
(Перемещение со знаком расширения), если вы хотите расширить значение нулями, не глядя на его знак.
Когда вы используете movsx
двигаться 0xd5
в edx
, он будет копировать младшие байты в edx
и заполните оставшееся MSB скопированного значения (0xd5
знак равно 0b11010101
MSB равен 1), что заполняет 6 оставшихся байтов 0xFFFFFF
, С movzx
остальные байты заполнены 0x000000
независимо от MSB.