2012-11-04 43 views
0

我在循环中有一些在asm中的计算,它必须在sum之前是3,但循环工作无时无刻,并且永不结束。这里是mu代码:为什么在asm中循环失败(x87)

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 
} 
} 
+0

的可能重复的[罪的总和()导致ASM(的x87)](http://stackoverflow.com/questions/13212795/sum-of-sin-results-in-asmx87)第二个代码中的 – ughoavgfhw

回答

1

FPU的条件标志具有完全不同于EFLAGS寄存器中的条件标志的含义。

如果Sum大于C,那么ficom将设置FPU条件标志为“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 
+0

等于无穷大循环,当超过3时不停止 – Andrew