我在循环中的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
}
}
答案 0 :(得分:1)
FPU的条件标志与EFLAGS寄存器中的条件标志具有完全不同的含义。
如果Sum
大于C
,则ficom
会将FPU条件标志设置为“C3 = 0,C2 = 0,C1 = 0”。当加载到CPU的EFLAGS寄存器(通过。fstsw
和sahf
)时,这变为“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