Assembly 如何比较组件中的2个浮动

Assembly 如何比较组件中的2个浮动,assembly,floating-point,Assembly,Floating Point,我´,完全是汇编新手。 我想比较两个变量(float)并正确跳转到正确的函数; 这是一场乒乓球比赛 它是用FASM写的 ;The right pad P0x dd 0.9 ; P0y dd 0.05 ; P1x dd 0.95 ; P1y dd -0.25 ; ;The left pad P0x2 dd -0.9 P0y2 dd 0.05 P1x2 dd -0.95 P1y2 dd - 0.25 B0x GLfloat 0.01 ; Its

我´,完全是汇编新手。 我想比较两个变量(float)并正确跳转到正确的函数; 这是一场乒乓球比赛 它是用FASM写的

 ;The right pad
  P0x dd  0.9  ;
  P0y dd  0.05 ;
  P1x dd  0.95 ;
  P1y dd  -0.25 ;

 ;The left pad
  P0x2 dd -0.9
  P0y2 dd  0.05
  P1x2 dd -0.95
  P1y2 dd - 0.25

B0x GLfloat  0.01 ; Its the ball coordinate
...
BvelX GLfloat 0.02 ;Its the velocity that the ball move in x
...
我想说的是:如果球的位置与垫子的位置相同或更多,那么将速度反转。 我所做的:

;right
 fld [B0x]
 fld [P0x]
 fcomip st1
 jge .changexEsq

 ;left
 fld [B0x]
 fld [P0x2]
 fcomip st1
 jle .changexDir

 ;Up
 fld [B0y]
 fld [TelaComecoY]
 fcomip st1
 jge .changeyBaixo

 ;Down
 fld [B0y]
 fld  [TelaFimY]
 fcomip st1
 jge .changeyBaixo

  ....
.changexEsq:
mov edi,-0.02
mov [BvelX],edi
jmp .main
    ret

.changexDir:
mov edi, 0.02
mov [BvelX],edi
jmp .main
    ret

.changeyBaixo:
mov edi,-0.02
mov [BvelY],edi
jmp .main
    ret

.changeyCima:
mov edi,-0.02
mov [BvelY],edi
jmp .main
    ret

但是比较什么也没做!如何比较这些变量并正确跳转?

当使用
FCOMIP
比较浮动与EFLAGS(ZF、PF和CF)时,我很确定您想要
JAE
/
JBE
,而不是
JGE
,而不是
JLE>
,使用
FCOMIP
将浮点与EFLAGS(ZF、PF和CF)进行比较时。

FCOM
和company(FCOMP、FCOMP、FICOM、FICOMP)将结果放入浮点状态字,而不是主CPU标志寄存器。您可以使用
fstsw
将浮点状态字存储在您可以获取它并对其内容进行操作的地方(例如,要存储到AX,您可以使用
fstsw AX


请注意,这有点迂回。在某些情况下,您可能需要考虑将这些数字当作整数来对待——IEEE 754是精心设计的,以便排序的整数比较主要对浮点数产生正确的结果。

<代码> FCOM< /COD>和公司(FCOMP,FCOMP,FICOM,FICOMP)将结果放在浮点状态字中,不在主CPU标志寄存器中。您可以使用
fstsw
将浮点状态字存储在您可以获取它并对其内容进行操作的地方(例如,要存储到AX,您可以使用
fstsw AX

请注意,这有点迂回。在某些情况下,您可能需要考虑将这些数字当作整数来对待——IEEE 754是精心设计的,以便整数比较排序对浮点数产生正确的结果。