§4.6.3数学协处理器的编程结构
1、 浮点寄存器堆栈
8个浮点寄存器,每个寄存器80位,可装入临时实数。浮点寄存器不能与主CPU寄存器直接交换数据,只能与内存交换数据。内存数据中的16位整数、32位整数、64位整数、短实数(32位)、长实数(64位)均可装入浮点寄存器时,且装入时自动转换为浮点寄存器的80位临时实数格式。浮点寄存器的80位临时实数存入内存时,按指定的内存单元类型转换为16位整数、32位整数、64位整数、短实数(32位)或长实数(64位)。
8个寄存器按堆栈方式使用,栈顶为ST或用ST(0)表示。如图4-11所示:
2、 数学协处理器的状态寄存器
IE:Invalid Operation ,非法操作
DE:Denormalized operand,非规格化操作数
ZE:Zero Divide,除以0 OE:Overflow,寄存器栈上溢
UE:Underflow,寄存器栈下溢
PE:Precision,精度丢失
SF:Stack Fault,寄存器栈失效(指栈上移和下移)
ES:Error Summary,任何异常,均置位
C3~C0:Condition codes,浮点状态码,由比较指令设置
ST:Stack Top,指示栈顶对应的物理浮点寄存器
B:Busy,协处理器正在执行运算
3、 数学协处理器的控制寄存器
⑴ BIT5~BIT0:异常屏蔽位。
置0时把相应的异常传送给CPU的异常处理程序,置1时把相应的异常传送给协处理器的异常处理程序。
⑵ PC:Precision Control,精度控制。
指定有效数字的位数(符号位加尾数):
00 :24位(短实数)
01:保留
10:53位(长实数)
11:64位(临时实数)
⑶ RC:Rounding Control,舍入控制
00:舍入到最接近的值(缺省)
01:舍入到负无穷
10:舍入到正无穷
11:截断
⑷ 其他位,未用
4、 特征字寄存器和异常指针
(1) 特征字寄存器
每两位用于指示对应的物理浮点寄存器内的数字特征:
00:有效的数字
01:数字为0
10:无穷数(Infinite),微小数(Indefinite),NaN(not a number)
11:该物理寄存器为空
(2) 异常指针
指令指针, Instruction Pointer(32位):
操作数指针,Operand Pointer (32位):
协处理器发生异常时,指出异常的指令和操作数位置。
§4.6.4CPU与数学协处理器的软件协调
1、 数学协处理器指令的特点
① 一般协处理器指令的编码
协处理器指令的编码和主处理器指令的编码均被编入EXE文件,调入内存后由CPU指令预取部件(IPU)取入指令队列,CPU执行部件(EU)从指令预取部件取得指令的机器码,如该指令为CPU指令,则执行之,如为协处理器指令,则交相应的协处理器执行。因此,协处理器指令又称"交权指令ESC(Escape)",其编码为:
ESC XY,源操作数
机器码:
XY:指定协处理器的操作类型,XY=0~63,
Mod: 操作数方式(寄存器堆栈/存储器)。
R/M:存储器操作数的寻址方式。
② 数学协处理器指令的助记符
数学协处理器指令的助记符可用"ESC XY,源操作数",在宏汇编程序(MASM)中,一般用带前缀F的助记符, 并且,MASM在汇编时,给每条指令前加上FWAIT,
2、 CPU与协处理器的协调
(1)CPU初始化数学协处理器指令
X86调用X87前,应初始化X87。CPU执行初始化数学协处理器的指令,以使数学协处理器准备好工作。
FINIT ;X86初始化X87,并等待其初始化完成
FNINIT ;X86初始化X87,不等待其初始化完成就执行下一条指令X87在被初始化后,使CPU的TEST信号为"1"。
(2) CPU执行部件(EU)从指令预取部件取得指令的机器码,如该指令为CPU指令,则执行之,如为协处理器指令,则交相应的协处理器执行。在协处理器执行其指令期间,使CPU的TEST信号为"1"。
(3) 在协处理器执行其指令期间( 信号为"1"),CPU可执行后面的指令。协处理器执行完其操作后,使CPU的TEST信号为"0"。当CPU需要使用协处理器的操作结果时,用FWAIT(WAIT)指令等待TEST信号为"0"。
§4.6.5数学协处理器的指令
约定: real32:内存中的32位短实数 ; real64:内存中的64位长实数 ; mem16:内存中的16位整数 mem32:内存中的32位整数 ; mem64:内存中的64位整数 ; memBCD:内存中的BCD码 st(j):第j个浮点寄存器 ; st(0):栈顶 |
|||||||||
1 、数据装入 (1)内存中的浮点数装入栈顶 FLD FLD real32 FLD real64 (2)浮点寄存器的值装入栈顶 FLD FLD st(j) (3)内存中的整数装入栈顶 FILD FILD mem16 FILD mem32 FILD mem64 (4)内存中的BCD码装入栈顶 FBLD FBLD memBCD |
2 、装入常数 FLDZ; 装入0.0 FLD1; 装入1.0 FLDPI; 装入π FLDL2E;装入log2(e) FLDL2T;装入log2(10) FLDLG2;装入log10(2) FLDLN2;装入loge(10) |
||||||||
3、栈顶数据存入内存(store,不改变栈顶) (1) 存为实数 FST real32 FST real64 (2) 存为整数 FIST mem16 FIST mem32 |
4 、数据弹出(同时改变栈顶) (1)弹出存为浮点数 FSTP real32 FSTP real64 (2) 弹出存为整数 FISTP mem16 FISTP mem32 FISTP mem64 (3) 弹出存为BCD FBSTP memBCD |
||||||||
5 、加法运算 (1) 浮点加法 FADD real32 ;st+real32→st FADD real64 ;st+real64→st FADD st(j) ;st+st(j)→st (2) 整数加法 FIADD mem16 ;st+mem16→st FIADD mem32 ;st+mem32→st (3) FADD ;无操作数,st+st(1)→st FADD st,st(j) ;st+st(j)→st FADD st(j),st ;st(j)+st→st |
6 、减法运算 (1) 浮点减法 FSUB real32 ;st-real32→st FSUB real64 ;st-real64→st FSUB st(j) ;st-st(j)→st (2) 整数减法 FISUB mem16 ;st-mem16→st FISUB mem32 ;st-mem32→st (3) FSUB ;无操作数,st-st(1)→st FSUB st,st(j) ;st-st(j)→st FSUB st(j),st ;st(j)-st→st (4) FCHS ;st符号取反(Change Sign) |
||||||||
7 、乘法 (1) 浮点 FMUL real32 ;st×real32→st FMUL real64 ;st×real64→st FMUL st(j) ;st×st(j)→st (2) 整数 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) 浮点 FDIV real32 ;st/real32→st FDIV real64 ;st/real64→st FDIV st(j) ;st/st(j)→st (2) 整数 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) 浮点 FCOM real32 ;st与real32 FCOM real64 ;st与real64 (2) 整数 FICOM mem16 ;st与mem16 FICOM mem32 ;st与mem32 (3) FTST ;st与0.0 比较结果反应在状态寄存器中
|
10 、三角函数 (1) 正弦 FSIN ;计算st(任意弧度)的正弦。计算后,st=1,st(1)为正弦值。 (2) 余弦 FCOS ;计算st(任意弧度)的余弦。计算后,st=1,st(1)为余弦值。 (3) 正弦和余弦 FSINCOS;计算st(任意弧度)的正弦和余弦。计算后,st为余弦值,st(1)为正弦值。 (4) 正切 FPTAN ;计算st(任意弧度)的正切。计算后,st=1,st(1)为正切值。 (5) 反正切 FPATAN ;计算st(1)/st的反正切。计算后,栈顶被弹出,反正切值放入新的栈顶。 |
||||||||
11、其它运算函数 FSQRT;计算st的平方根,结果在st F2XM1;计算2st-1,结果在st FYL2X;计算st(1) ×log2st,弹出栈顶,结果在st FYL2XP1 ;计算st(1) ×log2(st+1), 弹出栈顶,结果在st FABS;计算st的绝对值,结果在st FPREM;计算st/st(1)的余数,结果在st |
12、程序流程控制
FSTSW mem16;协处理器状态标志存入内存。 FSTSW AX ;协处理器状态标志CPU AX寄存器。 |
§4.6.6 实数运算程序例题
DATA SEGMENT
x DD 2.0
y DD ? f DW ? ;协处理器标志
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标志寄存器的值存入内存变量f
FWAIT ;等待存入操作完成
MOV AX, f
AND AX, 0100H ;C0<-->bit8
JNE less ;ZF=0,即C0=1, st(=x) < 0.0
FMUL x ;执行后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的值->内存变量y
FWAIT
MOV AX, 4C00H
INT 21H
Main ENDP
CODE ENDS
END start