2015-10-22 10 views
1

我被困在下面的代碼的解釋中。爲簡單起見,我已經取代從數據段直接數字閱讀一些數字:x86:條件,跳轉和標籤的組合

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 

我有兩個顧慮:

  • 我的解釋代碼是否正確?

  • L1之間的範圍內L4有兩個比較,但怎麼來的我的高級代碼,我有3個比較,我無法將其降低到兩個比較?原始代碼已處於高/中級代碼。我沒有關於原始代碼語言或編譯器的信息。

回答

1

你有一些條件錯了。如果st0嚴格小於操作數(或比較無序),fcomC0標誌(最終在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