【问题标题】:sub eax,0 - does it do anything?sub eax,0 - 它有什么作用吗?
【发布时间】:2012-04-05 04:44:13
【问题描述】:

我刚刚在 IDA Pro 中打开了一个文件,我发现一些看起来完全没用的代码。但是,我认为它可能有一些用处。 sub eax,0 不只是从 eax 中减去 0 吗?

代码:

hinstDLL= dword ptr  4  
fdwReason= dword ptr  8  
lpReserved= dword ptr  0Ch  

mov     eax, [esp+fdwReason]  
sub     eax, 0  
jz      short loc_10001038  

【问题讨论】:

  • 是的,它从 eax 中减去零。但是 确实 做某事,它设置了标志。例如,它会导致零的唯一方法是,如果 eax 一开始就为零。

标签: assembly x86 reverse-engineering disassembly


【解决方案1】:

sub 指令设置标志(OFSFZFAFPFCF,根据 documentation) - mov 指令不是。 jz 只有在设置了零标志 (ZF) 时才会跳转,因此如果您想根据 eax 中的值进行跳转,则必须正确设置该标志。

【讨论】:

  • 我认为您需要为此使用 TEST 指令。谢谢!
  • test 确实执行隐式按位与,但不会影响所有相同的标志。来自test 文档:“OFCF 标志设置为0SFZFPF 标志根据结果设置...... AF 标志未定义。"
【解决方案2】:

sub 指令的结果为零时将设置零标志。在这种情况下,这意味着如果 eax 为零,则将设置零标志。

所以这三个指令会检查[esp+fdwReason] 是否为零并在这种情况下跳转到loc_10001038

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2011-02-11
    相关资源
    最近更新 更多