![微机原理与接口技术(基于32位机)](https://wfqqreader-1252317822.image.myqcloud.com/cover/805/656805/b_656805.jpg)
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新增加的指令
![](https://epubservercos.yuewen.com/FACD48/3590319004139201/epubprivate/OEBPS/Images/Figure-0120-22866.jpg?sign=1739193097-g9SVwmeMwu43BOKdyiRK0DH8doN4z5GF-0-682b553f6c06674071c73333bf8ff401)
3.4.2 80486微处理器增强功能的指令
80486微处理器增强功能指令见表3.12。
表3.12 80486 CPU增强功能指令
![](https://epubservercos.yuewen.com/FACD48/3590319004139201/epubprivate/OEBPS/Images/Figure-0121-22868.jpg?sign=1739193097-N3CZ6LaiNUvxyTEYjnM4JDrNKUNlDDBf-0-378dc70f23e4a40f55f763b2b66f3f19)
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。