Как знак команды MOVSX расширяет ввод в этом случае? - PullRequest
0 голосов
/ 02 апреля 2019

У меня следующая разборка:

[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

Я дал объяснение и последовательность действий для каждой инструкции ниже:

  1. Он читает байт из [dest] и сохраняет его в eax.
  2. Значение edx изначально: F7FBB898. После, movsx edx, все инструкции становятся FFFFFFD5. Как я могу убедиться, что значение edx будет 0x000000d5 на данный момент?

Каким должно быть мое начальное значение в [dest], чтобы после этих операций конечное значение в eax было 0xd5, а не 0xFFFFFFD5

1 Ответ

3 голосов
/ 02 апреля 2019

Вы должны использовать movzx ( Перемещение с нулевым расширением ) вместо movsx ( Перемещение с расширением знака ) если вы хотите расширить значение нулями, не глядя на его знак.

Когда вы используете movsx для перемещения 0xd5 на edx, он копирует младшие байты в edx и заполняет оставшиеся MSB скопированного значения (0xd5 = 0b11010101, MSB равен 1), что заполняет 6 оставшихся байтов 0xFFFFFF. При movzx оставшиеся байты заполняются 0x000000 независимо от MSB.

...