在微机原理课程中,本章内容非常重要!!!
主要内容:
1,8086/8088指令格式
2,8086指令的寻址方式
3,8086指令系统
8086/8088指令系统采用了一种灵活的、由1-6个字节组成的、变字长的指令格式,包括操作码、寻址方式以及操作数三个部分。
第一字节:操作码字节(OPCODE),规定指令的操作类型
第二字节:寻址方式字节(MOD),规定操作数的寻址方式
字节3~6:依据指令的不同而取舍,可变字长的指令主要体现在这里,一般由它指出存储器操作数地址的位移量或立即数。
第一个字节为操作码,它指出指令所要进行的操作。
W指示操作数类型:
W=0 操作数为字节
W=1 操作数为字
D指示REG操作数的传送方向:
D=0 表示REG操作数为源操作数
D=1 表示REG操作数为目的操作数
第二个字节为寻址方式,它指出所用的两个操作数存放的位置。
REG字段规定了一个寄存器操作数,它是传送方向已由D字段决定
MOD字段用来区分另一个操作数在寄存器中(寄存器寻址)还是在存储器中(存储器寻址)
若为存储器寻址,还用来指出该字节后面有无偏移量、有多少位偏移量。
R/M字段受MOD字段控制。
若MOD=11为寄存器方式,R/M字段将指出第二操作数所在寄存器编号;
若MOD=00、01、10则为存储器方式,R/M字段指出如何计算存储器中操作数的偏移地址。
例:
指令中操作的对象为操作数。8086/8088指令系统中操作数的种类有两种,数据操作数和地址操作数。
1)数据操作数
数据操作数是与数据有关的操作数,即指令中操作的对象是数据。根据其位置可分为:
a,立即数操作数:指令中要操作的数据包含在指令中。
b,寄存器操作数:指令中要操作的数据存放在指’n定的寄存器中。
c,存储器操作数:指令中要操作的数据存放在指定的存储单元中。
d,I/O操作数:即指令中要操作的数来自或送到I/O端口。
对于数据操作数,有四种形式:
① 无操作数
② 单操作数:可以是源操作数,也可以是目的操作数。
③ 双操作数:一个是源操作数,一个是目的操作数。
④ 隐含操作数:可能隐含一个操作数(源或目的),也可能隐含两个操作数。
源操作数:在操作过程中其值不变的操作数。(可以提供数据的操作数)
目的操作数:在操作后可被操作结果代替的操作数。(可以接收数据的操作数
2)地址操作数
地址操作数是指与程序转移地址有关的操作数。即指令中操作的对象不是数据,而是要转移的目标地址。目标地址可能包含在指令、寄存器或存储器中。
对于数据操作数,有的指令有两个操作数,一个称为源操作数(操作过程中,其值不变),另一个为目的操作数(操作后一般被操作结果所代替)。有的指令只有一个操作数、或没有、或有一个、两个隐含的操作数。
对于地址操作数,指令只有一个目的操作数,它是一个供程序转移的目标地址。
所谓寻址方式,就是指指令中给出的寻找操作数的方法。根据操作数的种类,寻址方式分为数据寻址方式和地址寻址方式。
数据寻址方式可以分为:立即数寻址方式、寄存器寻址方式、存储器寻址方式和I/O端口寻址方式四种类型。
立即数寻址方式(Immediate Addressing)立即数寻址方式’re’s’si操作数直接包含在指令中,紧跟在操作码之后,它作为指令的一部分,这种操作数称为立即数。立即数可以是8位的,也可以是16位的。如果是16位数,则高位字节存放在高地址存储单元中,低位字节存放在低地址存储单元中。例如:
立即数寻址方式只能作为源操作数
,主要用来给寄存器或存储单元赋值。
寄存器寻址方式(Register Addressing)
寄存器寻址方式的操作数存放在指令规定的寄存器中,寄存器的名字在指令中指出。
对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP,BP。
对于8位操作数,存储器可以是AH,AL,BH,BL,CH,CL,DH,DL。
存储器寻址方式(Memory Addressing)
存储器寻址方式的操作数存放在存储单元中。操作数在存储器中的物理地址是由段地址左移4位与操作数在段内的偏移地址相加得到的。段地址在实模式和保护模式下可从不同路径取得。在这里,要讨论的是,指令中是如何给出存储器中操作数在段内的偏移地址的。偏移地址又称为有效地址(Effective Address, EA),所以存储器寻址方式即为求得有效地址(EA)的不同途径。
有效地址可由以下三种地址分量组成:
对于某条具体指令,这三个地址分量可有不同的组合。若存在两个及以上的分量,则需要进行加法运算,求出操作数的有效地址(EA),进而求出物理地址(PA)。由于三种地址分量的不同组合,是的对存储其操作数的寻址产生了存储器寻址的若干种不同的方式。
存储器寻址方式可分为直接寻址方式、寄存器直接寻址方式、寄存器相对寻址方式、基址变址寻址方式、基址变址相对寻址方式。
a,直接寻址方式(Direct Addressing):
直接寻址方式的操作数有效地址只包含位移量一种分量,即在指令的操作码后面直接给出有效地址。对这种寻址方式有:EA=位移量。例如:
需要注意的是,这种直接寻址方式与立即数寻址方式有所不同,不同点在于:
从指令的表示形式来看,直接寻址需要对表示有效地址的16位数加上方括号,因为其表示的是地址。
从指令的功能来看,直接寻址的指令中的操作数是一个地址(假设地址为1064H,其存储单元中内容为2222H),代表存储器中的存储单元,根据这个地址取存储单元的内容(即2222H);而立即数寻址方式的指令中的操作数就是要操作的数据内容(2222H)本身。
假设此时的数据段寄存器(DS)=2000H,则该存储单元的物理地址(PA)为:
PA = 2000H * 10H + 1064H = 21064H
若没有特殊指明,直接寻址方式的操作数一般在存储器的数据段中,即默认的寄存器为DS。但是8086/8088允许段超越,此时需要在指令中特别标明,格式是:在有关操作数的前面写上’r操作数所在段的段寄存器名,在加上冒号。例如:若以上指令不在DS,而在ES中,则指令应写为:
MOV AL, ES: [1064H]
b,寄存器间接寻址方式(Register Indirect Addressing):
寄存器间接寻址方式的操作数有效地址只包含基址寄存器(BX)的内容或变址寄存器(SI、DI)的内容
一种分量。因此,操作数的有效地址在某个寄存器中,而操作数本身是在存储器中的数据段内。与寄存器寻址方式对比而言,寄存器寻址方式的操作数本身就在寄存器中。
寄存器间接寻址方式的有效地址表示为:
书写指令时,用做间接寻址的寄存器必须加上方括号,一面与一般的寄存器寻址方式混淆。例如:
同样,间址寄存器间接寻址方式也允许段超越。例如:
MOV ES: [DI], AX
c,寄存器相对寻址方式(Register Relative Addressing):
寄存器相对寻址方式的操作数有效地址EA是一个基址寄存器或变址寄存器的内容和指令中给定的8位或16位位移量相加之和,所以有效地址由两种分量组成。可用做寄存器相对寻址方式的寄存器有基址寄存器BX、BP和变址寄存器SI、DI。
上述位移量可以看成是一个存放于寄存器中的基值的一个相对值,故称为寄存器相对寻址方式。
一般情况下,若指令中指定的寄存器是BX、SI、DI,则存放操作数的段寄存器默认为DS。若指令中指定的寄存器是BP,则对应的段寄存器应为SS。同样,也允许段超越。
位移量既可以是一个8位或16位的立即数,也可以是符号地址。例如:
d,基址变址寻址方式(Based Indexed Addressing):
基址变址方式的操作数有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,所以有效地址由两种分量组成。即:
一般情况下,由基址寄存器决定操作数在哪个段中。若用BX的内容作为基地址,则操作数在数据段中;若用BP的内容作为基地址,则操作数在堆栈段中。但基址变址寻址方式同样也允许段超越。例如:
MOV [BX+DI], AX
MOV AH, [BP][SI]
e,基址变址相对寻址方式(Based Indexed Relative Addressing):
j基址变址相对寻址方式的操作数有效地址是一个基址寄存器与一个变址寄存器内容和指令中指定的8位或16位位移量之和,所以有效地址有三个分量组成。即:
同样,当基址寄存器为BX时,段寄存器应为DS;基址寄存器为BP时,段寄存器应为SS。同样也允许段超越。
I/O端口寻址方式
I/O端口寻址可分为端口直接寻址方式和端口间接寻址方式。
a,端口直接寻址方式
这种寻址方式的端口地址用8位立即数(0~255)表示。例如:
IN AL, 21H
此指令表示从地址为21H的端口读取数据送到寄存器AL中。
b,端口间接寻址方式
当I/O端口地址大于FFH时,必须事先将端口地址存放在DX寄存器中。例如:
MOV DX, 120H
OUT DX, AX
前一条指令将端口地址120H送到DX寄存器,后一条指令j将AX中的内容输出到地址由DX寄存器内容所指定的端口中。
地址寻址方式分为段内直接寻址方式、段内间接寻址方式、段间直接寻址方式和段间间接寻址方式。
段内直接寻址方式
转移的地址是当前IP内容和指令规定的8位或16位位移量之和。
当位移量是8位时,称为短程转移,通常在目标地址前加操作符SHORT;位移量是16位时称为近程转移,在目标地址前加操作符NEAR PTR。
这种寻址方式适用于条件转移或无条件转移类指令。但条件转移只有8位位移量的短程转移。
例:JMP SHORT ALPHA
本例指令是一无条件转移指令,指令采用了段内直接寻址方式。符号地址ALPHA代表位移量。设ALPHA=20H,开始执行该指令时,(CS)=1500H,(IP)=3200H,于是该指令在存储器中的起始地址为:15000H+3200H=18200H
而转移有效地址为:
EA=当前(IP)+ALPHA=3200H+20H=3220H
转移物理地址为:
PA=15000H+3220H=18220H
执行完这条指令后,IP的内容变成3220H(不再是3200H),CPU将转移到存储单元地址18220H中去取指令来执行。
段内直接寻址方式
程序转移的地址存放在寄存器或存储器单元中。指令执行使用寄存器或存储器单元的内容来更新IP的内容。
例如:
JMP BX
JMP WORD PTR ADDR
JMP WORD PTR [BX+ARRY]
例:JMP WORD PTR BETA
本指令是无条件转移指令,可使程序转移到根据BETA指示的内存单元中取出的偏移地址开始执行指令。指令采用的是段内间接寻址方式。指令的操作数地址是一个符号地址BETA,所以可用数据寻址方式中的直接寻址方式得到存储转移偏移地址的内存单元地址。设当前(CS)=0120H,(IP)=2400H,BETA=0100H,(DS)=2000H,(20100H)=00H,(20101H)=27H,则存储转移偏移地址的内存单元地址为:
(DS)左移4位+BETA=20000H+0100H
=20100H
又(20100H)=00H,(20101H)=27H,即转移物理地址为:
PA=01200H+2700H=03900H
执行完这条指令后,IP的内容变成2700H,CPU将转移到存储单元03900H去执行程序。
段间直接寻址方式
这种寻址方式是指令码中直接给出16位的段地址和16位的偏移地址用来更新当前的CS和IP内容。
例:JMP FAR PTR GAMMA
本例指令为无条件转移指令,采用段间直接寻址方式。
设当前(CS)=2000H,(IP)=1000H,GAMMA=3000:4000
则本指令的起始地址为:
20000H+1000H=21000H
转移物理地址为:
PA=30000H+4000H=34000H
执行完这条指令后,CS的内容变成3000H,IP的内容变成4000H,从而程序转移到存储单元34000H开始执行。
例:JMP DWORD PTR DELTA[BX]
本例指令是无条件转移指令,采用段间间接寻址方式。
设当前(CS)=1000H,(IP)=0100H,(DS)=2000H,(BX)=3000H,DELTA=0040H,(23040H)=00H,(23041H)=50H,(23042H)=00H,(23043H)=30H,则间接存储地址按寄存器相对寻址为:
(DS)左移4位+(BX)+DELTA=20000H+3000H+0040H=23040H
于是,可得转移地址为:
3000H:5000H
即转移物理地址为:
PA=30000H+5000H=35000H
执行本指令后,CS的内容和IP的内容分别变成3000H和5000H,程序转移到存储单元35000H开始执行。
指令执行前:
(CS)=1000H
(IP)=0100H
(BX)=3000H
DELTA=0040H
指令执行后:
(CS)=3000H
(IP)=5000H
8086/8088的指令系统大致可分为以下六种类型:
数据传送指令
算术运算指令
位操作指令
串操作指令
程序控制指令
处理器控制指令
1)通用数据传送指令
2)输入/输出指令
3)目标地址传送指令
4)标志传送指令
1)算术运算的数据类型
2)算术运算指令对标志位的影响
3)二进制运算指令
4)十进制数(BCD码)运算指令
1)逻辑运算指令
2)移位指令
3)循环移位指令
1)串传送指令MOVS(MOVe String)
2)串装入指令LODS(LOaD String)
3)串送存指令STOS(STOre String)
4)串比较指令CMPS(CoMPare String)
5)串扫描指令SCAS(SCAn String)
1)转移指令
2)循环控制指令
3)过程调用与返回指令
4)中断指令
1)标志位操作指令
2)外部同步指令
3)空操作指令 NOP(No OPeration)