0

asm in loopで計算を行っています。これは、Sumが3になる前でなければなりませんが、ループは常に機能し、終了することはありません。これがmuコードです:

int main() {

    float Sum=0;
    int i=0;
    int A=5;
    int B=180;
    int C=3;

_asm{
   finit
m1:inc i
   fldpi
   fimul A  
   fimul i
   fidiv B
   fsin
   fadd Sum 
   fstp Sum
   fild Sum
   ficom C      
   fstsw AX     
   sahf         
   jg   m1
}
}
4

1 に答える 1

1

FPUの条件フラグは、EFLAGSレジスタの条件フラグとはまったく異なる意味を持っています。

Sumがより大きい場合、CficomFPU条件フラグを「C3 = 0、C2 = 0、C1=0」に設定します。CPUのEFLAGSレジスタに(およびを介しfstswsahf)ロードされると、これは「ZF = 0、PF = 0、CF=0」になります。「ZF=0」および「SF=0」の場合、jg命令は分岐します。PFフラグまたはCFフラグはまったくテストされませんが、無関係なSFフラグはテストされます。

とにかく整数を比較しているとすると、あなたはおそらくただするべきです:

mov eax,[Sum]
cmp [C],eax
jg m1

別の方法は、AXのフラグを直接テストすることです。例えば:

ficom C
fstsw AX
test AX,0x4500    ;Are C3, C2 and C0 clear?
je m1             ; yes, Sum must be greater than C
于 2012-11-04T17:17:26.027 に答える