0

我在循环中的 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
}
}
4

1 回答 1

1

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

如果Sum大于C,则将ficomFPU 条件标志设置为“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 回答