如何比较装配中的2浮动

时间:2011-05-10 01:15:09

标签: assembly floating-point

我,完全是装配新手。 我想比较两个变量(float)并正确跳转到正确的函数; 它是一个Pong游戏 它用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
...

我想要的是:如果球位置与Pad位置相同或更多,则反转速度。 我做了什么:

;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

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

2 个答案:

答案 0 :(得分:2)

FCOM和公司(FCOMP,FCOMPP,FICOM,FICOMP)将结果放入主CPU标志寄存器中的浮点状态字 not 。您可以使用fstsw将浮点状态字存储在可以获取的位置并对其内容进行操作(例如,要存储到AX,您使用FSTSW AX)。

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

答案 1 :(得分:1)

使用JAE将浮点数与EFLAGS(ZF)进行比较时,我非常确定您需要JBE / JLE,而不是JGE / FCOMIP ,PF和CF)。