Как в этом случае знак инструкции MOVSX расширяет ввод?

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

[назначение] = 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, al она становится FFFFFFD5. Как я могу убедиться, что в этот момент значение edx будет равно 0x000000d5?

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


person Neon Flash    schedule 02.04.2019    source источник
comment
Другими словами, вам не нужно расширение знака, вам нужно нулевое расширение.   -  person Rudy Velthuis    schedule 02.04.2019
comment
Обратите внимание, что ваша первая инструкция, 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


Ответы (1)


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

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

person Simon Doppler    schedule 02.04.2019