我刚刚开始使用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更小并执行跳转。然而,这种比较似乎不起作用。有人可以帮忙吗?
答案 0 :(得分:3)
将JL
更改为JB
,因为您只能与FPU标记进行无符号比较。
原因是8087在与8086相同的位置只有2个等效状态位。这些是CF和ZF。进行有符号比较时,处理器使用任何前面操作的OF状态和8087 Busy State作为符号位。
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 ]
FCOMx根据条件设置控制位C3,C2,C0
C3 = EQ == equal
C2 = Undefined == Set if ST or Mem is undefined
C1 = Marks either Underflow or Overflow of FP Stack (If Overflow Exception == TRUE)
C0 = True, if ST(i) < ST(1)/Mem
OTOH,分支代码实现为
JL: SF != OF
JB: CF
JBE: CF | ZF
JA: !CF && !ZF
因此:行为C3 / EQ ==零和C0 / LT ==携带