为什么循环在asm中失败(x87)

时间:2012-11-04 16:58:00

标签: assembly x87

我在循环中的asm中有一些计算,它必须在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
}
}

1 个答案:

答案 0 :(得分: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