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