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

问题描述 投票:0回答:1

我有以下反汇编:

[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

assembly x86 disassembly sign-extension zero-extension
1个回答
3
投票

如果要使用零来扩展值而不查看其符号,则应使用movzx(Move with Zero-Extend)而不是movsx(使用符号扩展移动)。

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

© www.soinside.com 2019 - 2024. All rights reserved.