0

我有以下反汇编:

[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, al 指令它变为 FFFFFFD5。此时如何确保 edx 的值是 0x000000d5?

我在 [dest] 中的初始值应该是多少,以便在这些操作之后,eax 中的最终值是 0xd5 而不是 0xFFFFFFD5

4

1 回答 1

3

如果您想用零扩展值而不查看其符号,则应使用movzx( Move with Zero-Extend ) 而不是movsx( Move with Sign-Extension )。

当您使用movsxto 移动0xd5到 时edx,它会将较低的 to 字节复制到edx并用复制值的 MSB 填充剩余的字节(0xd5= 0b11010101,MSB 为 1),剩余的 6 个字节用 填充0xFFFFFF。使用时,不管 MSB是多少movzx,剩余的字节都会被填充。0x000000

于 2019-04-02T09:27:09.507 回答