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

时间:2019-04-02 08:29:44

标签: assembly x86 disassembly sign-extension zero-extension

我需要进行以下拆卸:

[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. 它从[目的地]读取一个字节并将其存储在eax中。
  2. edx的初始值是:F7FBB898。之后,movsx edx,将其所有指令变为FFFFFFD5。我现在如何确保edx的值将为0x000000d5?

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

1 个答案:

答案 0 :(得分:3)

如果您想使用movzx扩展零的移动)而不是movsx扩展的符号扩展),将该值扩展为零而不查看其符号。

使用movsx0xd5移至edx时,它将把低位字节复制到edx中,并用复制值的MSB填充其余部分( 0xd5 = 0b11010101,MSB为1),它用0xFFFFFF填充剩余的6个字节。对于movzx,无论MSB是什么,其余字节都用0x000000填充。