Assembly FCOM浮点比较失败

Assembly FCOM浮点比较失败,assembly,x86,x87,Assembly,X86,X87,我刚刚开始32位汇编,我很困惑。我有以下代码: .586 .MODEL FLAT .STACK 4096 .DATA .CODE main PROC finit fldpi fld1 fcom fstsw ax sahf JL jumper nop jumper: nop nop main ENDP END 现在根据我的理解,我将pi推到堆栈上,然后将1推到堆栈上,它应该比较pi和1,看到1更小,并执行一个跳转。然而,这种比较似乎不起作用。有人能帮忙吗?将JL更改为JB,因为您只

我刚刚开始32位汇编,我很困惑。我有以下代码:

.586
.MODEL FLAT

.STACK 4096

.DATA

.CODE
main PROC

finit
fldpi
fld1
fcom
fstsw ax
sahf
JL jumper

nop

jumper:
nop

nop
main ENDP
END

现在根据我的理解,我将pi推到堆栈上,然后将1推到堆栈上,它应该比较pi和1,看到1更小,并执行一个跳转。然而,这种比较似乎不起作用。有人能帮忙吗?

JL
更改为
JB
,因为您只能对FPU标志进行无符号比较

原因是8087在与8086相同的位置上只有2个等效的状态位。这些是CF和ZF。在进行有符号比较时,处理器使用任何先前操作的状态和8087忙状态作为符号位

 8087:   [Busy] [ EQ ] [ Top of Stack Ptr ] [UND] [SOF] [ LT ]
                  C3                         C2     C1    C0    <-- C3..C0
 8086:   [Sign] [Zero] [ 0  ] [ AF ] [  0 ] [PF ] [ 1 ] [  C ]
因此:行为上C3/EQ==零,C0/LT==进位


参考资料:,

JL
更改为
JB
,因为您只能与FPU标志进行无符号比较

原因是8087在与8086相同的位置上只有2个等效的状态位。这些是CF和ZF。在进行有符号比较时,处理器使用任何先前操作的状态和8087忙状态作为符号位

 8087:   [Busy] [ EQ ] [ Top of Stack Ptr ] [UND] [SOF] [ LT ]
                  C3                         C2     C1    C0    <-- C3..C0
 8086:   [Sign] [Zero] [ 0  ] [ AF ] [  0 ] [PF ] [ 1 ] [  C ]
因此:行为上C3/EQ==零,C0/LT==进位

参考文献:,

related:是另一个问题,其中问题在FP比较后使用有符号条件。related:是另一个问题,其中问题在FP比较后使用有符号条件。
    JL:   SF != OF
    JB:   CF
    JBE:  CF | ZF
    JA:   !CF && !ZF