在这种情况下,MOVSX 指令符号如何扩展输入?

How is MOVSX instruction sign extending input in this case?

我有以下反汇编:

[目标] = 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

如果你想用零扩展值而不看它的符号,你应该使用 movzx (Move with Zero-Extend) instead of movsx移动符号扩展)。

当你使用movsx0xd5移动到edx时,它会将低字节复制到edx并用复制的MSB填充剩余部分值(0xd5 = 0b11010101,最高位为1),将剩余的6个字节用0xFFFFFF填充。使用movzx,剩余字节用0x000000填充,不考虑MSB。