2013-04-26 160 views
1

我剛開始使用32位程序集,我很困惑。我有以下代碼:FCOM浮點比較失敗

.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 

現在從我個人理解,我推圓周率到堆棧中,然後推1到堆棧,應該比較PI和1,看到一個1較小,並執行跳轉。但是,比較似乎不起作用。有人可以幫忙嗎?

回答

3

JL更改爲JB,因爲您只能執行無符號與FPU標誌的比較。

原因是8087在與8086相同的位置只有2個等價的狀態位。這些是CF和ZF。進行有符號比較時,處理器使用來自任何前面的操作的OF狀態和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 ] 

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 ==攜帶

參考文獻:Art of Assembly,FLAGS register,Conditional Jumps