《第2章微处理器与指令系统.ppt》由会员分享,可在线阅读,更多相关《第2章微处理器与指令系统.ppt(158页珍藏版)》请在三一文库上搜索。
1、第二章 微处理器和指令系统,2011.9.18,2.1.1 8086/8088 微处理器,8086是1978年推出的全16位微处理器, 8088是1978年推出的准16位微处理器。二者除外数据总线位数(8086为16位,8088为8位)及与此相关的部分逻辑稍有差别外,内部结构和基本性能相同,指令系统完全兼容。,在8086/8088的设计中,引入了两个重要的结构概念: 指令流水线 存储器分段,这两个概念在以后升级的Intel系列微处理器中一直被沿用和发展。正是这两个概念的引入,使8086/8088比原来的8位MPU在运行速度、处理能力和对存储空间的访问等性能方面有很大提高。,2.1 8086/8
2、088微处理器,内部结构 指令流水线 存储器分段,8086是全16位微处理器,8088是准16位微处理器。二者除了外数据总线位数及与此相关的部分逻辑稍有差别外,内部结构和基本性能相同,指令系统完全兼容。,1.内部结构,2.1.1 8086/8088微处理器,20位,AB,EU 控制电路,总线 控制电路,通用寄存器,累加器,基址寄存器,计数寄存器,数据寄存器,堆栈指针,基址指针,目的变址,源变址,指针寄存器,变址寄存器,地址加法器,运算暂存器,ALU,标志寄存器,指令指针,内部暂存器,指令队列,总线接口单元(BIU),执行单元(EU),外部总线,8086/8088,DB,8088:8位 8086
3、:16位,CS,DS,SS,ES,IP,1 2 3 4 5 6,8位,8088,8086,AX AH AL BX BH BL CX CH CL DX DH DL,SP BP DI SI,ALU DB,16位,8086 CPU内部指令执行流程 段寄存器CS 程序指针寄存器IP 内容经过地址加法器形成20 位地址; 由CPU内部地址总线AB , 经过总线地址控制电路, 向外部总线发读取指令的的控制信号, 外部总线开始总线操作; 读取指令送入到指令队列中, 等待执行; EU单元从队列中取一条指令到EU控制电路,译码指令需要做的系列操作,包括寄存器的内容送累加器; 操作结果经过内部数据总线, 存放到寄
4、存器或内部暂存器,同时置FR; 根据DS寄存器的内容,及指令寻址方式产生的偏移量,经过地址加法器,形成数据保存地址,并送到外部总线。CPU 发写总线操作命令,将暂存器的内容, 通过总线, 写到指定内存单元。,2.指令流水线,指令队列的存在使EU和BIU并行工作,取指令和分析、执行指令操作可重叠进行,形成了两级指令流水线结构,减少了CPU等待时间,提高了CPU的利用率,加快了整机运行速度,降低了对存储器存取速度的要求。,BIU,EU,8086/8088的指令“流水”操作,取指令1,取指令2,译码1,取数据1,执行1,取指令3,译码2,存结果1,执行2,取指令4,译码3,取指令5,等待,3.存储器
5、分段,8086物理地址(1M=220),将1MB的物理存储空间分成若干个逻辑段,每段大小为64KB。,段的起始单元地址叫段基址,存放在段寄存器中。通过4个段寄存器,CPU每次可同时对4个段进行寻址。,分段方式不唯一,各段之间可以连续、分离、部分重叠或完全重叠,这主要取决于对各个段寄存器的预置内容。,1000H,2000H,3100H,3100H,代码段 (64KB),堆栈段 (64KB),数据段与附加数据段重叠 (64KB),CS,10000H,20000H,31000H,SS,DS,ES,1FFFFH,2FFFFH,40FFFH, 存储器分段结构示例,物理地址是1MB存储空间中的某一单元地址
6、,用20位地址码表示,CPU访问存储器时,地址总线上送出的就是物理地址。 逻辑地址在编程时采用,由段基址和偏移地址组成,两者均为16位。, 物理地址和逻辑地址,逻辑地址与20位物理地址的变换关系: 物理地址=段基址16+偏移地址, 逻辑地址与物理地址的变换,【例】 若数据段寄存器DS2100H,试确定该存储区段物理地址的范围。 一个逻辑段的最大容量为64KB; 第一个存储单元的偏移地址为0; 最后一个存储单元的偏移地址为FFFFH。 该数据区段由低至高相应存储单元的偏移地址为: 0000H FFFFH。 存储区的首地址 DS16偏移地址 2100H160000H21000H 存储区的末地址DS
7、16偏移地址 2100H16FFFFH 30FFFH,2.2.3 Pentium的四种工作方式,实地址工作模式 最基本的工作方式。 8086/8088的实地址模式保持兼容。 微处Pentium理器的实地址模式具有更强的功能,增 加了寄存器,扩充了指令,可进行32位操作。 实模式操作方式只允许微处理器寻址第一个1MB存储器空间; 当微处Pentium理器工作于实地址模式时,存储器的管理方式与8086微处理器存储器的管理方式完全相同。,2.2 Pentium微处理器,2.保护虚拟方式 通常在程序运行过程中,应防止以下情况的发生: 应用程序破坏系统程序。 某一应用程序破坏了其他应用程序。 错误地把数
8、据当作程序运行。 为了避免出现以上情形的发生,所采取的措施称作“保护”。,基本寄存器 系统级寄存器 调试和模型专用寄存器 浮点寄存器,Pentium的内部寄存器,按功能可分为4类:,2.2.2 Pentium内部寄存器,2.2 Pentium微处理器,31 16 15 7 0,通 用 寄 存 器,EAX AH AX AL,EBX BH BX BL,ECX CH CX CL,EDX DH DX DL,EDI DI,ESI SI,EBP BP,ESP SP,1. 基本寄存器,EIP用于保存下一条待预取指令相对于代码基址的偏移量。它的低16位也可单独访问,称之为IP。, 标志寄存器位定义,C F,E
9、FLAGS,FLAGS,31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,A C,V M,R F,0,N T,IOPL,O F,D F,IF,T F,S F,Z F,0,A F,0,P F,0,X 对准检查标志,X 虚拟86模式标志,X 恢复标志,X 嵌套标志,X 特权级标志,S 溢出标志,C 方向标志,X 中断允许标志,X 自陷标志,S 符号标志,S 零标志,S 辅助进位标志,S 奇偶标志,S 进位标志,注:S表示状态标志,X表示系统标志,C表示控制标志,X 虚拟中断标志
10、,X ID标志,X 虚拟中断挂起,0 0 0 0 0 0 0 0 0 0,VIF,VIP,ID, 段寄存器,Pentium有6个段寄存器:,编程者可直接访问的,编程者不能访问的,段选择符,段描述符,实地址方式和虚拟8086方式下相同,段的长度固定为64KB,段选择器就是段寄存器,它保存的是逻辑段基址的高16位,将它的内容左移4位即可得到实际段基址,而不必使用描述符高速缓存器。,在保护虚地址方式下,段的长度可以在1字节到4G字节之间变化;为了描述每个段的基址、属性和边界,为每个段定义了一个描述符。,Pentium段的定义与8086有所不同:,这类数不带任何符号信息,只含有量值域,仅CPU支持。分
11、为三类:, 字节: 字: 双字:,任何逻辑地址上的8位相邻位串。,任何字节地址开始的2个相邻字节。低字节地址为该字地址。,任何字节地址开始的2个相邻字,即4个相邻字节。最小字节地址为双字的地址。,1.无符号二进制数(序数),2.3.1 基本数据类型,2.3 Pentium微处理器指令系统,这类数均以补码表示,有8位数(字节)、16位数(字)、32位数(双字)、64位数(4字)四种。,CPU支持前3种,FPU支持后3种。,2.带符号的二进制定点整数(整数),关于数据类型的两点说明:,(1)各类型数据中,基本的数据类型仍是字节、字和双字 尽可能将字操作对准于偶地址,将双字操作对准于4的整数倍地址。
12、 对准的字和双字可一次传递完,未对准的字和双字需几次才能传递完。 (2)对于字和双字数据,80X86是采用低端低地址方式来存储 字数据被存储在两个相邻的字节单元之中,低位字节在低地址单元,高位字节在高地址单元; 双字数据存储在四个连续字节单元中,最低位字节在最低地址单元,最高字节在最高地址单元。 而字或双字数据的地址是指最低位字节所在的单元地址。,2.3.2 操作数寻址方式,1. 寻址方式和有效地址概念 2. 11种寻址方式 3. 存储器寻址时的段约定 4. 应用举例,寻址方式就是寻找指令中操作数地址的方式。操作数所在地址有三种可能:,直接包含在指令中,即指令的操作数部分就是操作 数本身。这种
13、操作数叫立即数,对应的指令寻址方 式称为立即数寻址。,包含在CPU 的某个内部寄存器中。这时指令中的操 作数部分是CPU的一个寄存器,这种指令寻址方式称 为寄存器寻址。,在内存储器中。这时指令的操作数部分包含着该操 作数所在的内存地址。这种指令寻址方式称为存储 器寻址。,1.寻址方式和有效地址概念,寻址方式,在Pentium系列MPU中,内存实际地址(PA): PA = 段基地址 + 段内偏移地址(EA ) 为了适应处理各种数据结构的需要,段内偏移地址可由以下几部分组合而成:,基址寄存器内容 变址寄存器内容 比例因子(仅与32位方式相关) 位移量,这四个基本部分称为偏移地址四元素,一般又将由这
14、四种元素组合形成的偏移地址称为有效地址EA。,EA=基址+(变址比例因子)+位移量,有效地址EA,指令寻址字段规定了操作数的来源部件和如何计 算EA的方法。 实地址与保护方式的PA 方法不同.,无AX 、CX 、DX、SP、IP寄存器,保护方式下的寻址过程(地址转换过程) - 虚拟存储,逻辑地址 = 段选择符 :有效地址,偏移地址四元素可优化组合出9种存储器寻址方式,加上立即数寻址和寄存器寻址,Pentium共有11种寻址方式:,(1) 立即数寻址 (2) 寄存器寻址 (3) 直接寻址 (4) 寄存器间接寻址 (5) 基址寻址,(6) 变址寻址 (7) 比例变址寻址 (8) 基址加变址寻址 (
15、9) 基址加比例变址寻址 (10)带位移的基址加变址寻址 (11)带位移的基址加比例变址寻址,2. 11种寻址方式,EA=基址+(变址比例因子)+位移量,在这种寻址方式下,操作数作为立即数直接存在指令中,可为8位、16位或32位。,立即数寻址,78563412顺序存放在指令后面,在这种方式下,操作数包含在指令规定的8位、16位或32位寄存器中。,这种寻址方式指令编码短,无需从存储器取操作数,故执行速度快。,(2)寄存器寻址(寄存器直接寻址),指令中的操作数部分直接给出操作数有效地址EA。 与操作码一起放在存储器代码段中,可以是16位或32位整数。 操作数一般在数据段DS中。,(3)直接寻址(存
16、储器直接寻址),实际中对于直接寻址,如操作数在DS段中,则可直接写成:,MOV AX,3000H,如操作数在DS之外的其他段(CS,SS,ES,FS,GS)中,指令中则必须用段寄存器名前缀(称为段超越前缀)予以指明。例如:,MOV AX,FS:3000H,直接寻址主要用于单个操作数的相对寻址场合(如简单的标量操作数寻址和静态分配数组的起始地址寻址等)。,操作数放在存储器中,但其有效地址EA在寄存器中,即: EA = 寄存器 寄存器的使用规定在16位寻址和32位寻址时不一样。 16位: BX , BP ,SI , DI 32位: EAX EBX, ECX, EDX ESI. EDI. EBP,
17、ESP,(4)寄存器间接寻址, 16位寻址时,偏移地址放在SI、DI、BP或BX中。这 时又有两种段默认情况:,若以SI、DI、BX间接寻址,则默认操作数在DS段中。 例如: MOV AX,SI ;默认DS为段基址 若以BP间接寻址,则默认操作数在SS段中。 例如: MOV AX,BP ;默认SS为段基址,如果操作数不在上述规定的默认段,而是在其他段,则必须在指令中相应的操作数前加上段超越前缀。例如:,MOV AX,ES:SI MOV AX,DS:BP, 32位寻址时,8个32位通用寄存器均可作寄存器间接寻址 例如:,MOV EBX,EAX ;默认DS为段基址,传送双字给EBX MOV DX,
18、EBX ;默认DS为段基址,传送字给DX MOV CH,EAX ;默认DS为段基址,传送字节给CH,除ESP、EBP默认段寄存器为SS外,其余6个通用寄存器均默认段寄存器为DS。 如操作数在默认段之外,指令中必须加段超越前缀。,寄存器间接寻址的应用场合与直接寻址的应用场合相似,当更灵活。,在这种方式下, EA=基址寄存器+位移量。 其中位移量一定要为常数,且跟随在操作码之后,与操作码一起存放在代码段中。,16位寻址情况下,BX和BP作为基址寄存器。 BX以DS作为默认段寄存器, BP以SS作为默认段寄存器。 位移量可为8位或16位; 32位寻址情况下,8个32位通用寄存器均可作基址寄存器 其中
19、ESP、EBP以SS为默认段寄存器, 其余6个通用寄存器均以DS为默认段寄存器。 位移量为8位或32位。,例如: MOV EAX,BX+24 ;也可写成MOV EAX,24BX MOV ECX,EBP+50 ;也可写成MOV ECX,50EBP MOV DX,EAX+1500H;也可写成MOV DX,1500HEAX,(5)基址寻址,2-43,EA=变址寄存器+位移量 指令书写格式和寻址执行过程与基址寻址相同; 区别仅在于将基址寄存器改成变址寄存器。,(6)变址寻址, 16位寻址时,仅SI、DI可作变址寄存器,且 默认DS作为段基址寄存器。如:,MOV AX, COUNT SI, 32位寻址时
20、, 除ESP外的任何通用寄存器均可作变址寄存器。 默认EBP以SS作段基址寄存器, 其余均以DS作段基址寄存器。,MOV EAX,5EBP MOV ECX,DATAEAX,基址、变址寻址适于对一维数组的数组元素进行检索操作。位移量表示数组起始地址偏移量;基址/变址表示数组元素的下标,可变。,MOV ECX,DATAESP 是什么寻址方式? 答案:基址寻址方式。默认段寄存器SS 变址寻址不能使用ESP,在这种方式下:,EA=变址寄存器比例因子+位移量,这种寻址方式只适于32位寻址一种情况。例如:,MOV EAX,TABLEESI*4 ;TABLE是位移量,4是比例因子,(7)比例变址寻址,比例变
21、址寻址和基址/变址寻址的作用相似,也适用于对一维数组元素的检索。但当数组元素大小为2/4/8字节时,用它更方便、更高效。,在这种寻址方式下,,EA=基址寄存器+变址寄存器,例如:,MOV AX,BX+SI ;或写成 MOV AX,BXSI MOV AX,BPSI,它有16位寻址和32位寻址两种情况,每种情况下基址、变址寄存器的使用规定和段寄存器的默认规定与前面所述相同。 基址寄存器与变址寄存器默认的段寄存器不相同时,一般规定由基址寄存器(比如:BP,BX)来决定默认哪一个段寄存器作段基址指针。,基址加变址寻址主要用于二维数组元素的检索和二重循环等。,(8)基址加变址寻址,在这种方式下,EA=
22、基址寄存器 +变址寄存器比例因子,它只有32位寻址一种情况。 格式举例:,MOV ECX,EDX*8EAX ;或MOV ECX,EDX*8+EAX MOV AX,EBX*4ESI ;或MOV AX,EBX*4+ESI,这种方式主要用于数组元素大小为2/4/8字节时的二维数组检索操作等场合。,(9)基址加比例变址寻址,在这种方式下:,EA=变址寄存器+基址寄存器+位移量,这种方式也分16位寻址和32位寻址两种情况。变址、基址寄存器的使用约定和对段寄存器的默认约定与前面所述相同。格式举例:,MOV AX,BX+DI+MASK 或 MOVAX,MASKBXDI ADD EDX,ESIEBP+0FFF
23、F000H 或 ADD EDX,0FFFF000HESIEBP,这种寻址方式也是主要用于二维数组操作,位移量即为数组起始地址。,(10)带位移的基址加变址寻址,这种方式将偏移地址四元素都用上了,即:,EA=变址寄存器比例因子+基址寄存器+位移量,它只有32位寻址一种情况。各种约定和默认情况同前所述。,格式举例:,INC EDI*8ECX+40 ;或INC EDI*8+ECX+40,当二维数组的数组元素大小为2/4/8字节,且数组起始地址不为0时,适于用这种寻址方式进行数组检索操作。,(11)带位移的基址加比例变址寻址,3.存储器寻址时的段约定,访存操作类型 默认段寄存器 允许超越的段寄存器 偏
24、移地址寄存器,堆栈操作 SS 无 (E)SP,取指令代码 CS 无 (E)IP,源串数据访问 DS CS、SS、ES、FS、GS (E)SI,目的串数据访问 ES 无 (E)DI,通用数据访问 DS CS、SS、ES、FS、GS 偏移地址,SS,CS、DS、ES、FS、GS,偏移地址,以(E)BP、(E)SP 间接寻址的指令,4.应用举例,例2.1 已知80486工作在实地址方式下,其中一些寄存器的内容和一些存储单元的内容如图所示,试指出下列各条指令执行后,AX中的内容。, MOV AX,2010H, MOV AX,BX, MOV AX,1200H, MOV AX,BX, MOV AX,110
25、0HBX, MOV AX,BXSI, MOV AX,1100HBX+SI,AX = 2010,AX = 0100H,AX = 4C2AH,AX = 3412,AX = 4C2AH,AX = 7856,AX = 65B7H,数据传送是计算机中最基本、最常用、最重要的一类操作。如:,这类指令寻址方式最丰富,除POPF外,均不影响标志寄存器的标志位。,在实际程序中,它的使用频率最高。, 各种初始化操作 取操作数 保存结果,2.3.4.1数据传送类指令,2.3.4 通用整数指令及应用,1. 传送指令MOV,指令操作:(源操作数)目的操作数,指令格式:MOV 目的操作数,源操作数,寻址规定: REG/M
26、EM/SREG, REG REG/MEM , SREG REG/SREG , MEM REG/MEM , IMM,立 即 数,通用寄存器,(EAX、EBX、ECX、EDX、 EBP、ESP、ESI、EDI),CS,存 储 器,段寄存器,(SS、DS、ES、FS、GS),MOV指令允许的传送关系,MOV指令使用说明:,源操作数和目的操作数的类型必须一致。 目的操作数不能为立即数。 CS和(E)IP均不能用作指令的目的寄存器。 段寄存器间不能直接传送,也不能直接将立即数送给段寄存器。 源操作数为立即数,而目的操作数类型不确定时,要给目的操作数加类型说明。,源操作数和目的操作数不能同为存储器操作数。
27、,目的操作数, 源操作数 REG/MEM/SREG,REG REG/MEM, SREG REG/SREG, MEM REG/MEM, IMM, MOV DS,100, MOV 1000H,23H,错。源、目的操作数不能同为存储器寻址。, MOV 1000H,2000H,错。立即数不能直接赋给段寄存器。,错。目的操作数长度不确定。, MOV CS,AX,错。不能用传送指令改变代码段寄存器。, MOV AX,0100H+BX+BP,错。地址寄存器不能同为基址寄存器。,例 识别下列指令的正确性,对错误的指令,说明错误的原因。,MOV AX,100 MOV DS,AX,MOV WORD PTR 100
28、0H,23H,MOV AX,2000H MOV 1000H,AX,2. 交换指令,操作: (目的操作数) (源操作数),格式:XCHG 目的操作数,源操作数 REG/MEM, REG REG, MEM,XCHG AX , CX 等价如下指令: MOV BX , AX MOV AX , CX MOV CX , BX,注意: (1)该指令不影响标志位; (2)不允许使用段寄存器。,MOVSX ECX , AL ; (AL)= F8H ; (ECX)F= FFFF FFF8 MOVZX ECX , AX ; (AX) = FFF8H ; (ECX) = 0000 FFF8H,3. 扩展传送指令(非8
29、086指令),格式: MOVSX 目的操作数,源操作数 MOVZX 目的操作数,源操作数 操作: MOVSX:带符号扩展指令 MOVZX: 零扩展指令 特点:扩展后数的真值不变。,4. 地址传送指令,格式:LEA 目的操作数,源操作数 REG16/REG32 MEM 操作: REG16/REG32 EA (源操作数地址偏移),装入有效地址,注意: 寄存器、立即数和段寄存器都不能作为源操作数。,说明: LEA指令处理变量的地址(EA)而不是变量的内容 LEA和MOV指令的比较 MOV BX, OFFSET VAL ;将VAL的有效地址=BX MOV BX, VAL ;将VAL的值=BX LEA
30、BX, VAL ;将VAL的有效地址=BX,MOV指令用 OFFSET操作不能直接取数组中任意元素 的位移量,只能取数组的第一个元素的位移量,而LEA可以传送任意数组元素的位移量。 如LEA DX, BETABXSI LEA的源操作数必须是存储器操作数 LEA不影响F标志,5. 堆栈指令PUSH/POP,格式:PUSH 源操作数 REG16/MEM16 REG32/MEM32 操作: (E)SP)-2/4(E)SP (源操作数)(SS:(E)SP) 注:286以上可以有立即数方式。,(1) 压栈指令,先调整指针, 然后存储数据; 先压高字节后压低字节,格式:POP 目的操作数 MEM16/ME
31、M32/REG16/REG32 操作:(SS:(E)SP)目的操作数 (E)SP)+ 2/4(E)SP,(2) 弹栈指令,先传数据, 后调整指针 先弹低字节后弹高字节。,堆栈指令的操作数只能为字或双字。 8086只有字操作指令 操作数是存储器寻址时,操作数长度不确定时, 要用PTR运算符。 PUSH和POP要成对出现,以保持堆栈平衡 堆栈指令也隐含了一个目的/源操作数堆栈。 压栈顺序是先压高字节后压低字节,弹栈则是先弹低字节后弹高字节。,(3)堆栈指令使用说明:,例 用堆栈操作指令将BX和CX中的两个16位数(其中BX是高16位)组成32位数传送到EAX寄存器中。,PUSH BX ; PUSH
32、 CX ; POP EAX EAX = BX :CX,解:,SP1 ,SP1-2 ,BH,BL,CH,CL,SP1- 4 ,SS ,【例】 分析下列程序段的执行情况。 MOV CX , 3000H MOV SP, CX ; 设置堆栈的底 部, MOV AX, 1234H ; 设置AX初始值, MOV BX, 5678H ; 设置BX初值, PUSH AX PUSH BX ; 将AX, BX内容 压入堆栈 POP AX POP BX ; 由堆栈弹出数据 送入AX, BX中,实现AX,BX寄存器内容交换,POP : 先传数据 , 后调整指针 ; 先弹低字节后弹高字节。,PUSH: 先调整指针, 然
33、后存储数据;先压高字节后压低字节,说明: XLAT是一条隐含寻址的指令。隐含两个操作数:DS:(E)BX存放表基址,AL存放查表参数。使用前要给隐含操作数赋初值。,6. 查表指令,格式: XLAT 操作: (EBX)+(AL)AL (BX)+(AL)AL,例2.5 内存中自TABLE开始的16个单元连续存放着自然数0到15的平方值(构成一个平方表),任给一整数M在XX单元中(该数为0M15),查表求M的平方值,并将结果存入YY单元中。,解: LEA BX,TABLE MOV AL,XX XLAT MOV YY,AL,说明:I/O端口有两种寻址方式 直接寻址,寻址范围为0255; 间接寻址,寻址
34、范围为0216-1。,(1) 输入指令 格式:IN 累加器, 端口 AL/AX/EAX,IMM8 AL/AX/EAX,DX 操作: AL/AX/EAX(I/O端口),7. I/O指令,(2) 输出指令,格式:OUT 端口, 累加器 IMM8, AL/AX/EAX DX , AL/AX/EAX 操作:(AL/AX/EAX)I/O端口,例 设程序在数据段中定义的数组如下: NAMES DB TOM DB 20 DB ROSE DB 30 DB KATE. DB 25 请指出下列指令是否正确,如正确,A累加器中的结果是多少?,8. 传送指令应用举例,1. MOV BX, OFFSET NAMES M
35、OV AL,BX+5,(AL)=NAMES+5=20,2. MOV AX, WORD PTR NAMES+1,(AX)=NAMES+1=MO=4D4FH,3. MOV BX, 6 MOV SI,5 LEA DI,NAMESBXSI MOV AL,DI,(DI)=NAMES偏移地址+(BX)+(SI) =NAMES偏移地址+11 (AL)=NAMES+11=K=4BH,它的操作结果一般会影响标志寄存器中的状态标志位,如ZF、CF、SF、OF、AF、PF等。,2.3.4.2 算术运算类指令,1. 加法/减法指令,操作: ADD:(目的)+(源) 目的 SUB: (目的)-(源) 目的 ADC:(目
36、的)+(源)+CF目的 SBB: (目的)-(源)-CF目的,列3.12 已知 AL = 0C1H , BL = 7FH. SUB AL , BL 人工计算: 1100 0001 (AL) - 0111 1111 (BL) = 0100 0010 42H AL = 42 H ,ZF= 0 , SF=0, CF = 0,AF = 1 ,PF= 1 , OF =1 负-正 = 正 ,或 C2=0 , C1=1 对于无符号数, CF = 0 ,无溢出; 对于有符号数, OF = 1 ,溢出。,机器计算过程: 1100 0001 + 1000 0001 ;补码 ,BL 求反加1 = 1 0100 00
37、10 ; 42H 根据补码溢出判断标准,C2=1,C1=0 ,溢出; AL = 42 H ,ZF= 0 , SF=0, CF = 0,AF = 1 ,PF= 1 , OF=1 用补码加法实现减法时, CF , AF 需要取反。,解: 用8086指令 MOV AX,Y SUB X,AX ;低16位字数据相减 MOV AX,2Y SBB 2X,AX ;高16位字数据相减, 用80386/486指令 MOV EAX,DWORD PTR Y SUB DWORD PTR X,EAX,两个32位双字数据X、Y定义如下: X DW 1234H,5678H ;X = 56781234 Y DW 3FEAH,A
38、033H ; Y = 33A03FEA 请编写计算X=XY的程序段(低位在前),例,特殊加减法指令,INC: (目的操作数 ) +1 目的操作数 DEC: (目的操作数 ) +1 目的操作数 目的操作数:寄存器或存储器 影响状态标志:OF ,SF,ZF,AF,PF。不影响CF,INC SI INC WORD PTR SI INC BYTE PTR BX SI DEC ECX,加法/减法指令使用说明:,ADD/SUB指令用于单个字节/字/双字数的加/减法运算; ADC/SBB指令则常用于多精度或多字节/多字/多双字数的加/减法运算。 INC/DEC REG/MEM ADD/SUB REG/MEM
39、,1 两者都执行加1/减1操作,但前者不影响进位,而后者影响。,指令的异同:,2. 整数变反指令(求补),格式: NEG 目的操作数 REG/MEM 操作: 0-(目的操作数) 目的操作数 标志: OF ,SF,ZF,ZF,PF,CF 应用: 常用于求负数的绝对值。,解: TEST AX,8000H ;测试符号位 JZ NEXT NEG AX NEXT:HLT,例 求AX中存放的有符号数的绝对值。,3. 比较指令,格式: CMP 目的操作数,源操作数 REG, REG/MEM/IMM MEM, REG/IMM,CMP与SUB指令都执行减法操作,但前者不因操作结果改变目标操作数值,而后者改变。,
40、操作:(目的操作数)(源操作数),根据操作结果修改状态标志,但不改变目标操作数值。,【例】 CMP AL, CL 指令执行前,AL68H,CL9AH。 指令执行: AL68H, CL9AH, CF1, ZF0, SF1, AF1, OF1, PF0。 作为无符号数比较,被减数小于减数,不够减,有借位,CF1。 作为有符号数时, C2C1=10,结果已超出有符号数所能表示的范围,因此OF1,有溢出。,单操作数乘法指令,格式:MUL/IMUL 源操作数 REG/MEM,操作:MUL和IMUL分别为无符号数和有符号数乘法指令,两种指令除操作数类型不同外,操作完全相同:,字: (AX)(源操作数)DX
41、:AX,双字:(EAX)(源操作数)EDX:EAX,4. 乘法指令,单操作数乘法指令的被乘数是隐含的(在AL / AX / EAX中),而结果长度一定是被乘数/乘数的二倍(在 AX / DX:AX / EDX:EAX中)。 源操作数不能为立即数。 源操作数为存储器操作数,且类型不能确定时,要显式说明操作数类型。 要根据是有符号数还是无符号数,分别选用IMUL或MUL指令 指令执行影响CF和OF标志.若指令执行后,结果的高一半是有效数值位,则CF=OF=1,否则CF=OF=0。,乘法指令使用说明:,例2.11,解: MUL BL指令完成AL和BL中的两个无符号数相乘:,AH含有效数字, OF=1
42、、CF=1。,(AX)=0A8CH,12C,+ 96,若(AL)=96H,(BL)=12H,求分别执行MUL BL和IMUL BL指令后的结果及OF、CF状态。,AH含有效数字, OF=1、CF=1。,解: IMUL 执行有符号数乘法,此时AL=96H中的数是负数,真值为-6AH,即:,用补码表示: (AX)= F88CH,(AX)= -774H,D4,+ 6A,5. 除法指令,格式:DIVIDIV 源操作数(除数) REG/MEM 操作:按源操作数类型: 状态标志不确定,字节: (AX)/(源),商存于AL中,余数存于AH,字: (DX:AX)/(源),商存于AX中,余数存于DX,双字: (
43、EDX:EAX)/(源),商在EAX中,余数在EDX,说明: 除法指令的被除数是隐含的,且长度一定是除数的二倍(在AX,DX:AX ,EDX:EAX中)。使用除法指令常要扩展被除数长度。 扩展时无符号数一般用: MOVZX AX,AL MOV DX,0 MOV EDX,0 有符号数一般用:CBW/CWD/CDQ。 CBW : 等价指令 MOVSX AX , AL CWD : AX 带符号扩展 DX:AX 源操作数无立即数。,MOV AX,a ; ; ab在CX:BX中 MOV AX,c ;c在DX:AX中 ;ab+c在DX:AX中 ;(ab+c)/a,商存入S ,IMUL b,MOV CX,D
44、X,MOV BX,AX,CWD,ADD AX,BX,ADC DX,CX,IDIV a,MOV S,AX,例2.12 下列程序段完成S=(ab+c)/a的运算,其中变量a、b、c和S均为带符号的字数据,结果的商存入S,余数则不计,填空完成下列程序。, 格式: AAAAASAAMAADDAADAS, 功能:,AAA/AAS: 未组合BCD加法/减法调整指令, 隐含操作 数为AL。,DAA/DAS: 组合BCD加法/减法调整指令, 隐含操作数为AL。,6. BCD调整指令,例,解: MOV AL,BYTE PTR X ADD AL,BYTE PTR Y ; 低位相加 DAA ; BCD码调整 MOV
45、 BYTE PTR X,AL ; 保存低位结果 MOV AL ,BYTE PTR X1 ; 取字变量的高字节 ADC AL ,BYTE PTR Y1 ; 高位相加 DAA MOV BYTE PTR X1,AL ; X = 7412,两个4位压缩BCD码定义如下: X DW 3578H Y DW 3834H 请编写计算X+Y的程序段。,多字节BCD加法/减法只能用带进位/借位的字节加法/减法指令实现!,AAM : 未组合BCD乘法调整指令, 隐含操作数AX。 将AX中乘积调整为两个未组合BCD数存于AH 和AL。,AAD : 调整除法运算前AX中的被除数内容。 操作:(AH)10+(AL)AX,【例】 设AL , BL 是未压缩BCD码 MUL BL ;AL * BL - AX AAM 指令执行前,AL07H, BL09H。 执行MUL后,AL3FH=63。 执行AAM后,AH06H, AL03H。,程序段 MOV AX,405H MOV BL,06H AAD DIV BL 执行后AX的内容为 。 A.307H B.703H C.4231H D.806H
链接地址:https://www.31doc.com/p-2120653.html