x86:条件、跳转和标签的组合

x86: Combination of conditions, jumps and labels

我在解释以下代码时遇到了困难。为了简单起见,我将一些从数据段中读取的数字替换为直接数字:

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

我有两个顾虑:

你的某些条件有误。在 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