资源预览内容
第1页 / 共50页
第2页 / 共50页
第3页 / 共50页
第4页 / 共50页
第5页 / 共50页
亲,该文档总共50页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
名师精编优秀教案3.1 指令系统概述指令系统是微处理器所能执行的各种指令的集合,定义了一个微处理器所能完成的基本操作。不同的微处理器具有不同的指令系统,本章以Intel公司的 8086 为例来介绍微处理器的指令系统。采用 8086 CPU 的指令系统作为范例的原因有以下几点:(1) 应用的广泛性。 几乎所有的微机系统使用的都是x86 系列的 CPU(主要生产厂家有Intel公司和 AMD公司)。(2)指令的兼容性。8086 的指令系统是所有x86 系列 CPU的指令系统的基础,编写的程序可以直接在80286、80386 乃至 Pentium 、Core 2 Duo上执行。(3)资料的丰富性。x86 系列 CPU普及程度极广,其相关技术资料很容易找到,给应用开发带来很大方便。(4)与课程内容配合。【几个概念】指令 控制 CPU完成指定操作的命令。机器指令 指令的二进制代码形式。例如:11001101 00100001 (或表示成十六进制形式为: CD21H )。汇编指令 助记符形式的指令。例如:INT 21H 。指令系统 CPU的所有指令及其使用规则的集合。8086 指令按功能分为六大类(92 种),下表列出了最常用的一些指令。8086 CPU常用指令一览表指令类型助 记 符数据传送一般数据传送MOV ,PUSH , POP ,XCHG ,XLAT输入输出指令IN,OUT地址传送指令LEA,LDS ,LES标志传送指令PUSHF ,POPF算术运算加法指令ADD ,ADC ,INC减法指令SUB ,SBB ,DEC ,CMP乘、除法指令MUL ,DIV十进制调整指令DAA ,AAA , DAS,AAS ,AAM ,AAD逻辑运算和移位AND ,OR ,NOT ,XOR ,TESTSHL ,SAL ,SHR ,SAR ,ROL ,ROR ,RCL ,RCR串操作MOVS ,CMPS , SCAS ,LODS ,STOS名师精编优秀教案3.1.1 指令的基本组成指令分为 操作码 (也称为指令码)和操作数 两个部分, 操作码表示这条指令所要进行的是什么样的操作,操作数指示所要操作的对象。大多数 8086 指令的长度在14 个字节之间, 其长度与操作码和指令中操作数的多少以及操作数的类型有关。操作数越多,指令就越长。8086 指令系统规定,一条指令的操作数最多只能有两个。1. 指令格式8086 CPU 的指令格式如下:操作码 目的操作数 ,源操作数 其中:操作码用便于记忆的助记符 来表示(一般是英文单词的缩写)。操作数可以是双操作数(源操作数和目的操作数),也可以是单操作数,有的指令甚至可以不给出操作数(隐含操作数)。【例 1】双操作数的指令:MOV AX, BX ;MOV 是操作码, AX是目的操作数,BX是源操作数单操作数的指令:CALL proc1 ;CALL是操作码, proc1 是目的操作数无操作数的指令:STC ;STC 是操作码2. 操作数类型8086 指令系统中的操作数主要分为三类:立即数操作数、寄存器操作数和存储器操作数。1)立即数操作数所谓立即数是指具有固定数值的操作数,即常数。它可以是字节(8 位)或字( 16 位),当它们分别代表无符号数和带符号数时,其各自的取值范围如下表所示。控制转移JMP ,条件转移指令(Jxx), LOOP/ LOOPE/ LOOPNEINT/ IRET ,CALL/RET处理器控制CLC,STC,CLD ,STD,HLT名师精编优秀教案立即数操作数的取值范围8 位数16 位数无符号数00H-0FFH (0255)0000H-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 位寄存器( 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. 不允许用一条指令把立即数传送到段寄存器。如果需要这样做,可用某个通用寄存器作为中间桥梁,用两条传送指令实现。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 位)、字( 16 位)或双字(32 位),分别要占据一个、两个或四个存储单元。存储器操作数在指令中既可作为源操作数,也可作为目标操作数。但对大多数指令,不允许源操作数和目标操作数同时为存储器操作数。若确实要对两个存储器操作数进行操作,可以使用任一通用寄存器作为中间桥梁来实现。CS(16 位)DS(16 位)ES(16 位)SS(16 位)段寄存器存放当前操作数的段基地址名师精编优秀教案在汇编语言中, 存储器单元是用逻辑地址来制定的,而逻辑地址是由段基地址和偏移地址两部分构成。所以,要访问存储器操作数必须首先确定操作数所在的段基地址。如上所说, 段基地址是放在段寄存器中的,所以, 访问存储器操作数前,应先确定对应的段寄存器是否已经初始化为所需要的段基地址。那么,访问存储器操作数要使用四个段寄存器中的哪一个呢?8086 CPU 规定,若指令中没有指明使用哪一个段寄存器的内容作为段基地址来访问存储器操作数, 则根据操作数的特征来确定所使用的默认段寄存器。各种存储器操作所约定的默认段寄存器、段超越(即显式地指明段寄存器)所允许的段寄存器、以及相应的偏移地址来源见下表。【例 5】MOV AL, 2A00H ;通用数据传送,用DS的内容作为段基地址,偏移地址为2A00H PUSH AX ;堆栈操作,用SS的内容作为段基地址,偏移地址在SP中LODSW ; 串操作,用DS的内容作为源串地址的段基地址,偏移地址在SI 中ADD AL, BP+DI ;BP作为基址寄存器,用SS的内容作为段基地址,偏移地址为BP和 DI 之和3.1.2 指令的执行时间了解指令的执行时间,对编写时间敏感的程序是很重要的。例如: 在用软件产生定时或延时时或工业控制领域中对某些实时性要求较严的诚和,都需要估算出一段程序的运行时间。一条指令的执行时间以时钟周期数为单位。不同指令的执行时间有较大的差别,这里 列出了部分常用指令的执行时间及其访问存储器的次数。常用指令执行时间指 令所需时钟周期数访问内存次数MOV 累加器到内存内存到累加器寄存器到寄存器内存到寄存器寄存器到内存10(14) 10(14) 2 8(12)+EA 9(13)+EA 1 1 0 1 1 MOV 立即数到寄存器立即数到内存4 10(14)+EA 0 1 段寄存器使用的一些基本约定存储器操作类型默认的段寄存器允许超越的段寄存器段内偏移地址来源取指令CS无IP堆栈操作SS无SP通用数据传送DSCS,ES,SS按寻址方式取得串操作源串地址DSCS,ES,SSSI串操作目的串地址ES无DIBP 作为基址寄存器SSCS,DS,ES按寻址方式取得名师精编优秀教案寄存器到段寄存器内存到段寄存器段寄存器到寄存器段寄存器到内存2 8(12)+EA 2 9(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 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 8(12)+EA 24(32)+EA 条件转移JCXZ 6( 不转移 ) 18( 转移 ) 其它条件转移指令Jxx 4( 不转移 ) 16( 转移 ) 注:(1)表中 EA表示偏移地址。小括号内的数为8088进行字操作的时钟数。因为8088的数据线只有 8位,每个总线周期只能传送一个字节,所以对字操作要再加上4个时钟周期。(2)对条件转移指令,若条件满足,执行的时间比较长。因为要产生转移,就要包括取下一条指令所需的时间。若条件不满足,执行时间就较短。因为此时不产生转移,而是执行下一条指令。存取操作数的时间与采用的寻址方式有关。寄存器寻址执行的时间最短,而对存储器操作数则还需考虑计算偏移地址所花的时间。这里 列出了不同寻址方式下,计算偏移地址所需要的时间。计算偏移地址EA所需时间名师精编优秀教案寻 址 方 式计算 EA所需时钟数直接寻址6寄存器间接寻址5寄存器相对寻址9基址、变址寻址BX+SI ,BX+DI7BP+SI ,BP+DI8基址、变址加相对寻址BX+SI+位移量 ,BP+DI+位移量 11BX+DI+位移量 ,BP+SI+位移量 12注:若有段超越,则需再加上两个时钟周期。可以看出,对同一种指令,如果寻址方式不同,其指令执行时间可能相差很大。寄存器操作数的指令执行速度最快,立即数操作数次之,存储器操作数指令的执行速度最慢。这是由于寄存器位于 CPU的内部,执行寄存器操作数指令时,8086 的执行单元( EU )可以直接从 CPU 内部寄存器中取得操作数,不需要访问内存,因此执行速度很快。立即数操作数作为指令的一部分,在取指时已经被 8086 总线接口单元(BIU) 取出后存放在指令队列中,执行指令时也不需要访问内存,因而执行速度也比较快。而存储器操作数先要由总线接口单元计算出其所在单元的20 位物理地址,然后再执行存储器的读写操作。所以相对前述两种操作数来说,指令的执行速度最慢。【例】 当通用数据传送指令(MOV )的操作数分别为:寄存
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号