§4.6.3數(shù)學(xué)協(xié)處理器的編程結(jié)構(gòu)
1、 浮點(diǎn)寄存器堆棧
8個(gè)浮點(diǎn)寄存器,每個(gè)寄存器80位,可裝入臨時(shí)實(shí)數(shù)。浮點(diǎn)寄存器不能與主CPU寄存器直接交換數(shù)據(jù),只能與內(nèi)存交換數(shù)據(jù)。內(nèi)存數(shù)據(jù)中的16位整數(shù)、32位整數(shù)、64位整數(shù)、短實(shí)數(shù)(32位)、長(zhǎng)實(shí)數(shù)(64位)均可裝入浮點(diǎn)寄存器時(shí),且裝入時(shí)自動(dòng)轉(zhuǎn)換為浮點(diǎn)寄存器的80位臨時(shí)實(shí)數(shù)格式。浮點(diǎn)寄存器的80位臨時(shí)實(shí)數(shù)存入內(nèi)存時(shí),按指定的內(nèi)存單元類型轉(zhuǎn)換為16位整數(shù)、32位整數(shù)、64位整數(shù)、短實(shí)數(shù)(32位)或長(zhǎng)實(shí)數(shù)(64位)。
8個(gè)寄存器按堆棧方式使用,棧頂為ST或用ST(0)表示。如圖4-11所示:

2、 數(shù)學(xué)協(xié)處理器的狀態(tài)寄存器

IE:Invalid Operation ,非法操作
DE:Denormalized operand,非規(guī)格化操作數(shù)
ZE:Zero Divide,除以0 OE:Overflow,寄存器棧上溢
UE:Underflow,寄存器棧下溢
PE:Precision,精度丟失
SF:Stack Fault,寄存器棧失效(指棧上移和下移)
ES:Error Summary,任何異常,均置位
C3~C0:Condition codes,浮點(diǎn)狀態(tài)碼,由比較指令設(shè)置
ST:Stack Top,指示棧頂對(duì)應(yīng)的物理浮點(diǎn)寄存器
B:Busy,協(xié)處理器正在執(zhí)行運(yùn)算
3、 數(shù)學(xué)協(xié)處理器的控制寄存器
?、?BIT5~BIT0:異常屏蔽位。
置0時(shí)把相應(yīng)的異常傳送給CPU的異常處理程序,置1時(shí)把相應(yīng)的異常傳送給協(xié)處理器的異常處理程序。
?、?PC:Precision Control,精度控制。
指定有效數(shù)字的位數(shù)(符號(hào)位加尾數(shù)):
00 :24位(短實(shí)數(shù))
01:保留
10:53位(長(zhǎng)實(shí)數(shù))
11:64位(臨時(shí)實(shí)數(shù))
?、?RC:Rounding Control,舍入控制
00:舍入到最接近的值(缺省)
01:舍入到負(fù)無窮
10:舍入到正無窮
11:截?cái)?/p>
?、?其他位,未用
4、 特征字寄存器和異常指針
(1) 特征字寄存器

每?jī)晌挥糜谥甘緦?duì)應(yīng)的物理浮點(diǎn)寄存器內(nèi)的數(shù)字特征:
00:有效的數(shù)字
01:數(shù)字為0
10:無窮數(shù)(Infinite),微小數(shù)(Indefinite),NaN(not a number)
11:該物理寄存器為空
(2) 異常指針
指令指針, Instruction Pointer(32位):
操作數(shù)指針,Operand Pointer (32位):
協(xié)處理器發(fā)生異常時(shí),指出異常的指令和操作數(shù)位置。
§4.6.4CPU與數(shù)學(xué)協(xié)處理器的軟件協(xié)調(diào)
1、 數(shù)學(xué)協(xié)處理器指令的特點(diǎn)
?、?一般協(xié)處理器指令的編碼
協(xié)處理器指令的編碼和主處理器指令的編碼均被編入EXE文件,調(diào)入內(nèi)存后由CPU指令預(yù)取部件(IPU)取入指令隊(duì)列,CPU執(zhí)行部件(EU)從指令預(yù)取部件取得指令的機(jī)器碼,如該指令為CPU指令,則執(zhí)行之,如為協(xié)處理器指令,則交相應(yīng)的協(xié)處理器執(zhí)行。因此,協(xié)處理器指令又稱"交權(quán)指令ESC(Escape)",其編碼為:
ESC XY,源操作數(shù)
機(jī)器碼:

