2023年微机原理精品讲义准备.pdf
《2023年微机原理精品讲义准备.pdf》由会员分享,可在线阅读,更多相关《2023年微机原理精品讲义准备.pdf(96页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、名师精编 优秀教案 3.1 指令系统概述 指令系统是微处理器所能执行的各种指令的集合,定义了一个微处理器所能完成的基本操作。不同的微处理器具有不同的指令系统,本章以 Intel公司的 8086 为例来介绍微处理器的指令系统。采用 8086 CPU 的指令系统作为范例的原因有以下几点:(1)应用的广泛性。几乎所有的微机系统使用的都是 x86 系列的 CPU(主要生产厂家有 Intel公司和 AMD 公司)。(2)指令的兼容性。8086 的指令系统是所有 x86 系列 CPU的指令系统的基础,编写的程序可以直接在 80286、80386 乃至 Pentium、Core 2 Duo上执行。(3)资料
2、的丰富性。x86 系列 CPU普及程度极广,其相关技术资料很容易找到,给应用开发带来很大方便。(4)与课程内容配合。【几个概念】指令控制 CPU完成指定操作的命令。机器指令指令的二进制代码形式。例如:11001101 00100001(或表示成十六进制形式为:CD21H)。汇编指令助记符形式的指令。例如:INT 21H。指令系统CPU的所有指令及其使用规则的集合。8086 指令按功能分为六大类(92 种),下表列出了最常用的一些指令。8086 CPU 常用指令一览表 指令类型 助 记 符 数 据 传 送 一般数据传送 MOV,PUSH,POP,XCHG,XLAT 输入输出指令 IN,OUT 地
3、址传送指令 LEA,LDS,LES 标志传送指令 PUSHF,POPF 算 术 运 算 加法指令 ADD,ADC,INC 减法指令 SUB,SBB,DEC,CMP 乘、除法指令 MUL,DIV 十进制调整指令 DAA,AAA,DAS,AAS,AAM,AAD 逻辑运算和移位 AND,OR,NOT,XOR,TEST SHL,SAL,SHR,SAR,ROL,ROR,RCL,RCR 串操作 MOVS,CMPS,SCAS,LODS,STOS 名师精编 优秀教案 3.1.1 指令的基本组成 指令分为操作码(也称为指令码)和操作数两个部分,操作码表示这条指令所要进行的是什么样的操作,操作数指示所要操作的对象
4、。大多数 8086 指令的长度在 14 个字节之间,其长度与操作码和指令中操作数的多少以及操作数的类型有关。操作数越多,指令就越长。8086 指令系统规定,一条指令的操作数最多只能有两个。1.指令格式 8086 CPU 的指令格式如下:操作码 目的操作数 ,源操作数 其中:操作码用便于记忆的助记符来表示(一般是英文单词的缩写)。操作数可以是双操作数(源操作数和目的操作数),也可以是单操作数,有的指令甚至可以不给出操作数(隐含操作数)。【例 1】双操作数的指令:MOV AX,BX;MOV 是操作码,AX是目的操作数,BX是源操作数 单操作数的指令:CALL proc1;CALL 是操作码,pro
5、c1 是目的操作数 无操作数的指令:STC;STC 是操作码 2.操作数类型 8086 指令系统中的操作数主要分为三类:立即数操作数、寄存器操作数和存储器操作数。1)立即数操作数 所谓立即数是指具有固定数值的操作数,即常数。它可以是字节(8 位)或字(16 位),当它们分别代表无符号数和带符号数时,其各自的取值范围如下表所示。控制转移 JMP,条件转移指令(Jxx),LOOP/LOOPE/LOOPNE INT/IRET,CALL/RET 处理器控制 CLC,STC,CLD,STD,HLT 名师精编 优秀教案 立即数操作数的取值范围 8 位数 16 位数 无符号数 00H-0FFH(0255)0
6、000H-0FFFFH(065535)有符号数 80H-7FH(-128+127)8000H-7FFFH(-32768+32767)立即数的取值超出了规定的范围,就会发生错误。在指令中,立即数操作数只能用作源操作数,而不能用作目的操作数。【例 2】MOV AX,1200H;正确,立即数可以用做源操作数 MOV 1200H,AX;错误,立即数不能用做目的操作数 2)寄存器操作数 寄存器操作数存放在 8086 CPU 的 8 个通用寄存器或段寄存器中,既可以作为源操作数,也可以用作目的操作数。通用寄存器中的 AX、BX、CX、DX既可以作为四个 16 位寄存器,用来存放字操作数,也可以当作八个 8
7、 位寄存器(AH、AL、BH、BL、CH、CL、DH、DL),用来存放字节操作数。SI、DI、BP、SP 只能存放字操作数。段寄存器用来存放当前操作数的段基地址。在与通用寄存器或存储器传送数据时,段寄存器可作为源操作数或目的操作数。AX(16 位)AH(8 位)AL(8 位)BX(16 位)BH(8 位)BL(8 位)CX(16 位)CH(8 位)CL(8 位)DX(16 位)DH(8 位)DL(8 位)SI(16 位)SI(16 位)DI(16 位)DI(16 位)BP(16 位)BP(16 位)SP(16 位)SP(16 位)名师精编 优秀教案 注意:1.不允许用一条指令把立即数传送到段寄
8、存器。如果需要这样做,可用某个通用寄存器作为中间桥梁,用两条传送指令实现。2.不允许用传送指令把某个值传送给 CS。3.仅有个别指令将标志寄存器 FLAGS作为操作数。【例 3】MOV DS,1200H;错误,不允许把立即数传送到段寄存器 改为:MOV AX,1200H;正确,使用 AX作为中介把立即数 1200H送到 DS寄存器 MOV DS,AX 【例 4】MOV CS,AX;错误,不允许用显式指令把值传送给 CS寄存器 MOV FLAGS,AX;错误,不允许用数据传送指令给标志寄存器赋值 POPF;正确,可以把堆栈栈顶的内容弹出到标志寄存器 3)存储器操作数 存储器操作数可以是字节(8
9、位)、字(16 位)或双字(32 位),分别要占据一个、两个或四个存储单元。存储器操作数在指令中既可作为源操作数,也可作为目标操作数。但对大多数指令,不允许源操作数和目标操作数同时为存储器操作数。若确实要对两个存储器操作数进行操作,可以使用任一通用寄存器作为中间桥梁来实现。CS(16 位)DS(16 位)ES(16 位)SS(16 位)段寄存器存放当前操作数的段基地址 名师精编 优秀教案 在汇编语言中,存储器单元是用逻辑地址来制定的,而逻辑地址是由段基地址和偏移地址两部分构成。所以,要访问存储器操作数必须首先确定操作数所在的段基地址。如上所说,段基地址是放在段寄存器中的,所以,访问存储器操作数
10、前,应先确定对应的段寄存器是否已经初始化为所需要的段基地址。那么,访问存储器操作数要使用四个段寄存器中的哪一个呢?8086 CPU 规定,若指令中没有指明使用哪一个段寄存器的内容作为段基地址来访问存储器操作数,则根据操作数的特征来确定所使用的默认段寄存器。各种存储器操作所约定的默认段寄存器、段超越(即显式地指明段寄存器)所允许的段寄存器、以及相应的偏移地址来源见下表。【例 5】MOV AL,2A00H;通用数据传送,用 DS的内容作为段基地址,偏移地址为 2A00H PUSH AX;堆栈操作,用 SS 的内容作为段基地址,偏移地址在 SP 中 LODSW;串操作,用 DS的内容作为源串地址的段
11、基地址,偏移地址在 SI 中 ADD AL,BP+DI;BP作为基址寄存器,用 SS 的内容作为段基地址,偏移地址为 BP和 DI 之和 3.1.2 指令的执行时间 了解指令的执行时间,对编写时间敏感的程序是很重要的。例如:在用软件产生定时或延时时或工业控制领域中对某些实时性要求较严的诚和,都需要估算出一段程序的运行时间。一条指令的执行时间以时钟周期数为单位。不同指令的执行时间有较大的差别,这里列出了部分常用指令的执行时间及其访问存储器的次数。常用指令执行时间 指 令 所需时钟周期数 访问内存次数 MOV 累加器到内存 内存到累加器 寄存器到寄存器 内存到寄存器 寄存器到内存 10(14)10
12、(14)2 8(12)+EA 9(13)+EA 1 1 0 1 1 MOV 立即数到寄存器 立即数到内存 4 10(14)+EA 0 1 段寄存器使用的一些基本约定 存储器操作类型 默认的段寄存器 允许超越的段寄存器 段内偏移地址来源 取指令 CS 无 IP 堆栈操作 SS 无 SP 通用数据传送 DS CS,ES,SS 按寻址方式取得 串操作源串地址 DS CS,ES,SS SI 串操作目的串地址 ES 无 DI BP 作为基址寄存器 SS CS,DS,ES 按寻址方式取得 名师精编 优秀教案 寄存器到段寄存器 内存到段寄存器 段寄存器到寄存器 段寄存器到内存 2 8(12)+EA 2 9(
13、13)+EA 0 1 0 1 ADD 或 SUB 寄存器到寄存器 内存到寄存器 寄存器到内存 立即数到寄存器 立即数到内存 3 9(13)+EA 16(24)+EA 4 17(25)+EA 0 1 2 0 2 MUL 累加器乘 8 位寄存器 累加器乘 16 位寄存器 累加器和内存字节乘 累加器和内存字乘 7077 118133(76 83)+EA 124(128)139(143)+EA 0 0 1 1 IMUL 累加器乘 8 位寄存器 累加器乘 16 位寄存器 累加器和内存字节乘 累加器和内存字乘 8098 128154(86 104)+EA 134(138)160(164)+EA 0 0 1
14、 1 DIV 除数在 8 位寄存器中 除数在 16 位寄存器中 除数为 8 位内存数 除数为 16 位内存数 8090 144162(86 96)+EA 150(154)168(172)+EA 0 0 1 1 IDIV 除数在 8 位寄存器中 除数在 16 位寄存器中 除数为 8 位内存数 除数为 16 位内存数 101112 165184(107 118)+EA 171(175)190(194)+EA 0 0 1 1 循环和移位 在寄存器中移1 位 在寄存器中移若干位 内存数据移 1 位 内存数据移若干位 2 8+4*位数 15(23)+EA 20(28)+EA+4*位数 JMP 段内/段间
15、直接转移 段内间接转移 段间间接转移 15 8(12)+EA 24(32)+EA 条件 转移 JCXZ 6(不转移)18(转移)其它条件转移指令 Jxx 4(不转移)16(转移)注:(1)表中EA表示偏移地址。小括号内的数为8088进行字操作的时钟数。因为8088的数据线只有8位,每个总线周期只能传送一个字节,所以对字操作要再加上4个时钟周期。(2)对条件转移指令,若条件满足,执行的时间比较长。因为要产生转移,就要包括取下一条指令所需的时间。若条件不满足,执行时间就较短。因为此时不产生转移,而是执行下一条指令。存取操作数的时间与采用的寻址方式有关。寄存器寻址执行的时间最短,而对存储器操作数则还
16、需考虑计算偏移地址所花的时间。这里列出了不同寻址方式下,计算偏移地址所需要的时间。计算偏移地址 EA所需时间 名师精编 优秀教案 寻 址 方 式 计算 EA所需时钟数 直接寻址 6 寄存器间接寻址 5 寄存器相对寻址 9 基址、变址寻址 BX+SI,BX+DI 7 BP+SI,BP+DI 8 基址、变址加相对寻址 BX+SI+位移量,BP+DI+位移量 11 BX+DI+位移量,BP+SI+位移量 12 注:若有段超越,则需再加上两个时钟周期。可以看出,对同一种指令,如果寻址方式不同,其指令执行时间可能相差很大。寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行速度最慢。
17、这是由于寄存器位于 CPU的内部,执行寄存器操作数指令时,8086 的执行单元(EU)可以直接从 CPU 内部寄存器中取得操作数,不需要访问内存,因此执行速度很快。立即数操作数作为指令的一部分,在取指时已经被 8086 总线接口单元(BIU)取出后存放在指令队列中,执行指令时也不需要访问内存,因而执行速度也比较快。而存储器操作数先要由总线接口单元计算出其所在单元的 20 位物理地址,然后再执行存储器的读写操作。所以相对前述两种操作数来说,指令的执行速度最慢。【例】当通用数据传送指令(MOV)的操作数分别为:寄存器、立即数和存储器时,分别计算指令的执行时间,已知 CPU的时钟频率为 5MHz。C
18、PU的时钟频率为 5MHz,即一个时钟周期为 0.2 s。则 从寄存器到寄存器之间的传送指令的执行时间为:t=20.2=0.4 s 立即数传送到寄存器的指令执行时间为:t=40.2=0.8 s 而存储器到寄存器的字节传送,设存储器采用基址、变址寻址方式,则指令执行时间为:t=(8+EA)0.2=(8+8)0.2=3.2s 从上例可以看出,不同类型的寻址方式或不同类型的操作数可以导致指令执行时间相差一个数量级,因此,我们在编写程序时:1)尽量使用寄存器作为操作数;2)尽量使用简单的寻址方式。3.2 8086 的寻址方式 名师精编 优秀教案 寻址方式,主要是指获得操作数所在的地址的方法。在 808
19、6 系统中,一般将寻址方式分为两大类,一类是寻找操作数的地址,另一类是寻找要执行的下一条指令的地址,即程序的地址。后者主要在程序转移或过程调用时用来寻找目的地址或入口地址,这将在调用指令(CALL)和程序转移指令(JMP)中介绍。本节我们主要讨论针对操作数地址的寻址方式。在 8086 指令系统中,基本的寻址方式有 7 种,另外通常也把隐含寻址也当作是一种不同的寻址方式:立即寻址 直接寻址 寄存器寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 基址变址相对寻址 隐含寻址 8086 寻址方式一览表 寻址方式名称 源操作数的例子 源操作数的允许形式 立即操作数 立即寻址 MOV AX,1200H
20、 指令中的常数 寄存器操作数 寄存器寻址 MOV AX,BX 通用寄存器或段寄存器 存储器操作数 直接寻址 MOV AX,1200H“常数”或“变量”或“变量”寄存器间接寻址 MOV AX,DI BX、BP、SI、DI 之一 寄存器相对寻址 MOV AX,BX+1200H BX、BP、SI、DI 之一+位移量 基址变址寻址 MOV AX,BX+DI BX 或 BP+SI 或 DI 基址变址相对寻址 MOV AX,BX+DI+1200H BX 或 BP+SI 或 DI+位移量 名师精编 优秀教案 3.2.1 立即寻址(Immediate Addressing)要点:操作数直接在指令中给出 只适用
21、于源操作数 立即寻址方式中,操作数是一个常数(也称为立即数)。操作数作为指令的一部分,紧跟在指令的操作码之后(见例 2 图(a),存放于内存的代码段中。并在 CPU 取指令时随指令码一起取出。立即数可以是 8 位或 16 位的整数。注意:立即寻址方式只适用于源操作数。【例 1】MOV AX,1C8FH;正确,把 16 位二进制数 1C8FH送到 AX寄存器中 ADD BYTE PTR2A00H,8FH;正确,把 8 位二进制数 8FH累加到 2A00H内存单元中 MOV 2A00H,AX;错误,立即数不能作为目的操作数 【例 2】指令“MOV AX,3102H”将 16 位的立即数 3102H
22、送入累加器 AX。指令执行后,AH=31H,AL=02H。这是一条三字节指令,指令在存储器中的存放形式及其执行情况如下图(b)所示。3.2.2 直接寻址(Direct Addressing)要点:指令中直接给出操作数的偏移地址(形式上为一个 16 位二进制数).操作码 操作数高 8 位 操作数低 8 位 .(b)代码段.MOV 操作码 31H 02H .存储器 代码段(a)存储器 AH AL AX 名师精编 优秀教案 直接寻址指令是在指令的操作码后面中直接给出操作数的 16 位偏移地址,偏移地址也称为有效地址(EA,Effective Address),该地址与指令的操作码一起存放在内存的代码
23、段,按低 8 位-高 8 位的顺序存放,取指令时与指令操作码一起被送入 CPU。直接寻址指令中,默认使用 DS寄存器作为操作数的段基址寄存器。当然也可以显式地指定使用其他段寄存器称为段超越前缀,如下例中第二条指令中的“ES:”。【例 1】MOV AX,2A00H;将内存中从 DS:2A00H开始的连续两个字节的内容传送到 AX寄存器 MOV DX,ES:8000H;将内存中从 ES:8000H 开始的连续两个字节的内容传送到 AX寄存器 MOV SI,BUFFER;将内存中从 DS:BUFFER 开始的连续两个字节的内容传送到 SI 寄存器 上述第三条指令中的 BUFFER 这种形式的地址称为
24、符号地址用符号 来表示一个具体的偏移地址。注意:请仔细区别直接寻址指令与立即寻址指令二者的不同。直接寻址指令中的数值是操作数的16 位偏移地址,而不是操作数本身。为了区分二者,指令系统规定偏移地址是一个数字时要加上方括号(符号地址可省略方括号)。【例 2】指令“MOV AX,3102H”将数据段中偏移地址为3102H和 3103H两个单元中的内容送到 AX。如果(DS)=2000H,则所访问的操作数的物理地址为:20000H+3102H=23102H 指令执行后:AX=1122H。指令的执行情况如下图所示。.MOV 操作码 31H 02H .22H .存储器 数据段 AH AL AX 11H
25、代码段 23103H 23102H 名师精编 优秀教案 另外,若操作数不是存放在 DS段,则在指令中要使用段超越前缀加以声明。【例 3】指令“MOV BX,ES:1200H”用 ES寄存器中的内容作为段基地址,将偏移地址为 1200H和 1201H两单元的内容送到 BX寄存器中。3.2.3 寄存器寻址(Register Addressing)要点:操作数放在某个寄存器中 寄存器寻址方式中,操作数放在 CPU的某个寄存器中,它可以是通用寄存器(8 位或 16 位),也可以是基址寄存器(BX,BP)、变址寄存器(SI,DI)或段寄存器。注意:寄存器寻址指令在取操作数时不需要访问存储器,因此与段地址
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2023 微机 原理 精品 讲义 准备
限制150内