【问题标题】:Why loop failed in asm(x87)为什么循环在 asm(x87) 中失败
【发布时间】:2012-11-04 16:57:59
【问题描述】:

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

【问题讨论】:

标签: assembly x87


【解决方案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

【讨论】:

  • 在第二个代码相同的无限循环中,当总和超过3时它不会停止
猜你喜欢
  • 1970-01-01
  • 2021-04-02
  • 2016-12-26
  • 2020-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-08
  • 2021-05-29
  • 2017-05-11
相关资源
最近更新 更多