首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >asm中循环失败的原因(X87)

asm中循环失败的原因(X87)
EN

Stack Overflow用户
提问于 2012-11-05 00:58:00
回答 1查看 205关注 0票数 0

我在asm的循环中有一些计算,它必须是之前的总和将是3,但循环工作的所有时间和永远不会结束。mu代码如下:

代码语言:javascript
复制
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
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-05 01:17:26

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标志。

假设您无论如何都要比较整数,那么您可能应该这样做:

代码语言:javascript
复制
mov eax,[Sum]
cmp [C],eax
jg m1

另一种方法是直接测试AX中的标志。例如:

代码语言:javascript
复制
ficom C
fstsw AX
test AX,0x4500    ;Are C3, C2 and C0 clear?
je m1             ; yes, Sum must be greater than C
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13220718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档