您好,欢迎来电子发烧友网! ,新用户?[免费注册]

当前位置:电子发烧友网 > 图书频道 > 电子 > 《微计算机原理》 > 第4章 汇编语言程序设计

第5节 数学协处理器的编程结构

 

  §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 比较结果反应在状态寄存器中 

\ C3(14)C2(10) C0(8)
St > op
0   0    0
St < op
0   0    1
St = op
1   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、程序流程控制
协处理器状态标志 C3 C2 C0
14 10 8

  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