寻址方式和指令系统.ppt_第1页
寻址方式和指令系统.ppt_第2页
寻址方式和指令系统.ppt_第3页
寻址方式和指令系统.ppt_第4页
寻址方式和指令系统.ppt_第5页
已阅读5页,还剩217页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章 8086指令系统,3-1 8086 的寻址方式 3-2 指令的机器码表示方法 3-3 8086指令系统 一、数据传送指令 二、算术运算指令 三、逻辑运算、移位、循环指令 四、串操作指令 无、控制转移指令 六、处理器控制指令 七、指令的执行时间和软件延时 第三章小结,重 点,8086的寻址方式 8086指令系统,3-1 8086 的寻址方式,计算机的指令包含操作码和操作数,操作码指明指令的操作性质,操作数指明操作的对象。 例: MOV AX,BX 操作码 操作数 寻址方式就是指令中确定操作数的方法,操作码在 3-3 中介绍。,指令通常涉及执行前与执行后的数据,执行前的称为源操作数,执行后的结果称为目的操作数。 MOV AX,BX 源操作数 目的操作数 指令有单操作数、双操作数以及隐含操作数之分。单操作数的源和目的相同;双操作数用“,”分隔,左边为目的,右边为源;隐含操作数不在指令码中指明,而是预先规定死的。,从数学角度来说,操作数分为常数与变量两类。常数是指程序运行过程中数值保持不变的数,变量是指程序运行中数值可以改变的量。 计算机中能够存放操作数的有寄存器和存储器,而存储器又分为程序与数据两种。 寄存器中的内容可在程序运行中改变。 数据RAM单元的值在程序运行中可以改变的。 程序通常存放在ROM中,存放在代码段,由CS管理,运行中不会改变。,数据传送指令 MOV 目的,源 操作: 将源操作数的值复制到目的操作数中,原操作数保持不变,一、立即数寻址,立即数是直接包含在指令中的8位或16位的常数,程序编译完成后,其值在运行过程中不变,是软件处理常数的最广泛的方法。 立即数是指令码的一部分,紧跟在操作码之后存放在代码段。执行时,EU从指令队列中获得该操作数。 若是16位数据,则低字节存放在低地址单元中,高字节存放在高地址单元中。 立即数只能做源操作数,不能做目的。 以AF打头的立即数,前面加0,以与其它字符区别开来。,外部总线,内部暂存器,IP,ES,SS,DS,CS,输入/输出控制电路,执行部分控制电路,1 2 3 4 5 6,ALU,标志寄存器,AH AL,BH BL,CH CL,DH DL,SP,BP,SI,DI,通用 寄存 器,地址加法器,指令队列缓冲器,执行部件 (EU),总线接口部件 (BIU),16位,20位,16位,8位,例: MOV AL,80H MOV AH,0ABH MOV AX,1234H,寄存器与立即数两种寻址方式不需要计算存储单元地址,执行速度最快。,二、寄存器寻址,以寄存器的内容作为操作数。 16位寄存器:AX,BX,CX,DX,SI,DI,BP,SP。 8位寄存器:AH,AL,BH,BL,CH,CL,DH,DL。 寄存器既能做源操作数,又能做目的。,例: MOV AL,AH ;AL AH MOV DX,1234H ;DX = 1234H,存储器操作数的寻址,对于存放在数据存储器中的操作数,要确定其物理地址,然后由BIU从指定的单元中读取操作数的值,送到EU中运算,执行速度较慢。 要计算物理地址,需要确定其逻辑地址。段基址通常是默认(隐含的、缺省的、预先规定)的,也可以是指令中指定的。 在IBM PC机中,偏移地址被称为有效地址EA。不同的存储器寻址方式之间的区别在于确定有效地址的方法不同。 注意概念:物理地址、逻辑地址、段基址、段内偏移地址、有效地址,外部总线,内部暂存器,IP,ES,SS,DS,CS,输入/输出控制电路,执行部分控制电路,1 2 3 4 5 6,ALU,标志寄存器,AH AL,BH BL,CH CL,DH DL,SP,BP,SI,DI,通用 寄存 器,地址加法器,指令队列缓冲器,执行部件 (EU),总线接口部件 (BIU),16位,20位,16位,8位,三、直接寻址方式,在指令中以常数形式直接给出操作数的16位有效地址EA,EA作为指令码的一部分,紧跟操作码存放在代码段中。EA要用 括起来,以与立即数区分。 有效地址EA的存储顺序与16位立即数相同,低字节存放在低地址单元中,高字节存放在高地址单元中 指令执行时,BIU从指令队列中获得EA。 段基址的默认值是DS。,例: 设 DS=5000H MOV AX,4321H,AL,AH,操作数物理地址:PA = DS 16 + EA = 54321H 操作数为字数据,PA对应低字节所在单元,该单元内容AL, (PA+1)对应高字节单元,该单元内容AH, 结果:AX = 9078H,段超越,如果直接寻址的数据不在DS段中,则要在指令中使用段超越前缀指明段的名称。 例如对附加段的寻址,在有效地址前用“ES: ”标明。“:”是属性修改运算符,表示计算物理地址时,不再使用缺省的DS,而改用ES。,例: MOV AL,ES:3024H PA= ES 16 + 3024H,符号地址,在汇编语言中,可以事先把一个存储单元的有效地址定义为一个符号,在程序中使用符号地址而不直接使用数值地址。 定义字节数据用DB,定义字数据用DW。,例: ARRAY1 DW 0506H MOV AX,ARRAY1 ;AX=0506H,对符号地址,可以不加 ,等价于直接寻址。 MOV AX,ARRAY1 = MOV AX,ARRAY1,四、寄存器间接寻址,以某个16位寄存器的内容作为存储器操作数的有效地址。 可用于间接寻址的寄存器只能是两个基址寄存器BX、BP ,以及两个变址寄存器SI、DI。 间接寻址的寄存器要用 括起来,以与寄存器寻址方式区别。 有“取有效地址”的含义。 默认的段基址,BP SS,BX、SI、DI DS 也可以使用段超越前缀指定非缺省的段基址。,例:设 AX=0102H,BX=2346H, DS=1000H,ES=2000H MOV AX,BX ,由地址加法器生成源操作数物理: PA = DS 16 + EA = 10000H + 2346H = 12346H 取物理地址为12346H的字数据送AX中,即取(12346H)单元的内容送AL中,(12347H)单元的内容送到AH中。 AX=3344H,1、以BX寄存器进行间接寻址 数据段基址寻址 例: 若 DS = 2000 H,ES = 3000 H,BX = 1000 H 1)MOV AX,BX AX (21000 H) (21001 H) AX = 5 B 4 0 H MOV CX,ES:BX AX (31000 H) (31001 H),2、以BP寄存器进行间接寻址堆栈段基址寻址 MOV AX,BP 若 SS = 5000 H,BP = 3020 H, 将 53020 H、53021 H 单元的内容送 AX。 执行结果: AX = 4A56 H,3、以SI、DI寄存器进行间接寻址变址寻址 1) MOV AX,ES : SI 若 ES = 3000 H,SI = 4000 H, EA=4000H,物理地址=34000H, 执行结果: AX=201A H,2)MOV BX,DI 若 DS = 0FFF0 H,DI = 0200 H 执行结果:BX (?)(?),BX = 3220 H,PA=DS x 10H + DI =0FFF00H + 0200H =100100H,最高位(D20)的 “1” 自然丢失,实际物理地址为PA=00100H,五、寄存器相对寻址,操作数的有效地址是一个基址或变址寄存器的内容与一个8位或16位位移量的和。 默认的段基址由寄存器决定,BP SS,BX、SI、DI DS 也可以使用段超越前缀指定非缺省的段基址。,例: MOV AX,BX + 12H MOV AL,COUNT BP MOV BX,ES: ARRAYDI,寄存器相对寻址的物理地址形成分两步进行。 第一步计算有效地址EA,这一步在执行部件EU中完成,需要注意的是,EA的计算是16位数据运算,通过16位内部总线传送,超过16位的数据会自然丢失。 第二步是根据EA和段基址计算物理地址,这一步在地址加法器中完成。,例:设DS=2000H,BX=0AB00H,ARRAY=0F000H,MOV AL,BX+12H EA = BX + 12H = 0AB00H + 12H = 0AB12H PA = DS 10H + EA = 20000H +0AB12H = 2AB12H,MOV AL,ARRAYBX EA = BX + ARRAY = 0AB00H + 0F000H = 1 9B00H产生进位,而EA只能取低16位,故EA=9B00H PA=DS 10H + EA = 20000H + 9B00H = 29B00H,六、基址变址寻址,操作数的有效地址是一个基址寄存器(BX,BP)与一个变址寄存器(SI,DI)的内容之和。 默认的段由基址寄存器决定,BP SS,BX DS,也可以使用段超越前缀指定非缺省的段基址。 注意计算EA时的进位的自然丢失。,例: MOV AX,BX +SI ;EA = BX + SI,段=DS MOV AL, BP DI ;EA = BP + DI,段= SS MOV BX,ES: BX DI ;EA = BX + DI,段= ES,七、相对基址变址寻址,操作数的有效地址是一个基址寄存器(BX,BP)与一个变址寄存器(SI,DI)的内容之和,再加上一个8位或16位的位移量。 默认的段由基址寄存器决定,BP SS,BX DS,也可以使用段超越前缀指定非缺省的段基址。 注意计算EA时的进位的自然丢失。,例: MOV AX,BX +SI+12H ;EA = BX + SI + 12H,DS MOV AL, BUFBP DI ;EA = BP + DI + BUF,SS MOV BX,ES:ARYBX DI ;EA = BX + DI +ARY,ES,例:若 BX = 5000 H,SI =2000 H,DS =4000 H, SS = 1000 H,BP = 3100 H。 则:,MOV AX,BX+SI; EA=5000+2000=7000H AX 47001 H 47000 H AX = 2A32 H,MOV AX,BP + SI + 0020 H; EA=3100+2000+0020=5120H,例:设 BX = 0158 H,DI = 10A5 H,DS = 2100 H,位 移量 = 1B57 H,DS 作为操作数的段寄存器。 1)直接寻址: MOV AX,1B57 H 有效地址 = 1B57 H 物理地址 = 21000 H+1B57 H = 22B57 H 2)寄存器间接寻址: MOV AX,BX 有效地址 = 0158 H 物理地址 = 21000 H + 0158 H = 21158 H 3)BX寄存器相对间接寻址: MOV AX,BX+1B57H 有效地址 = 0158 H + 1B57 H = 1CAF H 物理地址 = 21000 H + 1CAF H = 22CAF H,4)变址寻址: MOV AX,DI 有效地址 = 105A H 物理地址 = 21000 H+105A H = 220A5 H 5)DI寄存器相对变址寻址: MOV AX,DI+1B57H 有效地址 = 105A H + 1B57 H = 2BFC H 物理地址 = 21000 H + 2BFC H = 23BFC H 6)基址加变址的寻址 : MOV AX,BX + DI 有效地址 = 0158 H+105A H = 11FD H 物理地址 = 21000 H + 11FD H = 221FD H,7)相对的基址加变址的寻址: MOV AX,BX + DI+1B57 H 有效地址 = 0158 H+105A H + 1B57 H = 2D54 H 物理地址 = 21000 H + 2D54 H = 23D54 H,寄存器寻址: 指令中给出寄存器,操作数是该寄存器的内容,直接寻址: 指令中以常数形式直接给出操作数的有效地址,寄存器间接寻址: 指令中给出寄存器,该寄存器值作为存储单元的有效地址,操作数是该存储单元的内容。,寄存器相对寻址: 指令中给出寄存器以及相对位移量,以该寄存器值于位移量的和作为存储单元的有效地址,操作数是该存储单元的内容。,基址加变址寻址 指令中给出基址寄存器以及变址寄存器,以两个寄存器值的和作为存储单元的有效地址,操作数是该存储单元的内容。,相对的基址加变址 指令中给出基址寄存器、变址寄存器以及相对位移量,以三者的和作为存储单元的有效地址,操作数是该存储单元的内容。,八、其它,1、隐含寻址 指令中不显性指明操作数,此类指令的操作数是预先规定的,称为隐含寻址方式。,例: MOV AX,BX +SI+12H ;EA = BX + SI + 12H,DS 源操作数: 相对基址变址寻址方式 目的操作数:寄存器寻址方式,例: STC ;CF 1 DAA ;对AL中数据进行十进制加法调整,2、每个操作数都有对应的寻址方式,双操作数的指令就可能有两种寻址方式,思考题,已知: DS=22A7H,SS=0FE20H,ES=0BBA2H,CS=3400H,BX = 2013H,BP =4215H,SI = 312EH,DI = D055H, 试写出下面每条指令中存储器操作数的物理地址。 1、 MOV BX,4800H 2、 ADD SS:BX+DI+7650H,AL 3、 SUB BP+SI+3,CX 4、 XCHG AX,DI+5,3-2 指令的机器码表示方法,一、机器语言指令的编码目的和特点,1、机器语言指令 CPU只能识别和执行二进制机器码指令。 2、机器语言指令的编码特点 一般通过查表即可找到对应的机器码; 指令机器码有单字节、双字节、多字节之分,8086 CPU最长指令有 6 字节。,二、 机器语言指令代码的编制,8086 的指令为 1 6字节,分为“操作码域”和“操作数域”两个部分; 1、操作码域: 一般用指令的第一个字节或者头两个字节表示指令的操作码和寻址方式操作码域。 2、操作数域: 操作码域后面所跟的字节一般统称为操作数域,单字节指令(隐含的操作数) 单字节指令(寄存器模式) 寄存器到寄存器 不带位移量的寄存器和内存之间的传送 带位移量的寄存器和内存之间的传送(设位移量为 16 位) 立即数送寄存器(设立即数为 16 位) 立即数送内存(设带 16 位位移量) 图 3 - 3 8086 指令格式举例,操作码,操作码 REG,操作码,操作码,操作码,操作码,操作码,11 REG R/M,MOD REG R/M,MOD REG R/M,11 REG R/M,MOD 操作码 R/M,位移量低位,位移量高位,位移量高位,位移量低位,数据低位,数据高位,数据高位,数据低位,REG寄存器 MOD模式 R/M寄存器或内存,操作码:指出执行这条指令时,CPU 要做什么操作。 (OP)一般用指令的一个字节表示,有时 由于用 8 位还不够,常在指令的第二个字节 中还可占有 3 位操作码。 指令的第一字节: w d 立即方式寻址时,操作码中用 S 位表示符号扩展 s=1,将 8 位立即数扩展成 16 位数时,OP d/s w,w=1,对字进行操作 w=0,对字节进行操作,d=1,寄存器作为目的操作数 d=0,寄存器作为源操作数,2、操作数域:操作码域后面所跟的字节一般统 称为操作数域。 2 字节的有效地址(直接寻址); 1 字节或者 2 字节的位移量; 1 字节或者 2 字节的立即数; 1 字节或者 2 字节的位移量,后面再跟 1 字节或者 2 字节 的立即数; 2 字节的位移量和 2 字节的段地址(只对段间 接转移而言)。,单操作数指令 双操作数指令,指令:,例:指令编码,MOV BX+2100H,0FA50H,操作码 两字节,位移量低字节,位移量高字节,立即数低字节,立即数高字节,指令地址,指令在存储器中的地址,是指该指令第一个字节所在存储单元的地址; 其段基址由CS确定,段内偏移地址由IP决定 每执行完一条指令后,IP的值指向下一条指令的首地址。IP的值不是连续变化的,每次变化按照一条指令的字节数变化; CS : IP的改变是通过专门的指令跳转类指令来实现。,3-3 8086指令系统,数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令,一、数据传送指令,MOV XCHG XLAT PUSH POP LEA LDS LES PUSHF POPF LAHF SAHF IN OUT,数据传送实际上是复制操作,因此源操作数保持不变。 除SAHF和POPF两条指令外,其它传送指令都不影响标志寄存器的标志位。,1.通用型 (1)MOV传送指令 格式:MOV dst,src ; dst src,源和目的数据长度相等。 至少有一个操作数能指定是字节数据还是字数据 立即数只能做源操作数,不能做目的。 立即数不能直接传送到段寄存器,不能在两个段寄存器,或者两个存储单元之间直接传送。 CS与IP不能作为传送目的操作数,CS、IP的修改要通过跳转类指令实现。,MOV 指令传送途径,例: MOV DS, AX ;DS AX MOV CH, 20 ;CH 20 MOV BL, AH ;BLAH MOV AX, BX ;AXBX MOV DX, AX ;DXAX MOV AX, BX+0060H,例,(2) 、交换指令 格式: XCHG dst,src 功能: 把 dst 与 src 的内容互换,即执行后的src等于执行前dst的内容,而执行后dst等于执行前src的内容。,XCHG AX,BX XCHG AL,BH XCHG BX,1000H XCHG 2100H,DH XCHG SI,AX 注意: 1、dst与 src不能同时为内存单元; 2、不能使用立即数、CS、IP作为操作数。,(3)堆栈操作指令 PUSH src ;把src推入堆栈 POP dst ;从堆栈弹出到dst,堆栈是存储器中的一个连续区域,用于存放中断和子程序的返回地址,以及运算过程的中间结果。 堆栈的存储单元的逻辑地址常用 SS : SP 表示,SP称为堆栈指针,其值是最后一个入栈的字数据所在单元的有效地址,专业术语叫做“指向栈顶”,常通过入栈指令PUSH和出栈指令POP来访问。 PUSH和POP都是字操作指令,故 src 和 dst 都是16位数据,不能进行8位数据入栈和出栈。 指令中的SS和SP都是隐含寻址方式。,堆栈指令的操作数 src 或 dst 只能是寄存器或存储器,不能是立即数。 不能把CS和IP作为POP的操作数,但可以作为PUSH的源。 先进后出的操作原则。原因:只有一个出口。多个数据入栈、出栈操作时,为恢复原来数据,出栈顺序必须与入栈顺序相反。,PUSH指令的执行过程: 第一步 修改指针:SP SP 2 第二步 数据入栈:把 src 拷贝到逻辑地址为 SS : SP 的字存储单元中。,POP指令的执行过程: 第一步 数据出栈:把 逻辑地址为 SS : SP 的字存储单元中的数据拷贝到 dst 中。 第二步 修改指针:SP SP + 2,PUSH、POP指令执行前后,SS寄存器的值没有改变,只改变堆栈指针SP的值,SP的范围0000H0FFFFH,大小为64kB空间。 堆栈溢出: (1)当SP=0000H,再次执行PUSH指令,进行入栈操作,则SP=? (2)当SP=0FFFEH,再次执行POP指令,进行出栈操作,则SP=?,例:设SS=0100 H, SP=0008H,AX=12C3H, BX = 5070 H PUSH AX ;(1) SP SP-2;SP=0006 (2) (01007H)(01006H) AX,POP AX ;(1)将栈顶两单元内容送AX ;(2)SP SP+2,例 设 SS=2000H,SP=0100H,AX=1234H,BX=5678H,执行以下指令序列,画出堆栈变化过程,写出结果 PUSH AX PUSH BX POP AX POP CX,结果: AX=5678H BX=5678H CX=1234H,(4)换码指令(查表指令) 格式: XLAT (无参数) ;ALBX+AL 以BX与AL的和作为有效地址确定数据段中的某个单元,再把该单元的内容送入AL中。用来实现查表,要求:BX 寄存器指向表的首地址,AL中为位移量。,十进制数 g f e d c b a 0 0 1 0 0 0 0 0 0 40H 1 0 1 1 1 1 0 0 1 79H 2 0 0 1 0 0 1 0 0 24H 3 0 0 1 1 0 0 0 0 30H,十进制数字09转换成七段显示码的译码表, 现在要取 3 的对应的七段译码。 MOV AL,3 MOV BX,2000H XLAT 执行XLAT指令后: AL=30H,40 79 24 30 19 12 02 78 00 10,2、目标地址传送指令 (1)取有效地址 LEA reg16 , men 功能 : 取存储器源操作数mem的有效地址(而不是单元内容)送16位寄存器,源操作数必须是存储器数据。 目标寄存器只能用16位,不能用8位,不用段寄存器。 对于存储器数据,有四个属性:数据值(内容)、有效地址、段基址、数据长度。 MOV 指令操作的是存储单元的内容(数据值),而 LEA 操作的是存储单元的有效地址。,MOV AX,1000H ;AX=1122H,LEA AX,1000H ;AX=1000H,LEA SP, 0500H ;SP=0500H,LEA BX,BP+SI ;BX=BP+SI,例:,(2)将地址指针送DS和另一寄存器: LDS reg16,men32 前2个字节送寄存器,后2个字节送DS 。 LES reg16,mem32 前2个字节送寄存器后,2个字节送ES。,要传送的源操作数是指定存储器的32位数据,即连续4个存储单元的内容。 目标操作数包含一个段寄存器(DS或ES,隐含寻址),以及一个16位寄存器(寄存器寻址)。 在8086系统中,逻辑地址占用4个字节,该指令可一次把双字指针送段寄存器与指针寄存器中。,LDS DI,2100H,2100H 2101H 2102H 2103H 2104H,1C H 20 H 21 H B5 H,DI=201CH,DS=B521H,D7 D6 D5 D4 D3 D2 D1 D0,3、标志传送 1)、取标志:LAHF ;将标志送AH 置标志:SAHF ;将AH送标志寄存器,AH,(2) PUSHF:把标志推入堆栈。 SP SP-2,FLAGH入栈 (3) POPF :把标志弹出堆栈。 FLAG (SP+1,SP) SP SP+2,最小模式下的总线写操作,传送指令的总线操作,两个寄存器之间传送数据时,或者立即数送寄存器,在EU中即可完成,不涉及总线操作。,D7D0,D15D8,A0,奇存储体,偶存储体,例1:MOV AX,2000H,(3)偶地址:故 A0 =0;,例2:MOV AX,2001H,传送指令的总线操作分析,MOV 2000H,AX MOV 2001H,AX MOV AH,2001H MOV AL,2001H MOV 2010H,5678H;写出该指令执行时T1、T2、T3、T4各个状态的外部总线AD0AD15,A16/S3A19/S6,BHE/S7,RD、WR、M/IO引脚内容的值,2)、间接寻址 IN AL,DX OUT DX,AL IN AX,DX OUT DX,AX 寻址空间为:0000H FFFFH,4、输入输出指令 1)、直接寻址 IN AL,n OUT n,AL IN AX,N OUT N,AX 寻址空间为:0 255 字节,I/O端口是I/O接口电路中的寄存器,只能用输入指令 IN 以及输出指令 OUT 来访问。 I/O端口只用低16位地址线,寻址范围64KB空间。 I/O端口按字节分配,字端口是地址连续的两个字节端口,低地址存放低字节,高地址存放高字节。 只能用累加器作为执行输入/输出过程的机构,字节端口用AL,字端口用AX。 用直接输入/输出指令时,寻址范围为 0 255,因为直接寻址指令中分配给端口号的操作数域为一个字节。注意间接寻址只能用DX,并且不加 。,例,IN AL, 20H ;读字节端口 IN AX, 30H ;读字端口 OUT 46H,AL ;写字节端口 OUT 80H,AX ;写字端口 MOV DX,1000H IN AL,DX IN AX,DX OUT DX,AL,二、算术运算指令,二进制加法:ADD、ADC、INC 二进制减法:SUB、SBB、DEC、DAS 二进制乘法:MUL、IMUL、AAM 二进制除法:DIV、IDIV、AAM 调整类:AAA、DAA、DAS、AAM、AAD,计算机中的数据表示方法,对于真值“69”,可用不同的方法表示 二进制数 ( 十六进制数)表示: “69” =0100 0101 B = 45H 压缩BCD数表示: “69” = 0110 1001 B = 6 9H 非压缩BCD数表示: “69” = 0000 0110 0000 1001B = 06 09H ASCII码表示: “69” = 0011 0110 0011 1001 B = 36 39H,计算机中的数据运算表示方法,“69 + 46 = 115”, 二进制数 ( 十六进制数)表示: 被加数的二进制表示: “69” = 0100 0101 B = 45H 加数的二进制表示: “46” = 0010 1110 B = 2EH 和数的二进制表示: “115”= 0111 0011 B = 73H 则二进制算式为: 45H 二进制加 2EH =73H,计算机中的数据运算表示方法,“69 + 46 = 115”,BCD数表示: 被加数的BCD表示: “69” = 0110 1001 B = 69H 加数的BCD表示: “46” = 0100 0110 B = 46H 和数的BCD表示: “115”= 0001 0001 0101 B = 115H 则二进制算式为: 69H BCD加 46H =115H,计算机中的数据运算表示方法,“69 + 46 = 115”,非压缩BCD数表示: 被加数的非压缩BCD表示: “69” = 0000 0110 0000 1001 B = 06 09H 加数的非压缩BCD表示: “46” = 0000 0100 000 0110 B = 04 06H 和数的非压缩BCD表示: “115”= 0000 0001 0000 0001 000 0101 B = 010105H 则二进制算式为: 06 09H 非压缩BCD加 0406H =01 01 05H,1、二进制加法指令,1)不带进位位的加法 格式: ADD DST,SRC 功能: DST DST+SRC,例:(1) . ADD AL,50H ; AL AL+50H (2). ADD CX,1000H ;CX CX+1000H (3). ADD DI, SI ;DI DI+SI,例: (4). ADD BX+DI,AX 若执行前: BX=1000H, DI=2000H, AX=1234H,DS=4000H 则执行中: EA=BX+DI=3000H PA=DS x 16 +EA=13000H 和数为:1234+ 4025H =5259H 执行后: (43000H) 5259H 思考题: 执行过程中,控制总线与数据总线的数值如何变化?,2).带进位位的加法 格式:ADC DST,SRC DST DST+SRC+CF 例: ADC AX,SI ; AX AX+SI+CF ADC DX,SI DX DX+SI+CF ADC BX,3000H BX BX+3000H+CF ADC AL,5 AL AL+5+CF,例:有两个4字节无符号数放在2000H和3000H单元中,低位在前,高位在后,将两个数相加,结果放2000H开始的单元中。 10008432H+20007F00H = ? 1).算法分析: (1)可以将两个4字节无符号数相加 看成2个字相加; (2) 两个数的低位字相加后,将可能 产生进位CF; (3)高位字相加,应再加上低位运算的进位位;,2).程序: MOV DI, 2000H ;取第一个字的首地址 MOV SI, 3000H ;取第二个数的首地址 MOV AX, SI ;第一个数的低字 ADD DI , AX ;第一个数和第二个数 ;的低字相加 MOV AX, SI+2 ; 第二个数的高字送AX ADC DI+2, AX ;高16位数据相加,并 ;加上低16位的进位位,3).增量指令 格式:INC src ; src src+1 将操作数内容加一,再回送操作数。 INC AX ;AX AX+1 INC BL ;BL BL+1 INC BYTE PTRBX+DI+500 注意:INC指令影响标志AF、OF、PF、SF、ZF, 但不影响进位标志CF。,4).加法的十进制调整,二进制加法与压缩十进制数加法的区别,1 2 3 H,加法的十进制调整指令,格式:DAA ; 功能: 把AL中两个压缩BCD数按二进制加法运算得到的和调整为压缩BCD数,再回送AL。,加法十进制调整过程,说明: 隐含寻址方式,源和目的操作数都是AL以及标志位AF、CF。 DAA 紧跟在 ADD/ADC 之后,与 ADD/ADC 一起实现两位十进制数(BCD码)加法。 执行 ADD/ADC 指令的两个操作数必须为压缩BCD数,且相加的结果必须存放在AL中。,例:求 BCD数BL 与 DL的和,结果送到BL中,MOV AL , BL ;取第一个加数 ADD AL , DL ;与第二个数进行二进制加 DAA ;加法的十进制调整 MOV BL , AL ;回送结果,假设执行前BL=38H,DL=76H,则执行结果: AL=? BL=? DL=? AF=? CF=?,假设执行前BL=3AH,DL=76H,则执行结果: AL=? BL=? DL=? AF=? CF=?,例:多字节十进制数加法,例:有两个4字节BCD数放在2000H和3000H单元中,低位在前,高位在后,将两个数相加,结果放2000H开始的单元中。,2).程序: MOV BX,0000H ;第1个字节 MOV AL,BX+2000H ADD AL,BX+3000H DAA MOV BX+2000H,AL INC BX ;第2个字节 MOV AL,BX+2000H ADC AL,BX+3000H DAA MOV BX+2000H,AL,2).程序: INC BX ;第3个字节 MOV AL,BX+2000H ADD AL,BX+3000H DAA MOV BX+2000H,AL INC BX ;第4个字节 MOV AL,BX+2000H ADD AL,BX+3000H DAA MOV BX+2000H,AL,5).加法的ASCII调整,格式:AAA ; 功能:在用ADD/ADC指令对两个非压缩BCD数或ASCII码表示的十进制数按二进制相加,并把和值存放在AL的条件下,用此指令将AL中的结果调整为1位非压缩BCD数,其进位位累加到AH中。,二进制加法与非压缩BCD吗加法的区别,0 1 0 3 H,AAA调整过程,说明: 隐含寻址方式,源操作数都是AL以及标志位AF、CF,目的操作数为AL、AH以及标志位AF、CF。 AAA 紧跟在 ADD/ADC 之后,与 ADD/ADC 一起实现一位非压缩十进制数加法。 执行 ADD/ADC 指令的两个操作数必须为非压缩压缩BCD数或ASCII码,且相加的结果必须存放在AL中。,例:ASCII十进制数加法,2、减法指令,(1)不带借位的减法 格式:SUB DST,SRC DST DST-SRC 例: SUB BX,CX ;BXBX-CX SUB BP+2,CL ;BP+2 BP+2-CL SUB AL,20 ;AL AL-20 SUB SI,5010H ;SI SI-5010H SUB WORD PTR DI,1000H ;DI+1DI DI+1DI-1000H,(2)带借位的减法 格式: SBB DST,SRC DST DST SRCCF 例: SBB AX,2030H;执行:AX AX 2030H CF SBB WORD PTR DI+2,1000H; SBB DX, BX+20H (3)减量指令 将操作数内容减一,再回送操作数。 格式: DEC DST;DST DST 1 例: DEC AX ;AX-1,结果送AX DEC BL ;BL BL-1 DEC BYTE PTR DI+2 ;将DI+2所指向的一个字节的内存单元加一,4)、求补指令 格式: NEG DST 对DST求补,0 -DST 例: NEG AL ;对AL中的数求补,结果送AL NEG CX ;对CX中的数求补,结果送CX,5)、比较指令 格式: CMP DST,SRC; DST - SRC 注意:CMP指令执行相减,但不回送结果,两个操作数的值都保持不变,结果只影响标志位CF、OF、SF、ZF。,大小的比较方法 无符号数的比较:用借位标志 CF 判断 若ZF=1 被减数=减数; 否则:CF=1 被减数减数,带符号数大小比较,带符号数的最高位为符号位,减法运算借位标志CF反映的是符号位的借位状态,不能真正反映数值的大小,所以不能用CF来判断,需要用差值的符号来判断。 差为正(含等于0)时被减数减数,差值为负被减数减数。 在不发生溢出情况 OF=0下 ,此时差是正确的,则SF=1被减数减数,SF=0 被减数减数。 在发生溢出情况 OF=1下 ,此时差是错误的,则SF=0被减数减数,SF=1 被减数减数。 综上所述:OFSF=1被减数减数, OFSF=0被减数减数,6).减法的十进制调整,格式:DAS ; 功能:把AL中两个压缩BCD数按二进制减法运算得到的差调整为压缩BCD数,再回送AL。,二进制减法与压缩十进制数减法的区别,4 5 H,减法十进制调整过程,说明: 隐含寻址方式,源和目的操作数都是AL以及标志位AF、CF。 DAS 紧跟在 SUB/SBB 之后,实现两位十进制数(BCD码)减法。 执行 SUB/SBB 指令的两个操作数必须为压缩BCD数,且相加的结果必须存放在AL中。,例:多字节十进制数减法,7).减法的ASCII调整,格式:AAS ; 功能:在用SUB/SBB指令对两个非压缩BCD数或ASCII码表示的十进制数按二进制相减,并把差值存放在AL的条件下,用此指令将AL中的结果调整为1位非压缩BCD数,其借位位累计到AH中。,二进制加法与非压缩BCD减法的区别,0 5 H,AAS调整过程,说明: 隐含寻址方式,源操作数都是AL以及标志位AF、CF,目的操作数为AL、AH以及标志位AF、CF。 AAS 紧跟在 SUB/SBB之后,实现一位非压缩十进制数加法。 执行 SUB/SBB 指令的两个操作数必须为非压缩压缩BCD数或ASCII码,且相加的结果必须存放在AL中。,例:ASCII十进制数减法,3、乘法指令, 二进制乘法特点: 两个8位数相乘,结果为16位数。 两个16位数相乘,结果为32位数。 8086乘法指令特点: 一个乘数总是放在AL(8位)或AX (16位)中; 将DX看成是AX的扩展,乘法指令分:无符号数MUL 有符号数IMUL,例:3 (-2)= 6 3 14 = 42(2AH) 3的补码:0011,-2的补码 :1110 14的补码:1110 1)直接相乘:对无符号数,结果正确。 0011(3) 1110(-2或14) 0010 1010(2A),2)有符号相乘:负数复原为原码,并去掉符号位,相乘后,结果添上符号位,再取补码。 0011(3) 0010(2) 0000 0110(6) 结果添上负号,1 000 0110, 再取补码:1111 1001+1=1111 1010=FAH= -6 3 (-2)= - 6,结果正确 对于3 14,结果错误。,(1)、无符号数乘法 格式: MUL src ;AX ALsrc,字节 ;DX,AX AX src,字,MUL BL ;AX AL BL MUL CX ;DX、AX AX CX MUL BYTE PTR DI;AL与DI所指单元的8位 数相乘,结果送AX MUL WORD PTR SI;AX与SI所指单元的16位 数相乘,结果低位送AX, 高位送DX,例1,4902H403AH,结果送0510H0513H单元。 MOV AX,4902H MOV BX,403AH MUL BX MOV 0510H,AX MOV 0512H,DX,例2,(2)、带符号数的乘法 格式 :IMUL src 字节乘: AX AL*src, 字乘 : DX,AX AX*src,字乘 例:IMUL BL;AL的内容乘以BL的内容,结果送AX IMUL DI ;AX的内容乘以DI的内容,结果送DX.AX IMUL BYTE PTR DI; AL的内容乘以DI所指单元的内容,结果送AX,3).乘法的ASCII调整,格式:AAM ; 功能:对存在AL中的两个非压缩BCD数相乘的乘积进行非压缩BCD调整,得到两位非压缩BCD数,存放在AX中,AL存放低位,AH存放高位。,说明: 把两个ASCII码相乘前,须清除高半字节,乘积不超过 8 1。 调整过程:ALAL/10的余数, AHAL/10的商 影响ZF、SF、PF,但AF、OF、CF无定义。,4、除法指令,(1)、无符号数除法 格式: DIV src: 字节除: AXsrc, AL 商, AH 余数 字 除: (DX. AX) src, AX 商, DX 余数 注意:被除数在累加器中,且必须是除数的两 倍字长。,8位除法: 被除数(16位) 除数(8位) 余数(8位) 商(8位),AH AL,操作数,AH AL,DX AX,操作数,DX AX,16位除法:,被除数(32) 除数(16) 余数(16) 商(16),DIV CL ;AL AX/CL DIV WORD PTR DI 若 DI=1000H,DX=2000H,AX=3500H 1000H单元的值为 1020H。 20003500H1020 H=? 商送AX,余数送DX。,1000H 1001H,20 10,例,(2)、有符号数除法 格式: IDIV src 字节除:AL AX src(商),AH 余数, 字除: AX (DX AX) src(商) DX 余数 例: IDIV BL ;AL(商) AX BL IDIV WORD PTR DI,注意:,除法运算时,标志AF、CF、OF、PF、SF、ZF、无意义 除法运算时,对双字除以一个字,商的范围为16位;对一个字除以一个字节,商的范围为8位。超出上述范围,产生0号中断,常称为除数为0的中断。 对有符号除法,8086指令系统规定余数的符号与被除 数的符号相同。 除法运算时,要求被除数的字长是除数的二倍。如果 除数的字长与除数的字长相同,应对被除数进行扩展。 无符号数扩展:对AH或DX清零。 有符号数扩展:将低位字或字节的符号向高位扩展。,(3)、扩展字节为字 CBW 将AL寄存器的符号位扩展到AH中。 AL=80H,执行CBW后,AH=FFH。 例:AL=88H,执行CBW,AH=FFH 1000 1000 11111111 1000 1000 AL AH AL,(4)、扩展字为双字 CWD 将AX寄存器的符号位扩展到DX中。 AX=8000H,执行CWD后,DX=FFFFH。,3).除法的ASCII调整,格式:AAD ; 功能:在作无符号除法之前,先用 AAD 把AX中的两位非压缩BCD数转换成二进制数,然后再用 DIV 进行除法运算。,说明: 调整过程:AL AH 10 + AL。 用于两位非压缩BCD数除以一位非压缩BCD数。 此指令用于 DIV 之前。 影响ZF、SF、PF。,例,1、AX=-30, CL=+8 DIV CL 执行的结果: AL(商) = -3 , AH(余数)= - 6,2、把BX中的二进制无符号数转换为非压缩BCD码,存放到数据段中2000H开始的单元中,低字节在前,高字节在后。,MOV SI,2000H MOV CX,10000 MOV AX,BX MOV DX,0000H DIV CX MOV SI,AL MOV CX,1000 MOV AX,DX MOV DX,0000H DIV CX MOV SI+1,AL,3、32位乘

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论