【发布时间】: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
下面每条指令我都给出了解释和流程:
- 它从 [dest] 读取一个字节并将其存储在 eax 中。
- 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