【问题标题】:x86: Combination of conditions, jumps and labelsx86:条件、跳转和标签的组合
【发布时间】:2016-01-21 17:06:03
【问题描述】:

我陷入了对以下代码的解释中。为了简单起见,我用直接数字替换了从数据段读取的一些数字:

L1:

    fld qword ptr [Data1]
    fcomp 1.0

    fnstsw ax
    test ah, 01h
    jz L2

    fld qword ptr [Data2]

    jmp L3


L2:

    cmp word ptr [Data3], 0001h
    jnz L4 

    fld qword ptr [Data4]

L3:

    fstp qword ptr [esp+10h]

L4:

    fld qword ptr [Data5]
    fcomp 1.0

    fnstsw ax
    test ah, 01h
    jz L5

    mov qword ptr [Data6], 43.0

L5:

    fld qword ptr [Data7]
    fcomp 1.0

    fnstsw ax
    test ah, 01h
    jz L6
    mov qword ptr [Data7], 53.2

L6:

这是我对这段代码的解释:

double Data1
double Data2
int Data3
double Data4
double Data5
double Data6
double Data7


if Data1<=1.0 || Data3==1

    if Data1<=1.0
        *(esp+10h)= Data4;
    else
        *(esp+10h)= Data2;
    end

end

if Data5<=1.0
    Data6=43.0;
end

if Data7 <= 1.0
    Data7=53.2;
end

我有两个担心:

  • 我的解释代码正确吗?

  • L1L4 之间的范围内有两个比较,但是在我的高级代码中,我有3 个比较,我不能把它减少到两个比较?原始代码已处于高/中级代码中。我没有关于原始代码语言或编译器的信息。

【问题讨论】:

    标签: assembly x86 reverse-engineering disassembly


    【解决方案1】:

    您的某些条件有误。在fcom 之后,如果st0 严格小于操作数(或比较无序),则设置C0 标志(最终是AH 中的位#0)。

    if Data1 < 1.0
        *(esp+10h)= Data2;
    else if Data3 == 1
        *(esp+10h)= Data4;
    end
    
    if Data5 < 1.0
        Data6=43.0;
    end
    
    if Data7 < 1.0
        Data7=53.2;
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2017-12-28
      • 2011-03-11
      相关资源
      最近更新 更多