1、第三章 8086指令系统,3-1 8086 的寻址方式 3-2 指令的机器码表示方法 3-3 8086指令系统一、数据传送指令二、算术运算指令三、逻辑运算、移位、循环指令四、串操作指令无、控制转移指令六、处理器控制指令七、指令的执行时间和软件延时 第三章小结,重 点,8086的寻址方式 8086指令系统,3-1 8086 的寻址方式,计算机的指令包含操作码和操作数,操作码指明指令的操作性质,操作数指明操作的对象。 例: MOV AX,BX操作码 操作数 寻址方式就是指令中确定操作数的方法,操作码在 3-3 中介绍。,指令通常涉及执行前与执行后的数据,执行前的称为源操作数,执行后的结果称为目的操
2、作数。MOV AX,BX源操作数 目的操作数 指令有单操作数、双操作数以及隐含操作数之分。单操作数的源和目的相同;双操作数用“,”分隔,左边为目的,右边为源;隐含操作数不在指令码中指明,而是预先规定死的。,从数学角度来说,操作数分为常数与变量两类。常数是指程序运行过程中数值保持不变的数,变量是指程序运行中数值可以改变的量。 计算机中能够存放操作数的有寄存器和存储器,而存储器又分为程序与数据两种。 寄存器中的内容可在程序运行中改变。 数据RAM单元的值在程序运行中可以改变的。 程序通常存放在ROM中,存放在代码段,由CS管理,运行中不会改变。,数据传送指令MOV 目的,源 操作:将源操作数的值复
3、制到目的操作数中,原操作数保持不变,一、立即数寻址,立即数是直接包含在指令中的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
4、DL,SP,BP,SI,DI,通用 寄存 器,地址加法器,指令队列缓冲器,执行部件 (EU),总线接口部件 (BIU),16位,20位,16位,8位,例: MOV AL,80HMOV AH,0ABHMOV AX,1234H,寄存器与立即数两种寻址方式不需要计算存储单元地址,执行速度最快。,二、寄存器寻址,以寄存器的内容作为操作数。 16位寄存器:AX,BX,CX,DX,SI,DI,BP,SP。 8位寄存器:AH,AL,BH,BL,CH,CL,DH,DL。 寄存器既能做源操作数,又能做目的。,例:MOV AL,AH ;AL AHMOV DX,1234H ;DX = 1234H,存储器操作数的寻址
5、,对于存放在数据存储器中的操作数,要确定其物理地址,然后由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,S
6、I,DI,通用 寄存 器,地址加法器,指令队列缓冲器,执行部件 (EU),总线接口部件 (BIU),16位,20位,16位,8位,三、直接寻址方式,在指令中以常数形式直接给出操作数的16位有效地址EA,EA作为指令码的一部分,紧跟操作码存放在代码段中。EA要用 括起来,以与立即数区分。 有效地址EA的存储顺序与16位立即数相同,低字节存放在低地址单元中,高字节存放在高地址单元中 指令执行时,BIU从指令队列中获得EA。 段基址的默认值是DS。,例: 设 DS=5000HMOV AX,4321H,AL,AH,操作数物理地址:PA = DS 16 + EA = 54321H 操作数为字数据,PA对
7、应低字节所在单元,该单元内容AL, (PA+1)对应高字节单元,该单元内容AH, 结果:AX = 9078H,段超越,如果直接寻址的数据不在DS段中,则要在指令中使用段超越前缀指明段的名称。 例如对附加段的寻址,在有效地址前用“ES: ”标明。“:”是属性修改运算符,表示计算物理地址时,不再使用缺省的DS,而改用ES。,例:MOV AL,ES:3024H PA= ES 16 + 3024H,符号地址,在汇编语言中,可以事先把一个存储单元的有效地址定义为一个符号,在程序中使用符号地址而不直接使用数值地址。 定义字节数据用DB,定义字数据用DW。,例: ARRAY1 DW 0506HMOV AX,
8、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=2000HMOV AX,BX ,由地址加法器生成源操作数物理
9、: 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 H1)MOV AX,BXAX (21000 H) (21001 H)AX = 5 B 4 0 H MOV CX,ES:BXAX (31000 H) (31001 H),2、以BP寄存器进行间接寻址堆栈段基址寻址MOV AX,BP若 SS = 5000
10、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=00
11、100H,五、寄存器相对寻址,操作数的有效地址是一个基址或变址寄存器的内容与一个8位或16位位移量的和。 默认的段基址由寄存器决定,BP SS,BX、SI、DI DS 也可以使用段超越前缀指定非缺省的段基址。,例:MOV AX,BX + 12HMOV AL,COUNT BPMOV BX,ES: ARRAYDI,寄存器相对寻址的物理地址形成分两步进行。 第一步计算有效地址EA,这一步在执行部件EU中完成,需要注意的是,EA的计算是16位数据运算,通过16位内部总线传送,超过16位的数据会自然丢失。 第二步是根据EA和段基址计算物理地址,这一步在地址加法器中完成。,例:设DS=2000H,BX=0
12、AB00H,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)的内容之和。 默认的段由基址
13、寄存器决定,BP SS,BX DS,也可以使用段超越前缀指定非缺省的段基址。 注意计算EA时的进位的自然丢失。,例:MOV AX,BX +SI ;EA = BX + SI,段=DSMOV AL, BP DI ;EA = BP + DI,段= SSMOV BX,ES: BX DI ;EA = BX + DI,段= ES,七、相对基址变址寻址,操作数的有效地址是一个基址寄存器(BX,BP)与一个变址寄存器(SI,DI)的内容之和,再加上一个8位或16位的位移量。 默认的段由基址寄存器决定,BP SS,BX DS,也可以使用段超越前缀指定非缺省的段基址。 注意计算EA时的进位的自然丢失。,例: MO
14、V 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=7000HAX 47001 H 47000 HAX = 2A32 H,MOV AX,BP + SI + 0020 H;EA=3100+2000+0020=5120H,例:设
15、 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)变址寻址:
16、 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 + 1B
17、57 H = 2D54 H物理地址 = 21000 H + 2D54 H = 23D54 H,寄存器寻址: 指令中给出寄存器,操作数是该寄存器的内容,直接寻址: 指令中以常数形式直接给出操作数的有效地址,寄存器间接寻址: 指令中给出寄存器,该寄存器值作为存储单元的有效地址,操作数是该存储单元的内容。,寄存器相对寻址: 指令中给出寄存器以及相对位移量,以该寄存器值于位移量的和作为存储单元的有效地址,操作数是该存储单元的内容。,基址加变址寻址 指令中给出基址寄存器以及变址寄存器,以两个寄存器值的和作为存储单元的有效地址,操作数是该存储单元的内容。,相对的基址加变址 指令中给出基址寄存器、变址寄存器
18、以及相对位移量,以三者的和作为存储单元的有效地址,操作数是该存储单元的内容。,八、其它,1、隐含寻址指令中不显性指明操作数,此类指令的操作数是预先规定的,称为隐含寻址方式。,例: MOV AX,BX +SI+12H ;EA = BX + SI + 12H,DS 源操作数: 相对基址变址寻址方式 目的操作数:寄存器寻址方式,例: STC ;CF 1DAA ;对AL中数据进行十进制加法调整,2、每个操作数都有对应的寻址方式,双操作数的指令就可能有两种寻址方式,思考题,已知: DS=22A7H,SS=0FE20H,ES=0BBA2H,CS=3400H,BX = 2013H,BP =4215H,SI
19、= 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
20、、操作码域: 一般用指令的第一个字节或者头两个字节表示指令的操作码和寻址方式操作码域。 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,位移量低
21、位,位移量高位,位移量高位,位移量低位,数据低位,数据高位,数据高位,数据低位,REG寄存器 MOD模式 R/M寄存器或内存,操作码:指出执行这条指令时,CPU 要做什么操作。(OP)一般用指令的一个字节表示,有时由于用 8 位还不够,常在指令的第二个字节中还可占有 3 位操作码。 指令的第一字节:wd立即方式寻址时,操作码中用 S 位表示符号扩展s=1,将 8 位立即数扩展成 16 位数时,OP d/s w,w=1,对字进行操作 w=0,对字节进行操作,d=1,寄存器作为目的操作数 d=0,寄存器作为源操作数,2、操作数域:操作码域后面所跟的字节一般统 称为操作数域。 2 字节的有效地址(直
22、接寻址); 1 字节或者 2 字节的位移量; 1 字节或者 2 字节的立即数; 1 字节或者 2 字节的位移量,后面再跟 1 字节或者 2 字节 的立即数; 2 字节的位移量和 2 字节的段地址(只对段间接转移而言)。,单操作数指令 双操作数指令,指令:,例:指令编码,MOV BX+2100H,0FA50H,操作码 两字节,位移量低字节,位移量高字节,立即数低字节,立即数高字节,指令地址,指令在存储器中的地址,是指该指令第一个字节所在存储单元的地址; 其段基址由CS确定,段内偏移地址由IP决定 每执行完一条指令后,IP的值指向下一条指令的首地址。IP的值不是连续变化的,每次变化按照一条指令的字
23、节数变化; 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,源和目的数据长度相等。 至少有一个操作数能指定是字节数据还是字
24、数据 立即数只能做源操作数,不能做目的。 立即数不能直接传送到段寄存器,不能在两个段寄存器,或者两个存储单元之间直接传送。 CS与IP不能作为传送目的操作数,CS、IP的修改要通过跳转类指令实现。,MOV 指令传送途径,例:MOV DS, AX ;DS AXMOV CH, 20 ;CH 20MOV BL, AH ;BLAHMOV AX, BX ;AXBXMOV DX, AX ;DXAXMOV AX, BX+0060H,例,(2) 、交换指令格式: XCHG dst,src 功能: 把 dst 与 src 的内容互换,即执行后的src等于执行前dst的内容,而执行后dst等于执行前src的内容。
25、,XCHG AX,BXXCHG AL,BHXCHG BX,1000HXCHG 2100H,DHXCHG SI,AX 注意: 1、dst与 src不能同时为内存单元;2、不能使用立即数、CS、IP作为操作数。,(3)堆栈操作指令PUSH src ;把src推入堆栈POP dst ;从堆栈弹出到dst,堆栈是存储器中的一个连续区域,用于存放中断和子程序的返回地址,以及运算过程的中间结果。 堆栈的存储单元的逻辑地址常用 SS : SP 表示,SP称为堆栈指针,其值是最后一个入栈的字数据所在单元的有效地址,专业术语叫做“指向栈顶”,常通过入栈指令PUSH和出栈指令POP来访问。 PUSH和POP都是字
26、操作指令,故 src 和 dst 都是16位数据,不能进行8位数据入栈和出栈。 指令中的SS和SP都是隐含寻址方式。,堆栈指令的操作数 src 或 dst 只能是寄存器或存储器,不能是立即数。 不能把CS和IP作为POP的操作数,但可以作为PUSH的源。 先进后出的操作原则。原因:只有一个出口。多个数据入栈、出栈操作时,为恢复原来数据,出栈顺序必须与入栈顺序相反。,PUSH指令的执行过程: 第一步 修改指针:SP SP 2 第二步 数据入栈:把 src 拷贝到逻辑地址为 SS : SP 的字存储单元中。,POP指令的执行过程: 第一步 数据出栈:把 逻辑地址为 SS : SP 的字存储单元中的
27、数据拷贝到 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 HPUSH AX ;(1) SP SP-2;SP=0006(2) (01007H)(01006H) AX,POP AX ;(1)将栈顶两单元内容送AX;(2
28、)SP SP+2,例 设 SS=2000H,SP=0100H,AX=1234H,BX=5678H,执行以下指令序列,画出堆栈变化过程,写出结果 PUSH AXPUSH BXPOP AXPOP 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 40H1 0 1 1 1 1 0 0 1 79H
29、2 0 0 1 0 0 1 0 0 24H3 0 0 1 1 0 0 0 0 30H,十进制数字09转换成七段显示码的译码表, 现在要取 3 的对应的七段译码。MOV AL,3MOV BX,2000HXLAT执行XLAT指令后:AL=30H,40 79 24 30 19 12 02 78 00 10,2、目标地址传送指令 (1)取有效地址 LEA reg16 , men 功能 : 取存储器源操作数mem的有效地址(而不是单元内容)送16位寄存器,源操作数必须是存储器数据。 目标寄存器只能用16位,不能用8位,不用段寄存器。 对于存储器数据,有四个属性:数据值(内容)、有效地址、段基址、数据长度
30、。 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位
31、寄存器(寄存器寻址)。 在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,最小模式下的总线写操作,传送
32、指令的总线操作,两个寄存器之间传送数据时,或者立即数送寄存器,在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,ALI
33、N AX,DX OUT DX,AX寻址空间为:0000H FFFFH,4、输入输出指令 1)、直接寻址IN AL,n OUT n,ALIN AX,N OUT N,AX寻址空间为:0 255 字节,I/O端口是I/O接口电路中的寄存器,只能用输入指令 IN 以及输出指令 OUT 来访问。 I/O端口只用低16位地址线,寻址范围64KB空间。 I/O端口按字节分配,字端口是地址连续的两个字节端口,低地址存放低字节,高地址存放高字节。 只能用累加器作为执行输入/输出过程的机构,字节端口用AL,字端口用AX。 用直接输入/输出指令时,寻址范围为 0 255,因为直接寻址指令中分配给端口号的操作数域为一
34、个字节。注意间接寻址只能用DX,并且不加 。,例,IN AL, 20H ;读字节端口IN AX, 30H ;读字端口OUT 46H,AL ;写字节端口OUT 80H,AX ;写字端口MOV DX,1000HIN AL,DX IN AX,DXOUT DX,AL,二、算术运算指令,二进制加法:ADD、ADC、INC 二进制减法:SUB、SBB、DEC、DAS 二进制乘法:MUL、IMUL、AAM 二进制除法:DIV、IDIV、AAM 调整类:AAA、DAA、DAS、AAM、AAD,计算机中的数据表示方法,对于真值“69”,可用不同的方法表示 二进制数 ( 十六进制数)表示:“69” =0100 0
35、101 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 则二进制算
36、式为: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
37、表示: “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,
38、AX 若执行前:BX=1000H, DI=2000H, AX=1234H,DS=4000H 则执行中: EA=BX+DI=3000HPA=DS x 16 +EA=13000H和数为:1234+ 4025H =5259H 执行后: (43000H) 5259H 思考题: 执行过程中,控制总线与数据总线的数值如何变化?,2).带进位位的加法格式:ADC DST,SRCDST DST+SRC+CF 例: ADC AX,SI ; AX AX+SI+CFADC DX,SIDX DX+SI+CF ADC BX,3000HBX BX+3000H+CFADC AL,5 AL AL+5+CF,例:有两个4字节无
39、符号数放在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
40、, AX ;高16位数据相加,并 ;加上低16位的进位位,3).增量指令格式:INC src ; src src+1将操作数内容加一,再回送操作数。INC AX ;AX AX+1INC BL ;BL BL+1INC BYTE PTRBX+DI+500注意:INC指令影响标志AF、OF、PF、SF、ZF,但不影响进位标志CF。,4).加法的十进制调整,二进制加法与压缩十进制数加法的区别,1 2 3 H,加法的十进制调整指令,格式:DAA ; 功能:把AL中两个压缩BCD数按二进制加法运算得到的和调整为压缩BCD数,再回送AL。,加法十进制调整过程,说明: 隐含寻址方式,源和目的操作数都是AL以及
41、标志位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=?
42、 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 IN
43、C 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
44、 一起实现一位非压缩十进制数加法。 执行 ADD/ADC 指令的两个操作数必须为非压缩压缩BCD数或ASCII码,且相加的结果必须存放在AL中。,例:ASCII十进制数加法,2、减法指令,(1)不带借位的减法格式:SUB DST,SRCDST DST-SRC 例: SUB BX,CX ;BXBX-CXSUB BP+2,CL ;BP+2 BP+2-CLSUB AL,20 ;AL AL-20SUB SI,5010H ;SI SI-5010HSUB WORD PTR DI,1000H;DI+1DI DI+1DI-1000H,(2)带借位的减法格式: SBB DST,SRCDST DST SRCCF
45、例: SBB AX,2030H;执行:AX AX 2030H CFSBB WORD PTR DI+2,1000H; SBB DX, BX+20H (3)减量指令 将操作数内容减一,再回送操作数。 格式: DEC DST;DST DST 1 例: DEC AX ;AX-1,结果送AX DEC BL ;BL BL-1DEC BYTE PTR DI+2;将DI+2所指向的一个字节的内存单元加一,4)、求补指令格式: NEG DST 对DST求补,0 -DST 例: NEG AL ;对AL中的数求补,结果送ALNEG CX ;对CX中的数求补,结果送CX,5)、比较指令格式: CMP DST,SRC;
46、 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中。,