日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊(cè)]

當(dāng)前位置:電子發(fā)燒友網(wǎng) > 圖書頻道 > 電子 > 《微計(jì)算機(jī)原理》 > 第4章 匯編語言程序設(shè)計(jì)

第5節(jié) 數(shù)學(xué)協(xié)處理器的編程結(jié)構(gòu)

 

  §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)寄存器中 

\ C3(14)C2(10) C0(8)
St > op
0   0    0
St < op
0   0    1
St = op
1   0    0
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、程序流程控制
協(xié)處理器狀態(tài)標(biāo)志 C3 C2 C0
14 10 8

  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

?
二连浩特市| 枞阳县| 龙州县| 封丘县| 监利县| 盐边县| 丽水市| 翼城县| 五大连池市| 于田县| 南涧| 高州市| 澜沧| 永登县| 博爱县| 疏勒县| 松潘县| 洛阳市| 司法| 手游| 崇文区| 渭南市| 沐川县| 遂平县| 青浦区| 措美县| 舒兰市| 呼和浩特市| 漯河市| 曲麻莱县| 柳江县| 凌海市| 茂名市| 乡城县| 积石山| 栾城县| 米林县| 香格里拉县| 上栗县| 阿尔山市| 玉溪市|