微机原理与接口技术(基于32位机)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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新增加的指令

3.4.2 80486微处理器增强功能的指令

80486微处理器增强功能指令见表3.12。

表3.12 80486 CPU增强功能指令

3.4.3 80486微处理器新增指令功能简介

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指令所设置的堆栈空间。

例如:SUBPI PROC NEAR

      ENTER 6,0 ; 建立堆栈空间并保留6个字节的局部变量

      …

      LEAVE ; 撤销堆栈空间

      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。