XY:指定協(xié)處理器的操作類型,XY=0~63,
Mod: 操作數(shù)方式(寄存器堆棧/存儲(chǔ)器)。
R/M:存儲(chǔ)器操作數(shù)的尋址方式。
?、?數(shù)學(xué)協(xié)處理器指令的助記符
數(shù)學(xué)協(xié)處理器指令的助記符可用"ESC XY,源操作數(shù)",在宏匯編程序(MASM)中,一般用帶前綴F的助記符, 并且,MASM在匯編時(shí),給每條指令前加上FWAIT,
2、 CPU與協(xié)處理器的協(xié)調(diào)
(1)CPU初始化數(shù)學(xué)協(xié)處理器指令
X86調(diào)用X87前,應(yīng)初始化X87。CPU執(zhí)行初始化數(shù)學(xué)協(xié)處理器的指令,以使數(shù)學(xué)協(xié)處理器準(zhǔn)備好工作。
FINIT ;X86初始化X87,并等待其初始化完成
FNINIT ;X86初始化X87,不等待其初始化完成就執(zhí)行下一條指令X87在被初始化后,使CPU的TEST信號(hào)為"1"。
(2) CPU執(zhí)行部件(EU)從指令預(yù)取部件取得指令的機(jī)器碼,如該指令為CPU指令,則執(zhí)行之,如為協(xié)處理器指令,則交相應(yīng)的協(xié)處理器執(zhí)行。在協(xié)處理器執(zhí)行其指令期間,使CPU的TEST信號(hào)為"1"。
(3) 在協(xié)處理器執(zhí)行其指令期間( 信號(hào)為"1"),CPU可執(zhí)行后面的指令。協(xié)處理器執(zhí)行完其操作后,使CPU的TEST信號(hào)為"0"。當(dāng)CPU需要使用協(xié)處理器的操作結(jié)果時(shí),用FWAIT(WAIT)指令等待TEST信號(hào)為"0"。
§4.6.5數(shù)學(xué)協(xié)處理器的指令
|
約定: real32:內(nèi)存中的32位短實(shí)數(shù) ; real64:內(nèi)存中的64位長(zhǎng)實(shí)數(shù) ; mem16:內(nèi)存中的16位整數(shù) mem32:內(nèi)存中的32位整數(shù) ; mem64:內(nèi)存中的64位整數(shù) ; memBCD:內(nèi)存中的BCD碼 st(j):第j個(gè)浮點(diǎn)寄存器 ; st(0):棧頂 |
|||||||||
|
1 、數(shù)據(jù)裝入 (1)內(nèi)存中的浮點(diǎn)數(shù)裝入棧頂 FLD FLD real32 FLD real64 (2)浮點(diǎn)寄存器的值裝入棧頂 FLD FLD st(j) (3)內(nèi)存中的整數(shù)裝入棧頂 FILD FILD mem16 FILD mem32 FILD mem64 (4)內(nèi)存中的BCD碼裝入棧頂 FBLD FBLD memBCD |
2 、裝入常數(shù) FLDZ; 裝入0.0 FLD1; 裝入1.0 FLDPI; 裝入π FLDL2E;裝入log2(e) FLDL2T;裝入log2(10) FLDLG2;裝入log10(2) FLDLN2;裝入loge(10) |
||||||||
|
3、棧頂數(shù)據(jù)存入內(nèi)存(store,不改變棧頂) (1) 存為實(shí)數(shù) FST real32 FST real64 (2) 存為整數(shù) FIST mem16 FIST mem32 |
4 、數(shù)據(jù)彈出(同時(shí)改變棧頂) (1)彈出存為浮點(diǎn)數(shù) FSTP real32 FSTP real64 (2) 彈出存為整數(shù) FISTP mem16 FISTP mem32 FISTP mem64 (3) 彈出存為BCD FBSTP memBCD |
||||||||
|
5 、加法運(yùn)算 (1) 浮點(diǎn)加法 FADD real32 ;st+real32→st FADD real64 ;st+real64→st FADD st(j) ;st+st(j)→st (2) 整數(shù)加法 FIADD mem16 ;st+mem16→st FIADD mem32 ;st+mem32→st (3) FADD ;無操作數(shù),st+st(1)→st FADD st,st(j) ;st+st(j)→st FADD st(j),st ;st(j)+st→st |
6 、減法運(yùn)算 (1) 浮點(diǎn)減法 FSUB real32 ;st-real32→st FSUB real64 ;st-real64→st FSUB st(j) ;st-st(j)→st (2) 整數(shù)減法 FISUB mem16 ;st-mem16→st FISUB mem32 ;st-mem32→st (3) FSUB ;無操作數(shù),st-st(1)→st FSUB st,st(j) ;st-st(j)→st FSUB st(j),st ;st(j)-st→st (4) FCHS ;st符號(hào)取反(Change Sign) |
||||||||
|
7 、乘法 (1) 浮點(diǎn) FMUL real32 ;st×real32→st FMUL real64 ;st×real64→st FMUL st(j) ;st×st(j)→st (2) 整數(shù) FIMUL mem16 ;st×mem16→st FIMUL mem32 ;st×mem32→st (3) FMUL ;st×st(1)→st FMUL st,st(j) ;st×st(j)→st FMUL st(j),st ;st(j) ×st→st |
8 、除法 (1) 浮點(diǎn) FDIV real32 ;st/real32→st FDIV real64 ;st/real64→st FDIV st(j) ;st/st(j)→st (2) 整數(shù) FIDIV mem16 ;st/mem16→st FIDIV mem32 ;st/mem32→st (3) FDIV ;st(1) /st→st FDIV st,st(j) ;st/st(j)→st FDIV st(j),st ;st(j) /st→st |
||||||||
|
9 、比較 (1) 浮點(diǎn) FCOM real32 ;st與real32 FCOM real64 ;st與real64 (2) 整數(shù) FICOM mem16 ;st與mem16 FICOM mem32 ;st與mem32 (3) FTST ;st與0.0 比較結(jié)果反應(yīng)在狀態(tài)寄存器中
|
10 、三角函數(shù) (1) 正弦 FSIN ;計(jì)算st(任意弧度)的正弦。計(jì)算后,st=1,st(1)為正弦值。 (2) 余弦 FCOS ;計(jì)算st(任意弧度)的余弦。計(jì)算后,st=1,st(1)為余弦值。 (3) 正弦和余弦 FSINCOS;計(jì)算st(任意弧度)的正弦和余弦。計(jì)算后,st為余弦值,st(1)為正弦值。 (4) 正切 FPTAN ;計(jì)算st(任意弧度)的正切。計(jì)算后,st=1,st(1)為正切值。 (5) 反正切 FPATAN ;計(jì)算st(1)/st的反正切。計(jì)算后,棧頂被彈出,反正切值放入新的棧頂。 |
||||||||
|
11、其它運(yùn)算函數(shù) FSQRT;計(jì)算st的平方根,結(jié)果在st F2XM1;計(jì)算2st-1,結(jié)果在st FYL2X;計(jì)算st(1) ×log2st,彈出棧頂,結(jié)果在st FYL2XP1 ;計(jì)算st(1) ×log2(st+1), 彈出棧頂,結(jié)果在st FABS;計(jì)算st的絕對(duì)值,結(jié)果在st FPREM;計(jì)算st/st(1)的余數(shù),結(jié)果在st |
12、程序流程控制
FSTSW mem16;協(xié)處理器狀態(tài)標(biāo)志存入內(nèi)存。 FSTSW AX ;協(xié)處理器狀態(tài)標(biāo)志CPU AX寄存器。 |
||||||||
§4.6.6 實(shí)數(shù)運(yùn)算程序例題
DATA SEGMENT
x DD 2.0
y DD ? f DW ? ;協(xié)處理器標(biāo)志
DATA ENDS
STACK SEGMENT STACK
DW 100H DUP (0)
STACK ENDS
CODE SEGMENT
ASSUME CS:code, DS:data, SS:stack
Main PROC FAR
Start:MOV AX, data
MOV DS, AX
FINIT ;初始化X87
FLD x ;xàst
FTST ;比較st與0.0
FSTSW f ;X87標(biāo)志寄存器的值存入內(nèi)存變量f
FWAIT ;等待存入操作完成
MOV AX, f
AND AX, 0100H ;C0<-->bit8
JNE less ;ZF=0,即C0=1, st(=x) < 0.0
FMUL x ;執(zhí)行后st=x的平方
FLD1 ;1->st, st(1)=x的平方
FADD ;st+st(1)->st
JMP exit
Less:FMUL x
FLD1
FSUB ;st(1)-st->st
Exit:FST y ; st的值->內(nèi)存變量y
FWAIT
MOV AX, 4C00H
INT 21H
Main ENDP
CODE ENDS
END start
