微机原理与接口技术 第3章 8086指令系统 朱华贵 2015年09月25日
微机原理与接口技术 寻址方式 朱华贵 2015年09月25日
3.1 概述 指令是指挥计算机进行操作的命令。 指令系统是指微处理器能执行的各种指令的集合。 程序是一系列按一定顺序排列的指令。 执行程序的过程就是计算机的工作过程。 微处理器的主要功能由它的指令系统来体现。 不同的微处理器有不同的指令系统,其中每一条指令对应着处理器的一种基本操作,这在设计微处理器时确定。
指令格式 通常一条指令包括两部分: 指令的一般格式如下: 操作码 [操作数1,操作数2,……,操作数n] 操作码:决定要完成的操作 操作数:指参加运算的数据或是该数所在的内存单元的地址。 指令的一般格式如下: 操作码 [操作数1,操作数2,……,操作数n] 没有操作数的指令称为无操作数指令。 有两个操作数的指令称为双操作数或二地址指令。 操作码和操作数地址都由二进制数码表示,整条指令以二进制编码的形式存放在存储器中。
操作数来源 指明操作数所在的地方。 操作数有三种来源: 1、操作数在指令中,称立即数操作数; 如:MOV AL,9 2、操作数在寄存器中,称寄存器操作数; 3、操作数在内存单元中,称存储器操作数或内存操作数。用[ ]表示存储器操作数。 如:MOV AL,[2000H]
指令操作数类型 指令应指明参与操作的数字节还是字,即操作数的类型。 1、指令中有寄存器操作数,由寄存器操作数决定操作数类型; 例: MOV [BX],AL;字节操作 [BX] ← AL MOV [BX],AX;字操作 [BX] ← AL,[BX+1] ← AH 在DEBUG下查看指令代码 D:\>DEBUG -A 13A0:0100 MOV [BX],AL 13A0:0102 MOV [BX],AL 13A0:0104 -U 100 13A0:0100 8807 MOV [BX],AL 13A0:0102 8907 MOV [BX],AX …… 两条指令的机器码是不同的:0788H,0789H
2、指令操作数中无寄存器,则有内存操作数的类型决定;若无则需对存储器操作数加类型说明。 例:MOV WORD PTR [BX],0 MOV BYTE PTR [BX],0
指令系统与寻址方式的重要性 采用不同CPU的计算机的指令系统不同。 采用不同CPU的计算机的指令的格式不同。 要使用某种微处理器,必须先要掌握其指令系统和各指令允许的寻址方式。
3.2 8086寻址方式 寻址方式: 指令中给出的求出操作数有效地址的方法。 寻址操作: 计算机按照指令给出的寻址方式求出操作数有效地址的过程。
8086的七种基本的数据寻址方式 存储器寻址方式 (1)立即寻址; (2)寄存器寻址; (3)直接寻址; (4)寄存器间接寻址; (5)寄存器相对寻址; (6)基址变址寻址; (7)相对基址加变址寄存器寻址。 存储器寻址方式
3.2.1 立即寻址 操作数直接出现在指令中,此时的操作数也叫立即数。 立即数紧跟在操作码后面,一起存放在代码段中。 例如: MOV AX,2010H 在该指令格式中,AX是目标操作数,2010H是源操作数。
立即寻址方式的指令执行示意图
立即寻址方式说明 在所有的指令中,立即数只能作源操作数,不能作目标操作数。 立即数应与目标操作数的长度一致。 立即数默认采用十进制形式,以十六进制形式出现的立即数应以字母H为后缀,以八进制形式出现的立即数应以字母Q为后缀。 以十六进制形式出现的立即数,若以字母开头,则必须以数字0为前缀。 立即数还可以用表示+、-、×、/表示的算术表达式,也可以用圆括号改变运算顺序。 立即数只能是整数,不能是小数、变量或其它类型的数据。
3.2.2 寄存器寻址 操作数在寄存器中,在指令中指定寄存器号。 由于寄存器号短,因此,采用寄存器寻址方式的指令的机器码长度短。 操作数在寄存器中,指令执行时,操作就在CPU的内部进行,不需要通过访问存储器来取得操作数,因而指令的执行速度快。 在编程中,如有可能,应尽量在指令中使用这种寻址方式。 例如: MOV AX,2010H
寄存器寻址方式可用的寄存器 对于16位操作数,寄存器可以是: 对8位操作数,寄存器可以是: AX,BX,CX,DX SI,DI,SP,BP CS,DS,SS和ES 对8位操作数,寄存器可以是: AH,AL BH,BL CH,CL DH,DL
寄存器寻址方式指令执行示意图
寄存器寻址方式说明 在一条指令中,寄存器寻址方式既可用于源操作数,也可用于目标操作数,还可以两者都用寄存器寻址方式。 源操作数与目标操作数的长度应一致。例如,不能将寄存器AX的内容传送到寄存器BH中,也不能将寄存器BH的内容传送到寄存器AX中。 两个操作数不能同时为段寄存器。 目标操作数不能是代码段寄存器。
5种与内存单元有关的寻址 1、操作数存放在内存中,取完指令后还需到内存取数; 2、指令中给出的该操作数的地址,包括段地址和偏移地址;指令中用[ ] 给出偏移地址。 3、按给出偏移地址方式的不同,分为以下5种: 直接寻址: MOV AL,[1000H] 寄存器间接寻址: MOV AL,[BX] 寄存器相对寻址: MOV AL,[BX+10H] 基址加变址寄存器寻址:MOV AL,[BX+SI] 相对基址加变址寄存器:MOV AL,[BX+SI+10H] 除直接寻址外,内存操作数地址只能由BX/BP、SI/DI给出。
3.2.3 直接寻址 操作数在存储器中,指令中以具体数值的形式直接给出操作数所在存储单元的有效地址EA。为了与立即数区别,该有效地址必须用[ ]括起。 例如: MOV AX,[2010H] 该指令的源操作数采用直接寻址方式。 若(DS)=2000H,那么指令执行后,(AX)=1225H。 段基地址 EA 操作数 + 指令 存储器
直接寻址方式指令执行示意图
采用直接寻址方式时,如果指令中没有用前缀说明操作数存放在哪个段,则操作数默认存放在数据段。 8086系统允许操作数存放在代码段、堆栈段或附加段。此时,就需要在指令中指明段超越。 例如: MOV ES:[1225H],AX 该指令的目标操作数采用直接寻址方式。操作数存放在由ES指示的附加段中。 物理地址=ES×10H+1225H。
在汇编语言指令中,可以用符号地址代替数值地址。 例如: MOV AX,NUMA 上面这条指令还可以写成如下的形式: 如DATA1数据存放在附加段,则可以用如下的形式指定段跨越前缀: MOV AX,ES: NUMA 或 MOV AX,ES:[ NUMA]
直接寻址示例1 MOV AX, [1000H] 物理地址 设(DS)=10A0H 代码段 + OP 00H 10H 数据段 代码段 + OP 00H 10H 数据段 11A00H 30H 50H 1000H 10A0H 10A00H 1000H 低地址 11A00H 11A00H 主意提醒段地址×16(左移4位) 30H 50H AX 50H 30H (本章中图示存储器地址从上到下递增)
直接寻址示例2 MOV BL, ES:[0100H] 物理地址 设(ES)=3000H 30000H (DS)=2000H + 0100H 30100H 4B 00 BL 0100H 3000H 30100H 30100H 4B 4B 在汇编语言指令中,可以用符号地址代替数值地址 如:MOV AX, BUFF 或 MOV AX, [BUFF] 其中BUFF为存放数据单元的符号地址。
3.2.4 寄存器间接寻址 操作数的有效地址EA存放在基址寄存器BX、BP或变址寄存器SI、DI中。 为了区别于寄存器寻址方式,指令中指定的寄存器名要用[ ]括起来。 指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。 操作数的物理地址=(DS)×10H+(SI)/(DI)/(BX) 或 (SS)×10H+(BP)
例如: MOV AX,[SI] 该指令的源操作数采用寄存器间接寻址方式。 若(DS)=2000H,(SI)=2010H,那么指令执行后,(AX)=1225H。 如操作数不存放在间址寄存器默认的段,则指定段超越的指令可采用如下形式。 MOV AX,ES:[SI] 此时,操作数的物理地址=ES×10H+SI。
寄存器间接寻址方式指令执行示意图
… MOV AH, [BP] MOV BX, [SI] MOV CX, SI 设 (SS)=1000H, (DS)=2000H , (BP)=0B10H, (SI)=032AH 物理地址 物理地址 10000H 20000H + 0B10H + 032AH 40H 00H 3EH 46H 1000H 2000H 0B10H 032AH 10B10H 10B10H 2032AH 2032AH AH 10B10H 40H 032AH 40H 032AH SI 10B11H … 032AH CX 2032AH 3EH 463EH BX 2032BH 46
3.2.5 寄存器相对寻址 操作数的有效地址EA是指令中指定的基址或变址寄存器的值与位移量之和。 指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。 操作数的物理地址=(DS)×10H+(SI)/(DI)/(BX)+8位或16位位移量 或 =(SS)×10H+(BP)+8位或16位位移量
例如: MOV AX,8[BX] 该指令的源操作数采用寄存器相对寻址方式。 若(DS)=2000H,(BX)=2008H,那么指令执行后,(AX)=1225H。
寄存器相对寻址方式的指令执行示意图
寄存器相对寻址说明 偏移量是符号数,8位偏移量的取值范围为:00~0FFH(即+127D~-128D); 16位偏移量的取值范围为:0000~0FFFFH(即+32767D~-32768D)。 8086汇编允许用下面三种形式表示相对寻址,它们是等效的。 MOV AX,[BX]+8 MOV AX,8[BX] MOV AX,[BX+8]
3.2.6 基址加变址寄存器寻址 操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值之和。 指令中使用基址寄存器BX时,操作数默认存放在数据段中; 使用基址寄存器BP时,操作数默认存放在堆栈段中,允许段超越。 操作数的物理地址 =(DS)×10H+ (BX) + (SI)/(DI) 或 =(SS)×10H+ (BP) + (SI)/(DI)
例如: MOV AX,[BX] [SI] 该指令的源操作数采用基址变址寻址方式。 若(DS)=2000H,(BX)=2008H,(SI)=8H; 则指令执行后,(AX)=1225H。
基址变址寻址方式的指令执行示意图
3.2.7 相对基址加变址寄存器寻址 操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值以及8位或16位位移量之和。 指令中使用基址寄存器BX时,操作数默认存放在数据段中; 使用基址寄存器BP时,操作数默认存放在堆栈段中; 允许段超越。 操作数的物理地址PA =(DS)×10H+ (BX)+ (SI)/(DI)+8位或16位位移量 或 =(SS)×10H+ (BP)+ (SI)/(DI)+8位或16位位移量
例如: MOV AX,3[BX] [SI] 该指令的源操作数采用寄存器相对寻址方式。 若(DS)=2000H,(BX)=2008H,(SI)=5H,那么指令执行后,(AX)=1225H。
相对基址加变址寄存器寻址方式的指令执行示意图
利用DEBUG学习寻址方式 在DEBUG下汇编下列指令,并查看每条指令执行后的结果: MOV BX,2000H MOV [BX],CS 用R命令是否可以? 操作数[BX]在哪里? 它的内存地址如何构成?