【问题标题】:How is MOVSX instruction sign extending input in this case?在这种情况下,MOVSX 指令符号如何扩展输入?
【发布时间】:2019-04-02 08:29:44
【问题描述】:

我有以下反汇编:

[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

【问题讨论】:

  • 换句话说,你不想要符号扩展,你想要零扩展。
  • 请注意,您的第一条指令movzx eax, [ebp+dest] 是模棱两可的:它没有指定内存源的大小,因此它可以将一个字节或一个字零扩展为 EAX。而且由于 EAX 在下一条指令中被破坏,因此在将低字节符号扩展为 EDX 之前先将零扩展到 EAX 是完全没有意义的。 movsx edx, byte [ebp+dest] / movsx eax, byte [ebp+var_E] 将完全等同于前 4 条指令。这可能是编译器生成的代码,没有优化或优化很少,导致像这样的脑死代码。

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


【解决方案1】:

如果你想用零而不看它的符号。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-21
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多