2015-10-22 1 views
1

Je me suis coincé dans l'interprétation du code suivant. Pour faire simple, je l'ai remplacé quelques chiffres lus à partir de segment de données avec des numéros directs:x86: Combinaison de conditions, de sauts et d'étiquettes

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: 

Ceci est mon interprétation de ce code:

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 

J'ai deux préoccupations:

  • Mon code interprété est-il correct?

  • Dans l'intervalle compris entre L1 à L4 il y a deux comparaisons, mais comment se fait dans mon code de haut niveau, j'ai 3 comparaisons et je ne peux pas le réduire à deux comparaisons? Le code d'origine a été dans un code de niveau haut/milieu. Je n'ai aucune information sur le langage de code original ou le compilateur.

Répondre

1

Vous avez eu quelques problèmes. Après fcom, l'indicateur C0 (éventuellement le bit 0 de AH) est défini si st0 est strictement inférieur à l'opérande (ou si la comparaison est non ordonnée).

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