3.4 80486微處理器的擴展指令
80486微處理器既可運行在16位實地址模式下,又可運行在保護模式下。當運行在16位實地址方式下時,其指令系統為3.3節介紹的80486微處理器最基本的指令。隨著80x86微處理器由最初的8088/8086到80286、80386、80486,其功能不斷擴大,在最基本指令系統的基礎上,又增加了一些新的指令,并對有些基本指令擴充了功能。本節僅介紹一些最常用的擴充與增加的指令。
3.4.1 80486微處理器新增加的指令
80486微處理器新增加的指令見表3.11。
表3.11 80486 CPU新增加的指令
80486微處理器增強功能指令見表3.12。
表3.12 80486 CPU增強功能指令
1.數據傳送類指令
數據傳送類指令包括PUSH(push segment register onto the stack)指令、PUSHA(push all general registers onto the stack)指令、POPA(pop all general registers from the stack)指令、MOVSX(move with sign-extend)指令和MOVZX(move with zero-extend)指令。
指令格式:
PUSH 源操作數
PUSHA
POPA
MOVSX 目標操作數,源操作數
MOVZX 目標操作數,源操作數
功能:PUSH指令將包括立即數的源操作數壓入堆棧。PUSHA指令將所有通用寄存器的值壓入堆棧。POPA指令將所有通用寄存器的值彈出堆棧。MOVSX指令是有符號擴展的傳送指令,將源操作數的符號位擴展后傳送到目標操作數中。MOVZX指令是帶零擴展的傳送指令,它不管源操作數是正數還是負數,均將高位擴展成0,然后送至目標操作數中。
舉例1:
PUSH 3200H ; 將立即數3200H壓入堆棧
PUSH -180H ; 將立即數-180H壓入堆棧
舉例2:
MOV DX,0FB20H ; DX←0FB20H,符號位為1,是負數
MOVSX EAX,DX ; 則(EAX)=FFFFFB20H
舉例3:
MOV CL,0FBH ; CL←0FBH,符號位為1,是負數
MOVZX AX,CL ; (AX)=00FBH
注意:
① PUSH是增強指令。在80486基本指令系統中,PUSH指令的源操作數只能是寄存器、段寄存器,而該指令中源操作數可以是一個8位或16位的立即數,而且此立即數可以是有符號數也可以是無符號數。
② PUSHA 壓入的順序是AX,CX,DX,BX,SP,BP,SI和DI寄存器,其中壓入SP的值是此PUSH指令執行前該寄存器的值。POPA指令彈出的順序與壓入的順序相反。
③ MOVSX和MOVZX指令中目標操作數只能是16位或32位寄存器操作數,源操作數可以是寄存器操作數或存儲器操作數。在一般情況下,如果源操作數是字節類型,則目標操作數是字類型;如果源操作數是字類型,則目標操作數是雙字類型。
④ MOVSX和MOVZX指令之間的區別是:對MOVSX指令,若源操作數是正數,則高位都擴展成0,若是負數,則高位擴展成1送入目標操作數;對MOVZX指令,高位都擴展成0后送入目標操作數。
⑤ MOVSX和OVZX指令常用于符號擴展及初始化寄存器高位部分。MOVSX指令對有符號數進行擴展,MOVZX指令對無符號數進行擴展。
2.算術運算類指令
算術運算類指令有IMUL(signed multiply)指令和XADD(exchange and add)。
指令格式:
① IMUL 寄存器,立即數
② IMUL 寄存器1,寄存器2或存儲器,立即數
XADD 目標操作數,源操作數
功能:格式①將寄存器中有符號數與立即數相乘,乘積送該寄存器。格式②將寄存器2或存儲器中有符號數與立即數相乘,乘積送寄存器1。XADD是互換并相加指令,它將源操作數與目標操作數相加,結果送目標操作數,同時把原來的目標操作數送源操作數。
例如:IMUL BX,50 ; BX的內容乘50送BX
I MUL DI,[BX+TABLE],3 ; [BX+TABLE]單元的內容乘3送DI
IMUL BX,CX,345H ; CX的內容乘345H送BX
注意:
① IMUL指令是有符號數乘法的增強指令。指令格式中,寄存器為16位通用寄存器,立即數可以是8位或16位的常數。
② 當被乘數為16位,乘數為16位或8位時,乘積有可能超過16位,則超出的高位部分將會丟失,并將進位標志CF和溢出標志OF置1。
③ XADD指令中,源操作數只能是寄存器,目標操作數可以是寄存器或存儲器。操作數類型可以是8位、16位或32位。
④ XADD指令的執行會影響標志位,且改變了源操作數。
3.移位和循環移位指令
指令格式:
SHL d,count
SAL d,count
SHR d,count
SAR d,count
ROL d,count
ROR d,count
RCL d,count
RCR d,count
功能:上述移位指令的功能與相應的基本指令一樣,指令中的常數count用來指定移位或循環移位的次數,常數count的范圍在1~31之間,目標操作數可以是8位或16位的寄存器(或存儲器)操作數。
例如:SHL BX,9 ; 把BX邏輯左移9位
SAR DX,3 ; 把DX算術右移3位
ROR AL,4 ; 把AL循環右移4位
RCL BYTE PTR[BX],17 ; 把BX所指內存單元的內容帶進位循環左移17位
注意:80486增強功能的移位指令與相應基本指令的主要區別在于,其常數count的范圍擴大到31,而基本指令只能是1,大于1時只能用CL寄存器指出。
4.串輸入/輸出指令
指令格式:
INSB (input a byte from DX port)
INSW (input a word from DX port)
OUTSB (output a byte to DX port)
OUTSW (output a word to DX port)
功能:INSB(INSW)指令從DX寄存器指定的端口輸入一個字節(字)傳送至由ES:DI(或EDI)尋址的內存單元。OUTSB(OUTSW)指令從DS:SI(或ESI)尋址的內存單元,輸出一個字節(字)到DX指定的端口中。每次輸入或輸出操作之后,根據方向標志DF的值修改地址指針。當DF=0時,對INSB和OUTSB指令,地址指針加1;對INSW和OUTSW指令,地址指針加2。當DF=1時,相應的地址指針減1或減2。
【例3.22】 要從端口地址為125H的外設端口中輸入200個字節,存放在以邏輯地址2000H:100H為首地址的內存單元中,可以采用如下的串輸入指令:
CLD ; 清方向標志DF=0
MOV AX,2000H
MOV ES,AX ; 置ES為2000H
MOV DI,100H ; 置偏移地址為100H
MOV CX,200 ; 置重復次數為200
MOV DX,125H ; 從125H端口讀取200個字節
REP INSB
注意:① 對OUTSB和OUTSW指令用DS:SI尋址源操作數,對INSB和INSW指令用ES:DI尋址目標操作數。源操作數允許段超越,但目標操作數只能在附加段ES中,不允許段超越。輸入和輸出的端口都由DX指定。
② 每次輸入或輸出操作之后,根據方向標志DF的值修改地址指針。當DF=0時,地址指針為增量,即字節操作時,地址指針加1,字操作時加2。當DF=1時,同理地址指針減1或減2。
③ 指令前可以加重復前綴REP,輸入/輸出將重復進行,重復次數由CX寄存器的值決定。
5.高級語言類指令
高級語言類指令有BOUND(check array against bounds)指令、ENTER(make stack frame for high level)指令和LEAVE(high level procedure exit)指令。
指令格式:
BOUND 寄存器,存儲器地址
ENTER 立即數1,立即數2
LEAVE
功能:BOUND指令是數組邊界檢查指令。它檢查寄存器的內容是否滿足關系式
(存儲器地址)≤(寄存器)≤(存儲器地址+2)
如果不能滿足,則產生一個05H中斷。若滿足關系式,則指令不做任何操作。ENTER指令是設置堆棧空間指令。指令中立即數1是一個16位常數(取值0~FFFFH),表示堆棧空間的字節數;立即數2是一個8位常數(取值0~31),表示允許過程嵌套的級數。LEAVE指令用于撤銷ENTER指令所設置的堆??臻g。
例如:SUBPI PROC NEAR
ENTER 6,0 ; 建立堆棧空間并保留6個字節的局部變量
…
LEAVE ; 撤銷堆??臻g
RET ; 返回
SUBP1 ENDP
6.邏輯運算與移位指令
邏輯運算與移位指令有SHRD(double precision shift right)指令和SHLD(double precision shift left)指令。
指令格式:
SHRD 第一操作數,第二操作數,第三操作數 SHLD 第一操作數,第二操作數,第三操作數
功能:SHRD是雙精度右移指令,它將指定的一些位右移到一個操作數中。SHLD是雙精度左移指令,它將指定的一些位左移到一個操作數中。其中,第一操作數是接收移位的操作數,第二操作數是提供移位的操作數,第三操作數是要移動的位數。
例如:MOV AX,3AF2H
MOV BX,9C00H
SHLD AX,BX,7 ; BX左移7位,移入AX中,結果(AX)=004EH
注意:第一操作數可以是寄存器或存儲器,操作數類型可以是16位或32位;第二操作數只能是寄存器;第三操作數可以是8位立即數或CL寄存器。
7.位操作類指令
位操作指令有BT(bit test)指令、BTC(bit test and complement)指令、BTR(bit test and reset)指令、BSF(bit scan forward)指令和BSR(bit scan reverse)指令。
指令格式:
BT 第一操作數,第二操作數
BTC 第一操作數,第二操作數
BTR 第一操作數,第二操作數
BTS 第一操作數,第二操作數
BSF 目標寄存器,第二操作數
BSR 目標寄存器,第二操作數
功能:BT是位測試指令,檢查由第二操作數指定的位,并將該位復制到CF中。BTC指令用于檢查第二操作數指定的位,將其取反,并復制到CF中。BTR(BTS)指令用于檢查由第二操作數指定的位,并將其復制到CF中,然后將指定位清0(置1)。BSF用于對第二操作數從低位到高位進行掃描測試,當遇到第一個1時,將其位號送入目標寄存器中,如果第二操作數中所有的位均為0,則將零標志ZF置1,否則ZF清0。BSR指令的功能與BSF類似,但BSR指令的掃描方向是從高位到低位。
例如:MOV CX,4
BT [BX] ,CX ;檢測由BX尋址的存儲器中數的位4,且將其狀態復制到進位標志CF中
注意:① BT、BTC、BTR、BTS指令中的第一操作數可以是寄存器尋址,也可以是存儲器尋址。第二操作數可以是寄存器尋址,也可以是立即數。
② BSF和BSR指令中的第二操作數可以是寄存器尋址,也可以是存儲器尋址。
8.根據條件,字節置1(byte set on condition)指令
指令格式:
SETCC 目標操作數
功能:指令助記符中“CC”表示條件。這與條件轉移指令中的條件“CC”一樣,通常以標志寄存器中一個或多個標志位的狀態作為條件。如果條件滿足,則目標操作數字節置1;否則目標操作數字節清0。
例如:SETZ AL ; 如果零標志ZF=1,則AL=1;否則AL=0
SETNZ AL ; 如果ZF=0,則AL=1;否則AL=0
SETNS BYTE PTR[DI+10] ; 如果符號位SF=0,則((DI)+10)=1;否則((DI)+10)=0
注意:目標操作數只能是寄存器或存儲器尋址的8位數。
9.Cache管理類指令
Cache管理類指令有INVD(invalidate Cache)指令、WBINVD(writeback and invalidate data Cache)指令和INVLPG(invalidate TLB entry)指令。
指令格式:
INVD
WBINVD
INVLPG
功能:INVD指令告訴CPU高速緩沖存儲器Cache數據失效(作廢)。WBINVD指令先刷新內部Cache,并分配一個專用總線周期將外部Cache的內容寫回主存,并在以后的一個總線周期將外部Cache刷新。INVLPG指令使TLB中的某一項作廢,如果TLB中含有一個存儲器操作數映像的有效項,則該TLB項被標記為無效。這類指令用于管理80486微處理器內部的8KB Cache。