Как знак команды 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

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

  1. Он читает байт из [dest] и сохраняет его в eax.
  2. Значение 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.

Другие вопросы по тегам