1 / 86

第 3 章 指令系统和寻址方式

第 3 章 指令系统和寻址方式. 3.1 指令系统概述 3.2 8088/8086CPU 的寻址方式 3.3 指令的机器码表示方法(略) 3.4 8088/8086CPU 的指令系统. 3.1 指令系统概述. 1、指令、指令系统和程序 指令 是 CPU 能执行的一个基本操作。 如:取数、加、减、乘、除、存数等 指令系统 是 CPU 所能执行的全部操作,即全部指令的集合 。 不同的 CPU, 其指令系统不同。 程序 是用户在使用计算机时,针对要解决的问题, 用一条条指令编写的指令的序列 。.

chace
Download Presentation

第 3 章 指令系统和寻址方式

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第3章 指令系统和寻址方式 3.1指令系统概述 3.2 8088/8086CPU的寻址方式 3.3 指令的机器码表示方法(略) 3.4 8088/8086CPU的指令系统

  2. 3.1指令系统概述 • 1、指令、指令系统和程序 • 指令是CPU能执行的一个基本操作。 • 如:取数、加、减、乘、除、存数等 • 指令系统是CPU所能执行的全部操作,即全部指令的集合。 不同的CPU,其指令系统不同。 • 程序是用户在使用计算机时,针对要解决的问题, 用一条条指令编写的指令的序列。

  3. *一个CPU能执行什么操作,是工程人员设计和制造好的,是固定的,用户不能改变。*一个CPU能执行什么操作,是工程人员设计和制造好的,是固定的,用户不能改变。 构成程序的指令在存储器中一般都是顺序存放,要破坏这种顺序性,必须由转移指令操作。 2、指令组成 计算机中指令由操作码和操作数两部分组成。一条指令可以由1~6个字节组成。 操作码-----指示计算机要执行的操作, 操作数-----指出在指令执行操作过程中的操作对象; 可以是操作数本身;可以是操作数地址或是地址的一部分;可以是指向操作数地址的指针或其他有关 操作数的信息。

  4. 3、指令的一般格式: 操作码字段: 在机器里只需对某种操作指定确定的二进制代码。 通常用指令的第一个字节表示,不够可以占第二个字节中的3位。 操作数字段: 操作数字段可以有一个,二个或三个。 例: INC CX ADD AX , BX

  5. 4、操作数的存放 操作数的存放不外乎三种情况: (1)操作数包含在指令中 即指令的操作数字段包含操作数本身。这种操作数为立即数。——数在指令队列中,执行数度较快。 例:MOV AL , 08H (2)操作数包含在CPU的一个内部寄存器中 例:INC CX 指令中的操作数字段是CPU内部寄存器的一个编码。这种寻址方式称为寄存器寻址。——数在寄存器中,无需BIU去取,执行速度最快。

  6. (3)操作数在内存数据区 操作数在内存数据区,操作数字段包含着此操作数地址。——存储容量大 在8086中,任何内存地址是由两部分组成: 段的基地址:存储单元所在段的基地址 (大部分情况是数据段寄存器DS中); 段内偏移量:此单元与段基地址的距离。 有效地址EA(Effective Address) : 段内偏移量为适应各种数据结构的需要,可以有几个部分组成,所以也把它称为有效地址EA。

  7. 3.2 8088/8086CPU的寻址方式 寻址方式: 寻找和获得操作数、操作数存放地址或指令转移地址的方法。分数据寻址和指令寻址。 本节介绍数据寻址,根据操作数的三处存放地点对应有三种基本寻址方式:立即寻址方式、寄存器寻址方式和存储器寻址方式。

  8. 3.2.1 立即寻址方式(Immediate addressing) 操作数直接存放在指令中,紧跟在操作码之后,作为指令 的一部分,存放在代码段里,这种操作数称为立即数。 立即数可以是8位或16位的。16位的立即数是高位字节放在高地址,低位字节放在低地址。 使用场合:经常用于给寄存器赋初值。 注意:只能用于源操作数字段,不能用于目的操作数字段。 例:MOV AX, 267; 数字 MOV AL, 10010011B AND 0FEH;表达式 MOV AL, PORT1;符号名 MOV AX, DATA1;段名

  9. 例: MOV AL,05H 指令执行后: (AL)=05H 例: MOV AX,3064H 指令执行后: (AX)=3064H 立即寻址方式

  10. 3.2.2 寄存器寻址方式( Register addressing ) 操作数在寄存器中,指令指定寄存器号。 对于16位操作数,寄存器可以是: AX,BX,CX,DX,SI,DI,SP,BP 以及段寄存器。 对于8位操作数,寄存器可以是: AL,AH,BL,BH,CL,CH,DL,DH。 寄存器寻址方式特点:指令长度短,执行速度快。

  11. 例: 指令执行前:(AX)=3064H (SS)=1234H MOV SS,AX 指令执行后: (SS)=3064H (AX)保持不变。 寄存器寻址方式 指令执行前: 指令执行后:

  12. 3.2.3 存储器寻址方式(Memory addressing)1、直接寻址(Direct addressing) 操作数地址的16位偏移量(有效地址EA),直接包含在指令中, 存放在代码段中指令操作码之后。 操作数一般存放在数据段中, 必须先求出操作数的物理地址, 然后再访问存储器才能取得操作数。 物理地址 : PA=16d或(10H) ×(DS)+EA IBM PC机允许数据存放在数据段以外的其它段中。此时应在指令中指定段超越(可以是CS,SS,ES)。

  13. 例: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] 直接寻址方式

  14. 例: 假设TABLE是在数据段定义的一个字节数组的首地址标号(变量名),其偏移地址为1000H,则指令 MOV AL, TABLE MOV AL, [TABLE] MOV AL, [1000H] 是等效的。 指令 MOV AL, TABLE+2 MOV AL, [TABLE+2 ] MOV AL, [1000H+2] 也是等效的,都是直接寻址方式。

  15. 注意: (1)直接寻址方式适用于处理单个变量。 (2)直接寻址方式隐含的段寄存器是 DS, 8086/8088允许段超越,即允许使用 CS 、SS 、ES作为段寄存器,这时必须在指令中特别标明。  (3)IBM PC机中规定双操作数指令必须有一个操作数使用寄存器方式,这就是常常先要把一个变量送到寄存器中的原因。

  16. 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)

  17. 例:MOV BX,[DI] (DS)=6000H (DI)=2000H PA=62000H (62000H)=50A0H (BX)=50A0H 寄存器间接寻址方式 MOV BX,[DI]

  18. 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

  19. 3 )、用 SI、DI、BX 、BP作为间接寻址允许段超越 指令中可以指定段超越前缀来取得其他段中的数据。 例: MOV ES:[DI], AX MOV DX, DS:[BP] 这种寻址方法可以用于表格处理,在循环结构程序设计中经常用到间址方式。

  20. 3、寄存器相对寻址方式(Register relative addressing)或变址寻址 (Index Addressing) 操作数的有效地址(EA)是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量(displacement)之和。

  21. 操作数一般在内存的数据段中,但允许段超越。操作数一般在内存的数据段中,但允许段超越。 除有段超越前缀之外,形成物理地址有二种方式:

  22. 例: 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]

  23. 例: 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]

  24. 用途:这种寻址方式同样用于表格处理。 例:某数据表的首地址为COUNT,修改基址或变址寄存器来取得表格中的值。 欲读取表中第10个数据,存放到(AL)中。 第10个数据的有效地址: EA= COUNT + 9 MOV SI , 09H MOV AL , [SI+COUNT] * 寄存器相对寻址方式也可以使用段超越前缀 MOV DL,ES:STRING[SI]

  25. 4、基址变址寻址方式(Based indexed addressing) 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,基址寄存器名和变址寄存器名均由指令指定。

  26. 除有段超越前缀之外,形成物理地址有二种方式:除有段超越前缀之外,形成物理地址有二种方式:

  27. 例: 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]

  28. 用途:这种寻址方式同样适用于数组或表格处理。用途:这种寻址方式同样适用于数组或表格处理。 表格首地址 基址寄存器中, 用变址寄存器来访问数组中的元素。 二个寄存器都能修改, 所以比寄存器相对寻址更灵活。 这种寻址方式允许段超越。 使用段超越前缀格式: MOV AX,ES:[BX][SI]

  29. 5、相对基址加变址寻址方式(Relative based indexed addressing) 操作数有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和 。

  30. 除有段跨越前缀之外,形成物理地址有二种方式:除有段跨越前缀之外,形成物理地址有二种方式:

  31. 例: 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]

  32. 用途之一: 这种寻址方式为堆栈处理提供方便: (BP) 栈顶(一般 BP 可指向栈顶) 从栈顶到数组的首地址可以用位移量表示(MASK)。 变址寄存器(SI)或(DI)——指向数组中某个元素。

  33. 小结: • 1、三种类型操作数 • 综观8086/ 8088寻址方式,其操作数有三种类型: • 立即操作数、寄存器操作数、存储器操作数。 • 2、三种类型操作数特点 • (1)立即操作数 • 可以使用立即操作数指令有: • 数据传送指令、算术运算指令(乘、除运算指令除外)、 逻辑运算指令等。 • 立即数只能作为源操作数,不能作为目标操作数。

  34. 寄存器操作数 • 寄存器操作数可能存放在: • 8086 /8088的通用寄存器、地址指针或变址寄存器以及段寄存器。 • 对段寄存器ES 、DS 、SS进行赋值,不能将立即数直接送段寄存器,要将立即数送通用寄存器,再从通用寄存器送段寄存器。CS一般不用赋值。

  35. 隐含操作数 • 某些指令规定只能使用指定操作数寄存器, 从汇编形式看,似乎没有指出操作数,实际隐含某些特定寄存器操作数。该寄存器可能是:累加器 、通用寄存器、变址寄存器、某些段寄存器。

  36. (3)、存储器操作数 • 存储器操作数可能存放在一个、二个、或四个存储器单元中。 • 操作数类型分别为:字节、字、双字。 • 存储器操作数可以作为源操作数,也可以作为目标操作数。 • 但不允许源操作数、目标操作数同时为存储器操作数。 • 存储器操作数的有效地址EA的取得方法: • 直接寻址 寄存器间接寻址 相对寄存器寻址 • 基址加变址寻址 相对基址加变址寻址 • 存储器操作数的物理地址PA的取得方法: • 一般存储器操作数指令中隐含段寄存器,有的指令允许段超越, 需要在指令中标明。

  37. 需说明的几个问题 1、指令中使用方括号的地址表达式必须遵循下列规则: * 立即数可以出现在方括号内,表示直接地址; * 只有SI、BP、DI、BX可以出现在方括号内,它们可以单独出现,也可以相加后出现,或以寄存器与立即数相加的形式出现,但BX和BP或SI和DI不能同时出现在同一个[ ]内。 * 方括号有相加的含义,下面几种写法都是等价的: 1200[BX][SI] [BX+1200][SI] [BX+ SI +1200] * 方括号内包含BP,则隐含使用SS提供基地址;其余情况均使用DS提供基地址。

  38. 2、段超越: 在8088系统中,数据通常在数据段中,但若需要,数据也可存放在码段,堆栈段以及附加段中,这种情况就是段超越。应用时,需在指令中加以说明。 例:MOV AX,ES:[0500H] ES表示数据在附加段中; : 是修改属性运算符。

  39. 3、其它寻址方式 (1)隐含寻址:指令中不指明操作数 (2)I/O端口寻址:8086有直接端口寻址和间接端口寻址两种方式,端口寻址范围分别为0-0FFH和0-FFFFH。 (3)转移类指令寻址 (4)一条指令有几种寻址方式 例:MOV AX, [SI]

  40. 3.3 指令的机器码表示方法(略) 8086指令系统采用变长指令,指令的长度可有1~6字节组成。

  41. 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)

  42. 3.4.1 数据传送指令(Data transfer) 功能: 负责把数据、地址或立即数传 送到寄存器或存储单元。 特点: 它是计算机最基本、最重要的一种操作,使用比例最高。 种类(分四种): (一)通用传送指令(General Purpose Transfer) 包括: MOV, PUSH, POP ,XCHG, XLAT。

  43. (二)输入输出指令(Input and Output) 包括: IN, OUT。 (三)目的地址传送指令(Address-object transfer) 包括: LEA, LDS, LES (四)标志传送指令(Flag register transfer) 包括 : LAHF, SAHF, PUSHF, POPF *除 SAHF和POPF指令外,对标志位没有影响。

  44. (一)通用传送指令(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)

  45. 1、MOV 通用传送指令 • MOV dst, src ; (dst)  (src) 目的 源 目的  源 • 功能: • 把一个字节(B)或一个字(W)操作数由源传送至目的。 • 实现: 寄存器  寄存器/存储器之间; • 立即数寄存器/存储器 • 寄存器/存储器段寄存器之间的数据传送。 • 说明:* 指令中至少要有一项明确指出传送的是字节还是字; • * 可用不同的寻址方式; • * 不影响标志位; • * 源操作数不变; • *存储器之间,立即数与段寄存器,段寄存器之间不能用一条指令完成数据传送。 • 注意: 参看教材 P70

  46. 例:CPU内部寄存器之间的数据的任意传送(除了段寄存器CS和指令指针IP以外,注意:段寄存器之间不能传送,且段寄存器CS 不能做目的操作数)。 MOV DL,CH ; 8位寄存器 8位寄存器 MOV AX,DX ; 16位寄存器 16位寄存器 MOV SI, BP MOV DS,BX ;通用寄存器 段寄存器 MOV AX, CS ;段寄存器 通用寄存器

  47. 例:立即数传送至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 ?不加对吗?

  48. 例: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] ;存储器寄存器,相对基址加变址

  49. MOV指令小结: • 不能用一条MOV指令实现以下传送。 • 两存储单元之间的传送 MOV MEM2 , MEM1 错。 • MOV AX , MEM1 • MOV MEM2 , AX 对。 • 立即数送段寄存器 例 : MOV DS,2000H 错。 MOV AX, 2000H MOV DS , AX 对。

  50. 段寄存器之间的传送 MOV ES , DS ; 错 MOV AX , DS MOV ES , AX ; 对 。 •  注意CS和IP的使用 CS和IP不能作为目标操作数,CS可以作为源操作数。 例: MOV CS,AX ; 错 • MOV AX,CS ;对 • MOV IP, AX ;错

More Related