80486微处理器的寻址方式
要使微处理器能够完成指令规定的操作,则指令中须包含2种信息,一是执行什么操作;二是该操作所涉及的数据在哪里;三是结果存于何处,故指令通常操作由操作码字段和操作数字组成,其书写格式如下:
标号:操作码助记符 操作数助记符;注释
寻找操作数所在地址的方式即为寻址方式。80486的寻址方式可分为两类:操作数的寻址方式和转移地址的寻址方式。
操作数寻址方式
由于操作数作为指令的操作对象,可以存储在存储器中(称为存储器操作数)、存储在寄存器中(称为寄存器操作数)或直接包含在指令中(称为立即数),因此,与之对应有多种寻址方式。80486粗略地划分可有3类10种寻址方式,其中访问存储器操作数有8种寻址方式。
1、立即寻址 操作数直接存放在指令中的寻址方式即为立即寻址方式
例如:MOV AX ,1234H
如下图所示,这条指令的机器码为:B8H,34H,12H,占3个字节。它的含义是将立即数1234H送到寄存器AX中。机器码在内存单元中是由上至下按从低到高的地址顺序排列的,这也是一般CPU取指令的顺序。操作码部分在前,操作数部分在后。其中16位立即数的低字节在前,高字节在后。
汇编语音规定:立即数必须以数字开头,以字母开头的十六进制数前面必须以数字0做前缀;数制用后缀表示:B表示二进制数,H表示十六进制数,D或者缺省表示十进制数,Q表示八进制数。
2、寄存器寻址:在这种寻址方式下,操作数存放在CPU的某个8位、16位或32位的通用寄存器中。
例如:MOV AH,CL;将CL的内容送AH。
3、存储器操作数的寻址方式 当操作数存放在某内存单元中时,用该类寻址方式。在该类寻址方式中,指令中出现的是操作数所在内存单元的地址表达式,完整的地址表达式如下:
段寄存器:[基址寄存器+变址寄存器X比例因子+位移量]
冒号之前的部分称为段超越前缀,它通知CPU指令要访问的是哪一个逻辑段,冒号之后的部分为有效地址表达式。
根据指令中出现的操作数所在内存单元的地址表达式的不同,该类寻址方式共有8种,下面将详细介绍这8种存储器寻址方式。
1、直接寻址
直接寻址是指操作数所在内存单元的EA直接出现在指令中。EA可以是8位,16位或32位。例如:
MOV AX,DS:[1000H];将DS数据段中有效地址为1000H字单元中的内容送给AX。
若(DS)=2000H,则物理地址=20000H+1000H=21000H,执行情况如下图所示。执行结果为(AX)=1234H。应注意的是,指令中的DS不能省略。又如:
MOV CX,DS:COUNT;将DS数据段中以COUNT为有效地址的字单元中的内容;送给CX或MOVCX,COUNT。
2、寄存器间接寻址
这种寻址方式下,操作数所在内存单元的EA由规定的寄存器指出。在该寻址方式中,80486微处理器规定:
·16位寻址时,EA可以由SI,DI,BP或BX提供。
若以SI,DI,BX间接寻址,则默认操作数在DS段中。
MOV AX,[SI]
设(DS)=4200H,(SI)=5000H,则物理地址=42000H+5000H=47000H,执行情况如下图所示。执行结果:(AX)=3525H
若以BP间接寻址,则默认操作数在SS段中。
MOV CH,[BP]
设(SS)=3000H,(DS)=3500H,(BP)=1340H,则该指令执行后,将31340H单元的内容送给CH。
·32位寻址时,8个32位通用寄存器均可作间址寄存器。除ESP,EBP默认段寄存器为SS外,其余6个通用寄存器均默认段寄存器为DS。例如:
MOV EDX,[EBX]
(3)寄存器相对寻址方式 在这种方式中,操作数所在内存单元的有效地址为规定的基址寄存器或变址寄存器的内容与一个常量(即位移量)之和。在指令格式中,地址表达式写成:
段寄存器:[基址寄存器/变址寄存器+位移量]
或 段寄存器:位移量[基址寄存器/变址寄存器]
如果是访问约定的逻辑段,则段前缀可以省略。80486微处理器规定:
·16位寻址时,BX和BP作为基址寄存器,BX默认DS为段寄存器,BP默认SS为段寄存器;SI和DI作为变址寄存器。位移量可以为8位或16位。
·32位寻址时,8个32位通用寄存器均可作基址/变址寄存器,其中ESP、EBP以SS为默认段寄存器,其余6个通用寄存器均以DS为默认段寄存器。位移量可以为8位或32位。例如:
MOV EBX,[EDX+24]
(4)基址寻址方式
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。在指令格式中,地址表达式写成:
段寄存器:[基址寄存器+变址寄存器]
(5)相对基址变址寻址方式
该方式中,操作数所在的内存单元的有效地址是一个基址寄存器与一个变址寄存器的内容和一个常量(即位移量)之和。在指令格式中,完整的地址表达式为:
段寄存器:[基址寄存器+变址寄存器+位移量]
或 段寄存器:位移量[基址寄存器+变址寄存器]
或 段寄存器:位移量[基址寄存器][变址寄存器]
(6)比例变址寻址方式
操作数的EA是变址寄存器的内容乘以指令中指定比例因子再加上位移量之和,所以EA由三种成份组成。在指令格式中,完整的地址表达式为:
段寄存器:[变址寄存器X比例因子+位移量]
或 段寄存器:位移量[变址寄存器X比例因子]
(7)基址比例变址寻址方式
操作数的EA是变址寄存器的内容乘以比例因子再加上基址寄存器的内容之和,所以有效地址由三部分组成。在指令格式中,完整的地址表达式为:
段寄存器:[变址寄存器X比例因子+基址寄存器]
或 段寄存器:[基址寄存器][变址寄存器X比例因子]
(8)相对基址比例变址寻址方式
操作数的EA是变址寄存器的内容乘以比例因子,加上基址寄存器的内容,再加上位移量之和,所以有效地址由4部分组成。在指令格式中,完整的地址表达式为如下格式:
段寄存器:[基址寄存器+比例因子X变址寄存器+位移量]
或 段寄存器:位移量[基址寄存器+比例因子X变址寄存器]
或 段寄存器:位移量[基址寄存器][比例因子X变址寄存器]
转移地址寻址方式
在指令系统中,有一组指令被用来控制程序的执行顺序,即按需要修改IP或修改IP和CS的内容,这组指令被称为程序转移指令。
(1)段内直接寻址
转移的目标地址是当前IP寄存器的内容和一个8位或16位位移量之和。位移量为8位时,称为短程转移;位移量为16位时,称为近程转移。这种寻址方式适用于条件转移及无条件转移指令,但是当它用于条件转移指令时,位移量只允许8位(386及其后继机型条件转移指令的位移量可为8位或32位)。
指令的汇编语言格式表示为:
JMP NEAR PTR PROGRM
JMP SHORT OUTSET
(2)段内间接寻址
该方式中,转移的目标地址是寄存器或存储单元的内容。寄存器或存储单元的内容可以用数据寻址方式中除立即数以为的任何一种寻址方式取得,所得到的内容将用来取代IP寄存器的值。
段内间接寻址转移指令的汇编格式可以表示为:
JMP CX
JMP WORD PTR[BX+TAB1]
(3)段间直接寻址
这种寻址方式用于段间转移,指令中直接提供了目标地址的段基址和偏移地址,所以,只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段基址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作。
指令的汇编语音格式可表示为:
JMP FAR PTR NEXT
(4)段间间接寻址
该方式下,用存储器中两个相继字的内容来取代IP和CS寄存器中的原始内容,以达到段间转移的目的。这里,存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得。这种指令的汇编语言格式可表示为:
JMP DWORD PTR [REL+BX]
80486微处理器的指令系统
80X86的指令系统向上兼容,都是在8086指令的基础上发展形成的。与80286相比,增加了32位操作和访问存储器的32位寻址方式。
80486可以工作在实模式、保护模式和虚拟86模式,为了支持系统工作模式,指令系统中设计了系统管理指令、保护模式控制指令以及高级语言支持指令等等。
80486的基本指令按功能可分为7类:
1、数据传送指令
2、算术运算指令
3、逻辑运算指令
4、字符串操作指令
5、控制转移指令
6、处理器控制指令
7、条件设置字节指令
数据传送指令
1、通用数据传送指令
(1)基本传送指令MOV
格式:MOV 目标操作数,源操作数
功能:把源操作数的内容复制到目标操作数中。源操作数不变,不影响状态标志。
说明:
①、源操作数可以是8位、16位或32位的立即数、寄存器、段寄存器或存储器操作数,目标操作数是与源操作数等长的寄存器、段寄存器(CS除外)或存储器操作数。
②、源操作数和目标操作数不能同时为存储器操作数。
③、源操作数和目标操作数不能同时在段寄存器中。
④、立即数不能作为目标操作数。
⑤、不能将立即数直接传送到段寄存器。
⑥、当目标操作数为非直接寻址的存储器操作数时,如源操作数是单字节的立即数,则应用PTR运算符说明目标操作数的属性,否则将被默认为字型操作数。例如:
MOV BYTE PTR[X],55H;55H送给数据段BX间址的字节型单元
MOV [BX],55H ;0055H送给数据段BX间址的字型单元
(2)符号扩展传送指令MOVSX
格式:MOVSX 目标操作数,源操作数
功能:将源操作数的符号位向高位扩展,使其与目标操作数字长相同,然后再传送到目标操作数,而源操作数不变。
MOV DL,-16 ;DL=F0H
MOVSX BX,DL ;BX=FFF0H,而DH,DL不变
(3)零扩展传送指令MOVZX
格式:MOVZX 目标操作数,源操作数
功能:将源操作数高位用0补足16或32位,然后再传送到目标操作数。
MOVZX EAX,CX; 将CX中16位数高位加0扩展为32位送入EAX
MOVSX和MOVZX 这两条指令常被用于作除法时对被除数位数的扩展。
(4)交换指令XCHG
格式:XCHG 目标操作数,源操作数
功能:将源操作数和目标操作数的内容交换
(5)地址传送指令
1、EA传送指令。
格式:LEA 目标操作数,源操作数
功能:将源操作数的EA(即偏移地址)送到目标寄存器中。
说明:
a.目标操作数为16位或32位的寄存器,源操作数为存储器操作数。
b.LEA指令可以用MOV指令代替。例如:
TABLE DB 31H,32H,33H,34H
……
LEA DI,TABLE
等效于MOV DI,OFFSET TABLE
MOV指令用伪指令运算符OFFSET取得内存单元的EA,由汇编程序在汇编时赋值;LEA指令是在执行指令时赋值。
2、指针传送指令
格式:LDS/LES/LFS/LGS/LSS目标操作数,源操作数
功能:将源操作数数据的段基址和偏移量分别送入指定的段寄存器和目标操作数。
(6)查表转换指令XLAT
格式:XLAT
功能:完成一个字节的查表转换功能。将DS:[BX+AL]字节单元或DS:[EBX+AL]字节单元的内容送给AL。
说明:该指令执行前应做以下准备工作:
1、在数据段中建立一张表,该表的最大长度为256B。
2、BX(EBX)中存放该表的首地址,AL中存放表内偏移量。该指令执行后,AL中存放转换结果。
例如:利用查表转换功能实现一位十六进制数与ASCⅡ码的转换。
DATA SEGMENT
TAB DB ‘0123456789ABCDEF’
NUM DB ?;0~F中的任一数
DATA ENDS
代码段设置如下指令,即可查出与NUM单元中的数相对应的ASCⅡ编码:
MOV DS,DATA
MOV DS,AX
MOV BX,OFFSET TAB
MOV AL,NUM
XLAT
(7)字节交换指令BSWAP
格式:BSWAP 32位寄存器
功能:将32位寄存器的4个字节交换顺序,即将32位操作数的位31到位24与位7到位0交换、位23到位16与位15到位8交换。
(8)标志寄存器传送指令LAHF/SAHF
格式:
LAHF
SAHF
功能:LAHF将EFLAGS的低字节传送到AH中,SAHF将AH的内容传送到EFLAGS的低字节中。
2、堆栈操作指令
(1)压栈指令PUSH
格式:PUSH源操作数
功能:SP(ESP)=SP(ESP) -2(16位操作数)或SP(ESP)=SP(ESP)-4(32位操作数),源操作数压入SS:[SP(ESP)]指向的2个字(或双字)单元。
说明:
①、源操作数可以是16位或32位的立即数、存储器操作数、寄存器或段寄存器操作数。
②、如果源操作数是SP或ESP,则将调整前的SP或ESP压栈。
(2)弹栈指令POP
格式:POP 目标操作数
功能:首先从SS:[SP(ESP)]所指的栈顶内弹出给16位或32位的目标操作数,SP(ESP)=SP(ESP)+2
说明:目标操作数可以是存储器操作数通用寄存器或除CS之外的段寄存器。
(3)16位标志寄存器压栈/弹栈指令PUSHF/POPF
格式:
PUSHF
POPF
功能:执行PUSHF时,首先,SP=SP-2,然后,标志寄存器低16位压入SS:[SP]的2个单元。执行POPF时,先从栈顶弹出2B给标志寄存器低16位,然后SP=SP+2.
(4)32位标志寄存器压栈/弹栈指令PUSHFD/POPFD
格式:
PUSHFD
POPFD
功能:执行PUSHFD时,首先,(ESP)=(ESP)-4,然后,32位标志寄存器压入SS:[ESP]的4个单元。执行POPFD时,先从栈顶弹出4B给32位标志寄存器,然后(ESP)=(ESP)+4
(5)全部16位通用寄存器压栈/弹栈指令PUSHA/POPA
(6)全部32位通用寄存器压栈/弹栈指令PUSHAD/POPAD
3、I/O指令
(1)、直接寻址的I/O指令
格式:
IN AL/AX,PORT
OUT PORT,AL/AX
功能:
IN指令从指定端口把字节、字或双字数据传送到AL,AX或EAX中;OUT指令把AL,AX或EAX中的字节或字数据传送到指定端口。
说明:
当端口地址<=255时,可以采用直接寻址方式。
(2)、DX间址的I/O指令
格式:
IN AL/AX/EAX,DX
OUT DX,AL/AX/EAX
功能:
IN指令从DX指定的端口把字节或字数据传送到AL,AX或EAX中;OUT指令把AL,AX或EAX中的字节或字数据传送到DX指定的端口。
说明:
用间接寻址方式,最大可寻址64KB个端口,即可访问0~64KB中的任一端口,端口的地址必须放在DX寄存器中。数据传送类指令中除SAHF和POPF指令外,其余均不影响标志。
算术运算指令
基本四则运算
(1)加法指令:ADD
格式:ADD 目标操作数,源操作数
功能:目标操作数=源操作数+目标操作数
(2)带进位加法指令ADC
格式:ADC 目标操作数,源操作数
功能:目标操作数=源操作数+目标操作数+进位标志CF
(3)减法指令SUB
格式:SUB 目标操作数,源操作数
功能:目标操作数=目标操作数-源操作数
(4)带借位减法指令SBB
格式:SBB 目标操作数,源操作数
功能:目标操作数=目标操作数-源操作数-借位标志CF
(5)加1指令INC和减1指令DEC
格式:
INC 目标操作数
DEC 目标操作数
功能:
执行INC指令后,目标操作数=目标操作数+1;
执行DEC指令后,目标操作数=目标操作数-1。
(6)求补指令NEG
格式:NEG 目标操作数
功能:目标操作数=0-目标操作数
(7)交换加法指令XADD
格式:XADD 目标操作数,源操作数
功能:将源操作数和目标操作数进行互换,然后将源操作数与目标操作数之和送给目标操作数。指令执行后的源操作数是指令执行前的目标操作数。
(8)比较指令CMP
格式:CMP 目标操作数,源操作数
功能:目标操作数-源操作数
(9)比较并交换指令CMPXCHG
格式:CMPXCHG 目标操作数,源操作数
(10)无符号数乘法指令MUL
格式:MUL 源操作数
(11)带符号乘法指令IMUL
格式:
IMUL 源操作数
IMUL 目标操作数,源操作数
IMUL 目标操作数,源操作数,立即数
(12)无符号数除法DIV/带符号数除法IDIV
格式:
DIV 源操作数
IDIV 源操作数
(13)符号位扩展(数据宽度变换)指令CBW,CWD,CWDE,CDQ
格式:CBW/CWD/CWDE/CDQ
十进制调整指令
格式:
DAA ;组合BCD码数的加法调整指令
DAS;组合BCD码数的减法调整指令
AAA;分离BCD码数的加法调整指令
AAS;分离BCD码数的减法调整指令
AAM;分离BCD码数的乘法调整指令
AAD;分离BCD码数的除法调整指令
逻辑运算指令和移位指令
1、逻辑运算指令
(1)逻辑与/或/异或指令AND/OR/XOR
格式:AND/OR/XOR 目标操作数,源操作数
功能:将目标操作数与源操作数按位进行逻辑与、或、异或操作,结果存入目标操作数中。
(2)测试指令TEST
格式:TEST目标操作数,源操作数
(3)逻辑非指令NOT
格式:NOT 操作数
2、移位指令
(1)算术/逻辑左移指令SAL/SHL
格式:SAL/SHL 操作数,移位次数
功能:将操作数逐位向左移动一位,把最高有效位MSB移进CF,最低有效位LSB处自动补0
(2)算术/逻辑右移指令SAR/SHR
格式:SAR/SHR操作数,移位次数
功能:将操作数向右移位,每右移一位,把最低有效位LSB移进CF。对于SAR,最高有效位MSB保持不变,对于SHR,MSB自动补0
(3)双精度左移/右移指令SHLD/SHRD
格式:SHLD/SHRD 目标操作数,源操作数,移位次数
(4)循环移位指令ROL/ROR/RCL/RCR
格式:ROL/ROR/RCL/RCR 操作数,移位次数
功能:ROL/ROR将操作数循环左移/右移;RCL/RC将操作数和CF一起循环左移/右移。
3、位测试指令与位扫描指令
(1)位测试指令
格式:
BT 目标操作数,源操作数;位测试
BTS 目标操作数,源操作数;位测试置1
BTR 目标操作数,源操作数;位测试清0
BTC 目标操作数,源操作数;位测试取反
(2)向前位扫描指令 BSF
格式:BSF 目标操作数,源操作数
字符串操作指令
1、串传送指令 MOVS/MOVSB/MOVSW/MOVSD
格式:MOVS 目标操作数,源操作数
功能:把由DS:SI指向的字节、字或双字存储单元的内容复制到由ES:[DI](或[EDI])指向的存储单元中去。
2、取串指令 LODS/LODSB/LODSW/LODSD
格式:LODS 源操作数
3、存串指令STOS/STOSB/STOSW/STOSD
格式:STOS 目标操作数
4、串比较指令CMPS/CMPSB/CMPSW/CMPSD
格式:CMPS 目标操作数,源操作数
功能:将DS[SI]指向的字节或存储单元的内容与由ES:[DI](或[EDI])指向的存储单元的内容相比较(相减),比较结果不保存。
5、串搜索指令SCAS/SCASB/SCASW/SCASD
格式:SCAS 目标操作数
6、从端口输入字符串指令INSB/INSW/INSD
格式:INSB
7、向端口输出字符串OUTSB/OUTSW/OUTSD
格式:OUTSB
8、重复前缀REP
格式:
REP MOVS
REP STOS
REP OUTS
REP INS
9、条件重复前缀REPE/REPZ/REPNE/REPNZ
格式:
REPE/ERPZ CMPS
REPE/ERPZ SCAS
REPNE/ERPNZ CMPS
REPNE/ERPNZ SCAS
控制转移指令
1、无条件转移指令JMP
格式:JMP 目标操作数
2、条件转移指令
格式:指令助记符 转移地址标号
3、循环控制转移指令
格式:
LOOP 转移地址标号
LOOPE/LOOPZ 转移地址标号
LOOPNE/LOOPNZ 转移地址标号
JCXZ 转移地址标号
4、过程调用指令CALL
格式:CALL 目标操作数
5、过程返回指令RET
格式:RET/RET n
6、中断调用与中断返回指令
(1)中断调用指令
格式:
INT N
INTO
(2)中断返回指令
格式:IRET
处理器控制指令
1、单个标志位操作指令
2、处理器暂停指令HLT
3、处理器脱离指令ESC
4、处理器等待指令WAIT
5、总线锁定前缀¯¯¯¯LOCK¯¯¯¯
6、空操作指令NOP
按条件设置字节指令
格式:SETxx 目标操作数