860 likes | 982 Views
第 3 章 指令系统和寻址方式. 3.1 指令系统概述 3.2 8088/8086CPU 的寻址方式 3.3 指令的机器码表示方法(略) 3.4 8088/8086CPU 的指令系统. 3.1 指令系统概述. 1、指令、指令系统和程序 指令 是 CPU 能执行的一个基本操作。 如:取数、加、减、乘、除、存数等 指令系统 是 CPU 所能执行的全部操作,即全部指令的集合 。 不同的 CPU, 其指令系统不同。 程序 是用户在使用计算机时,针对要解决的问题, 用一条条指令编写的指令的序列 。.
E N D
第3章 指令系统和寻址方式 3.1指令系统概述 3.2 8088/8086CPU的寻址方式 3.3 指令的机器码表示方法(略) 3.4 8088/8086CPU的指令系统
3.1指令系统概述 • 1、指令、指令系统和程序 • 指令是CPU能执行的一个基本操作。 • 如:取数、加、减、乘、除、存数等 • 指令系统是CPU所能执行的全部操作,即全部指令的集合。 不同的CPU,其指令系统不同。 • 程序是用户在使用计算机时,针对要解决的问题, 用一条条指令编写的指令的序列。
*一个CPU能执行什么操作,是工程人员设计和制造好的,是固定的,用户不能改变。*一个CPU能执行什么操作,是工程人员设计和制造好的,是固定的,用户不能改变。 构成程序的指令在存储器中一般都是顺序存放,要破坏这种顺序性,必须由转移指令操作。 2、指令组成 计算机中指令由操作码和操作数两部分组成。一条指令可以由1~6个字节组成。 操作码-----指示计算机要执行的操作, 操作数-----指出在指令执行操作过程中的操作对象; 可以是操作数本身;可以是操作数地址或是地址的一部分;可以是指向操作数地址的指针或其他有关 操作数的信息。
3、指令的一般格式: 操作码字段: 在机器里只需对某种操作指定确定的二进制代码。 通常用指令的第一个字节表示,不够可以占第二个字节中的3位。 操作数字段: 操作数字段可以有一个,二个或三个。 例: INC CX ADD AX , BX
4、操作数的存放 操作数的存放不外乎三种情况: (1)操作数包含在指令中 即指令的操作数字段包含操作数本身。这种操作数为立即数。——数在指令队列中,执行数度较快。 例:MOV AL , 08H (2)操作数包含在CPU的一个内部寄存器中 例:INC CX 指令中的操作数字段是CPU内部寄存器的一个编码。这种寻址方式称为寄存器寻址。——数在寄存器中,无需BIU去取,执行速度最快。
(3)操作数在内存数据区 操作数在内存数据区,操作数字段包含着此操作数地址。——存储容量大 在8086中,任何内存地址是由两部分组成: 段的基地址:存储单元所在段的基地址 (大部分情况是数据段寄存器DS中); 段内偏移量:此单元与段基地址的距离。 有效地址EA(Effective Address) : 段内偏移量为适应各种数据结构的需要,可以有几个部分组成,所以也把它称为有效地址EA。
3.2 8088/8086CPU的寻址方式 寻址方式: 寻找和获得操作数、操作数存放地址或指令转移地址的方法。分数据寻址和指令寻址。 本节介绍数据寻址,根据操作数的三处存放地点对应有三种基本寻址方式:立即寻址方式、寄存器寻址方式和存储器寻址方式。
3.2.1 立即寻址方式(Immediate addressing) 操作数直接存放在指令中,紧跟在操作码之后,作为指令 的一部分,存放在代码段里,这种操作数称为立即数。 立即数可以是8位或16位的。16位的立即数是高位字节放在高地址,低位字节放在低地址。 使用场合:经常用于给寄存器赋初值。 注意:只能用于源操作数字段,不能用于目的操作数字段。 例:MOV AX, 267; 数字 MOV AL, 10010011B AND 0FEH;表达式 MOV AL, PORT1;符号名 MOV AX, DATA1;段名
例: MOV AL,05H 指令执行后: (AL)=05H 例: MOV AX,3064H 指令执行后: (AX)=3064H 立即寻址方式
3.2.2 寄存器寻址方式( Register addressing ) 操作数在寄存器中,指令指定寄存器号。 对于16位操作数,寄存器可以是: AX,BX,CX,DX,SI,DI,SP,BP 以及段寄存器。 对于8位操作数,寄存器可以是: AL,AH,BL,BH,CL,CH,DL,DH。 寄存器寻址方式特点:指令长度短,执行速度快。
例: 指令执行前:(AX)=3064H (SS)=1234H MOV SS,AX 指令执行后: (SS)=3064H (AX)保持不变。 寄存器寻址方式 指令执行前: 指令执行后:
3.2.3 存储器寻址方式(Memory addressing)1、直接寻址(Direct addressing) 操作数地址的16位偏移量(有效地址EA),直接包含在指令中, 存放在代码段中指令操作码之后。 操作数一般存放在数据段中, 必须先求出操作数的物理地址, 然后再访问存储器才能取得操作数。 物理地址 : PA=16d或(10H) ×(DS)+EA IBM PC机允许数据存放在数据段以外的其它段中。此时应在指令中指定段超越(可以是CS,SS,ES)。
例:MOV AX,[3100H] (DS)=6000H , (63100H)=3050H 则:(AX)=3050H 例:用符号地址代替数值地址。 MOV AX,VALUE 或 MOV AX,[VALUE] VALUE——变量名,代表有效操作数单元的符号地址。 如VALUE在附加段中,则应指定段超越。 MOV AX,ES:VALUE 或MOV AX,ES:[VALUE] 直接寻址方式
例: 假设TABLE是在数据段定义的一个字节数组的首地址标号(变量名),其偏移地址为1000H,则指令 MOV AL, TABLE MOV AL, [TABLE] MOV AL, [1000H] 是等效的。 指令 MOV AL, TABLE+2 MOV AL, [TABLE+2 ] MOV AL, [1000H+2] 也是等效的,都是直接寻址方式。
注意: (1)直接寻址方式适用于处理单个变量。 (2)直接寻址方式隐含的段寄存器是 DS, 8086/8088允许段超越,即允许使用 CS 、SS 、ES作为段寄存器,这时必须在指令中特别标明。 (3)IBM PC机中规定双操作数指令必须有一个操作数使用寄存器方式,这就是常常先要把一个变量送到寄存器中的原因。
2、寄存器间接寻址方式(Register indirect addressing) 操作数在存储器中,操作数地址的16位偏移量(有效地址EA)包含在:BP、BX、SI、DI寄存器中。 1)、若选择SI、DI、BX作为间接寻址 操作数一般在现行数据段区域中,用(DS)作为段地址。 即操作数物理地址为: 物理地址PA=16 d ×(DS)+(BX) 物理地址PA=16 d × (DS)+(SI) 物理地址PA=16 d × (DS)+(DI)
例:MOV BX,[DI] (DS)=6000H (DI)=2000H PA=62000H (62000H)=50A0H (BX)=50A0H 寄存器间接寻址方式 MOV BX,[DI]
2) 、若选择BP寄存器作为间接寻址 操作数在堆栈段区域中,用SS寄存器的内容作为段地址。 操作数物理地址: PA=16d × (SS)+(BP) 例: MOV [BP], AX 执行前: (SS)=1000H , (BP)=3000H , (AX)=1234H 执行后:PA=13000H (13000H)=1234H 寄存器间接寻址方式 MOV [BP], AX 寄存器间接寻址方式 MOV [BP], AX
3 )、用 SI、DI、BX 、BP作为间接寻址允许段超越 指令中可以指定段超越前缀来取得其他段中的数据。 例: MOV ES:[DI], AX MOV DX, DS:[BP] 这种寻址方法可以用于表格处理,在循环结构程序设计中经常用到间址方式。
3、寄存器相对寻址方式(Register relative addressing)或变址寻址 (Index Addressing) 操作数的有效地址(EA)是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量(displacement)之和。
操作数一般在内存的数据段中,但允许段超越。操作数一般在内存的数据段中,但允许段超越。 除有段超越前缀之外,形成物理地址有二种方式:
例: MOV AX, COUNT[BP] 或MOV AX, [COUNT+BP] 设COUNT为16位位移量。 指令执行前: (SS)=5000H, (BP)=3000H, COUNT=2040H, (AX)=1234H 指令执行后:EA=5040H PA=55040H (55040H)=5548H (AX)=5548H 寄存器相对寻址方式 MOV AX,COUNT[BP]
例: TABLE是在数据段定义的一个字节数组的首地址标号(变量名),则有如下程序: MOV SI, 5 MOV AL, TABLE[SI];or MOV AL, [TABLE+SI] ABC EQU 5 LEA SI, TABLE MOV AL, ABC[SI];or MOV AL, [ABC+SI]
用途:这种寻址方式同样用于表格处理。 例:某数据表的首地址为COUNT,修改基址或变址寄存器来取得表格中的值。 欲读取表中第10个数据,存放到(AL)中。 第10个数据的有效地址: EA= COUNT + 9 MOV SI , 09H MOV AL , [SI+COUNT] * 寄存器相对寻址方式也可以使用段超越前缀 MOV DL,ES:STRING[SI]
4、基址变址寻址方式(Based indexed addressing) 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,基址寄存器名和变址寄存器名均由指令指定。
除有段超越前缀之外,形成物理地址有二种方式:除有段超越前缀之外,形成物理地址有二种方式:
例: MOV AX, [BX][SI] 或 MOV AX, [BX+SI] 执行指令前: (DS)=3200H, (BX)=0456H, (SI) =1094H (334EAH)=4567H 执行指令后: EA=14EAH PA=334EAH (AX)=4567H 基址加变址寻址方式 MOV AX,[BX+SI]
用途:这种寻址方式同样适用于数组或表格处理。用途:这种寻址方式同样适用于数组或表格处理。 表格首地址 基址寄存器中, 用变址寄存器来访问数组中的元素。 二个寄存器都能修改, 所以比寄存器相对寻址更灵活。 这种寻址方式允许段超越。 使用段超越前缀格式: MOV AX,ES:[BX][SI]
5、相对基址加变址寻址方式(Relative based indexed addressing) 操作数有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和 。
除有段跨越前缀之外,形成物理地址有二种方式:除有段跨越前缀之外,形成物理地址有二种方式:
例: MOV AX, MASK[BX][DI] MOV AX, MASK [BX+DI] MOV AX,[MASX+BX+DI] 执行指令前: (DS)=3000H (BX)=1346H (DI)=0500H MASK=1234H (32A7AH)=4050H 执行指令后: EA=2A7AH PA=32A7AH (AX)=4050H 相对基址加变址 MOV AX, MASK+[BX+DI]
用途之一: 这种寻址方式为堆栈处理提供方便: (BP) 栈顶(一般 BP 可指向栈顶) 从栈顶到数组的首地址可以用位移量表示(MASK)。 变址寄存器(SI)或(DI)——指向数组中某个元素。
小结: • 1、三种类型操作数 • 综观8086/ 8088寻址方式,其操作数有三种类型: • 立即操作数、寄存器操作数、存储器操作数。 • 2、三种类型操作数特点 • (1)立即操作数 • 可以使用立即操作数指令有: • 数据传送指令、算术运算指令(乘、除运算指令除外)、 逻辑运算指令等。 • 立即数只能作为源操作数,不能作为目标操作数。
寄存器操作数 • 寄存器操作数可能存放在: • 8086 /8088的通用寄存器、地址指针或变址寄存器以及段寄存器。 • 对段寄存器ES 、DS 、SS进行赋值,不能将立即数直接送段寄存器,要将立即数送通用寄存器,再从通用寄存器送段寄存器。CS一般不用赋值。
隐含操作数 • 某些指令规定只能使用指定操作数寄存器, 从汇编形式看,似乎没有指出操作数,实际隐含某些特定寄存器操作数。该寄存器可能是:累加器 、通用寄存器、变址寄存器、某些段寄存器。
(3)、存储器操作数 • 存储器操作数可能存放在一个、二个、或四个存储器单元中。 • 操作数类型分别为:字节、字、双字。 • 存储器操作数可以作为源操作数,也可以作为目标操作数。 • 但不允许源操作数、目标操作数同时为存储器操作数。 • 存储器操作数的有效地址EA的取得方法: • 直接寻址 寄存器间接寻址 相对寄存器寻址 • 基址加变址寻址 相对基址加变址寻址 • 存储器操作数的物理地址PA的取得方法: • 一般存储器操作数指令中隐含段寄存器,有的指令允许段超越, 需要在指令中标明。
需说明的几个问题 1、指令中使用方括号的地址表达式必须遵循下列规则: * 立即数可以出现在方括号内,表示直接地址; * 只有SI、BP、DI、BX可以出现在方括号内,它们可以单独出现,也可以相加后出现,或以寄存器与立即数相加的形式出现,但BX和BP或SI和DI不能同时出现在同一个[ ]内。 * 方括号有相加的含义,下面几种写法都是等价的: 1200[BX][SI] [BX+1200][SI] [BX+ SI +1200] * 方括号内包含BP,则隐含使用SS提供基地址;其余情况均使用DS提供基地址。
2、段超越: 在8088系统中,数据通常在数据段中,但若需要,数据也可存放在码段,堆栈段以及附加段中,这种情况就是段超越。应用时,需在指令中加以说明。 例:MOV AX,ES:[0500H] ES表示数据在附加段中; : 是修改属性运算符。
3、其它寻址方式 (1)隐含寻址:指令中不指明操作数 (2)I/O端口寻址:8086有直接端口寻址和间接端口寻址两种方式,端口寻址范围分别为0-0FFH和0-FFFFH。 (3)转移类指令寻址 (4)一条指令有几种寻址方式 例:MOV AX, [SI]
3.3 指令的机器码表示方法(略) 8086指令系统采用变长指令,指令的长度可有1~6字节组成。
3.4 8088/8086CPU的指令系统 • 8086/8088的指令系统中共有92种基本指令。 • 可以分成6个功能组: • 1. 数据传送(Data transfer) • 2. 算术运算(Arithmetic) • 3. 逻辑运算和移位指令(Logic& Shift) • 4. 串操作(String manipulation) • 5. 控制转移(Control Transfer) • 6. 处理器控制(Processor Control)
3.4.1 数据传送指令(Data transfer) 功能: 负责把数据、地址或立即数传 送到寄存器或存储单元。 特点: 它是计算机最基本、最重要的一种操作,使用比例最高。 种类(分四种): (一)通用传送指令(General Purpose Transfer) 包括: MOV, PUSH, POP ,XCHG, XLAT。
(二)输入输出指令(Input and Output) 包括: IN, OUT。 (三)目的地址传送指令(Address-object transfer) 包括: LEA, LDS, LES (四)标志传送指令(Flag register transfer) 包括 : LAHF, SAHF, PUSHF, POPF *除 SAHF和POPF指令外,对标志位没有影响。
(一)通用传送指令(General Purpose Transfer) 8088提供方便灵活的通用的传送操作,适用于大多数操作数。 通用传送指令(除了XCHG以外)是唯一允许以段寄存器为操作数的指令。 通用传送指令包括: 1、MOV (Movement) 2、PUSH (Push word onto stack) POP (Pop word off stack) 3、XCHG (Exchange) 4、XLAT (Translate)
1、MOV 通用传送指令 • MOV dst, src ; (dst) (src) 目的 源 目的 源 • 功能: • 把一个字节(B)或一个字(W)操作数由源传送至目的。 • 实现: 寄存器 寄存器/存储器之间; • 立即数寄存器/存储器 • 寄存器/存储器段寄存器之间的数据传送。 • 说明:* 指令中至少要有一项明确指出传送的是字节还是字; • * 可用不同的寻址方式; • * 不影响标志位; • * 源操作数不变; • *存储器之间,立即数与段寄存器,段寄存器之间不能用一条指令完成数据传送。 • 注意: 参看教材 P70
例:CPU内部寄存器之间的数据的任意传送(除了段寄存器CS和指令指针IP以外,注意:段寄存器之间不能传送,且段寄存器CS 不能做目的操作数)。 MOV DL,CH ; 8位寄存器 8位寄存器 MOV AX,DX ; 16位寄存器 16位寄存器 MOV SI, BP MOV DS,BX ;通用寄存器 段寄存器 MOV AX, CS ;段寄存器 通用寄存器
例:立即数传送至CPU内部通用寄存器组(AX、BX、CX、DX、BP、SP、SI、DI), 用于给寄存器赋初值。注意: 不能直接给段寄存器赋值 MOV CL,04H ;立即数8位寄存器 MOV AX,03FFH ;立即数16位寄存器 MOV WORD PTR [SI] ,057BH ;立即数存储器 MOV BYTE PTR MEM, 5 ;立即数存储器 思考:为什么加WORD PTR , BYTE PTR ?不加对吗?
例:CPU内部寄存器(除CS和IP外)与存储器(所有寻址方式)之间数据传送,可以实现一字节或一个字的传送。例:CPU内部寄存器(除CS和IP外)与存储器(所有寻址方式)之间数据传送,可以实现一字节或一个字的传送。 注意:两存储单元之间不能直接传送 MOV MEM , AX ; 累加器存储器,直接寻址 MOV MEM ,DS ;段寄存器存储器,直接寻址 MOV DISP[BX] ,CX ;寄存器存储器,相对寻址 MOV AX , DISP[SI] ;存储器累加器,相对寻址 MOV DS , MEM ;存储器段寄存器,直接寻址 MOV CX , DISP [BX] [SI] ;存储器寄存器,相对基址加变址
MOV指令小结: • 不能用一条MOV指令实现以下传送。 • 两存储单元之间的传送 MOV MEM2 , MEM1 错。 • MOV AX , MEM1 • MOV MEM2 , AX 对。 • 立即数送段寄存器 例 : MOV DS,2000H 错。 MOV AX, 2000H MOV DS , AX 对。
段寄存器之间的传送 MOV ES , DS ; 错 MOV AX , DS MOV ES , AX ; 对 。 • 注意CS和IP的使用 CS和IP不能作为目标操作数,CS可以作为源操作数。 例: MOV CS,AX ; 错 • MOV AX,CS ;对 • MOV IP, AX ;错