Assembly FCOM浮点比较失败
我刚刚开始32位汇编,我很困惑。我有以下代码: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,因为您只
.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