我在asm的循环中有一些计算,它必须是之前的总和将是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
}
}发布于 2012-11-05 01:17:26
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 Chttps://stackoverflow.com/questions/13220718
复制相似问题