微机原理及应用CH3 8086的寻址方式和指令系统课件.ppt

上传人:小飞机 文档编号:3048287 上传时间:2023-03-09 格式:PPT 页数:121 大小:526.50KB
返回 下载 相关 举报
微机原理及应用CH3 8086的寻址方式和指令系统课件.ppt_第1页
第1页 / 共121页
微机原理及应用CH3 8086的寻址方式和指令系统课件.ppt_第2页
第2页 / 共121页
微机原理及应用CH3 8086的寻址方式和指令系统课件.ppt_第3页
第3页 / 共121页
微机原理及应用CH3 8086的寻址方式和指令系统课件.ppt_第4页
第4页 / 共121页
微机原理及应用CH3 8086的寻址方式和指令系统课件.ppt_第5页
第5页 / 共121页
点击查看更多>>
资源描述

《微机原理及应用CH3 8086的寻址方式和指令系统课件.ppt》由会员分享,可在线阅读,更多相关《微机原理及应用CH3 8086的寻址方式和指令系统课件.ppt(121页珍藏版)》请在三一办公上搜索。

1、第3章 8086的寻址方式和指令系统,3.1 8086/8088的寻址方式3.2 8086/8088的指令系统,计算机中指令由操作码字段和操作数字段两部分组成,因此指令的一般格式如下:操作码 操作数操作码字段:指示计算机要执行的操作。操作数字段:指出在指令执行操作过程中所需要的 操作数。,3.1 8086/8088的寻址方式,3.1.1 与数据有关的寻址方式,立即数寻址寄存器寻址直接寻址寄存器间接寻址寄存器相对寻址 基址变址寻址相对基址变址寻址,定 义:操作数直接存放在指令中,作为指令的一部分存放在代码段里,这种操作数称为立即操作数,这种寻址方式就是立即数寻址方式。寻址方式如图3.1所示:图3

2、.1 立即数寻址,1立即数寻址,立即数可以是位或16位的。如果是16位立即数,则高8位放在高地址,低8位放在低地址。使用场合:立即数寻址方式经常用于给寄存器赋初值。它只能用于源操作数字段,不能用于目的操作数字段。CPU不需要另外占用总线周期去取操作数,故立即数寻址方式显著的特点就是速度快。,说明:,定义:操作数在指定的寄存器中,指令中指定寄存器号。寻址方式如图3.3所示:图3.3 寄存器寻址,2寄存器寻址,说明:对于16位操作数,可以用字寄存器,比如:、以及段寄存器 对于位操作数,可以用字节寄存器,比如:、这种寻址方式因为操作数在寄存器中,不需要访问存储器,所以运算速度较高。,定义:在指令中直

3、接给出位移量,它存放在代码段中指令操作码之后,它可能是一个数值地址,也可能是符号地址。寻址方式如图3.5所示:图3.5 直接寻址,3直接寻址,当操作数在内存中,必须先求出操作数的物理地址,然后再根据物理地址访问存储器从而取得操作数。物理地址PA16D(段寄存器)+EA 操作数一般存放在内存数据段中,物理地址PA16(DS)+EA=16(DS)+位移量汇编语言中可以用变量名(符号地址)代替数值地址,但要注意变量的属性,在计算其物理地址时也默认以DS来提供段基值。,IBM PC机允许数据存放在数据段以外的其它段中(可以是CS,SS,ES),但必须在指令中指定段跨越前缀。,说明:,定义:操作数的有效

4、地址EA在基址寄存器(BX/BP)或变址寄存器(SI/DI)中,而操作数在内存中。寻址方式如图3.7所示:图3.7 寄存器间接寻址,4寄存器间接寻址,若选择BX或SI或DI寄存器提供的间址,则操作数一般在数据段区域中,用DS提供段基址,即操作数物理地址PA为:PA=16(DS)+EA=16(DS)+(BX)或(SI)或(DI)。若选择BP寄存器提供的间址,则操作数在堆栈段区域中,用SS提供段基址,即操作数物理地址PA为:PA=16(SS)+EA=16(SS)+(BP)用SI、DI、BX、BP作为间接寻址时允许使用段跨越前缀,从而实现对其它段中数据的存取。用途:这种寻址方法适用于数组、字符串、表

5、格的处理。,说明:,定义:操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量之和。寻址方式如图3.9所示:图3.9 寄存器相对寻址方式,5寄存器相对寻址,若选择BP寄存器提供的基地址,则操作数在堆栈段区域中,用SS提供段基址,即操作数物理地址PA为:PA=16D(SS)+EA=16D(SS)+位移量+(BP),若选择BX或SI或DI寄存器提供的基地址或变地址,则操作数一般在数据段区域中,用DS提供段基址,即操作数物理地址PA为:PA=16(DS)+EA=16(DS)+位移量+(BX)或(SI)或(DI),寄存器相对寻址方式允许使用段跨越前缀。用途:也适用于数组、字符串

6、、表格的处理。,说明:,定义:操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,基址寄存器名和变址寄存器名均由指令指定。寻址方式如图3.11所示:图3.11 基址变址寻址,6基址变址寻址,若选择BX寄存器提供基地址,SI或DI寄存器提供变地址,则操作数一般在数据段区域中,用DS提供段基址,即操作数物理地址PA为:PA=16(DS)+EA=16(DS)+(BX)+(SI)或(DI),若选择BP寄存器提供基地址,SI或DI寄存器提供变地址,则操作数在堆栈段区域中,用SS提供段基址,即操作数物理地址PA为:PA=16(SS)+EA=16(SS)+(BP)+(SI)或(DI)必须是一个基址寄

7、存器和一个变址寄存器的组合;寄存器相对寻址方式允许使用段跨越前缀,适用于数组、字符串、表格的处理。,说明:,定 义:操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和。寻址方式如图3.13所示:图3.13 相对基址变址寻址,7相对基址变址寻址,若选择BP寄存器提供基地址,SI或DI寄存器提供变地址,则操作数在堆栈段区域中,用SS提供段基址。,若选择BX寄存器提供基地址,SI或DI寄存器提供变地址,则操作数一般在数据段区域中,用DS提供段基址。,这种寻址方式为处理堆栈中的数组提供方便:用BP可指向栈顶,位移量表示数组第一个元素到栈顶的距离,变址寄存器指向数组元素。,说

8、明:,3.1.2 与转移地址有关的寻址方式,定义:转向的有效地址EA是当前IP寄存器的内容和指令中指定的8位或16位位移量之和。寻址方式如图3.15所示:图3.15 段内直接寻址,1段内直接寻址,在机器指令中,转向的有效地址EA用相对于当前IP值的位移量来表示,位移量=转向有效地址(当前IP);对于16位的位移量,它可正可负,取值范围是3276832767;对于8位的位移量,它也可正可负,取值范围是128127;这种寻址方式适用于条件转移、无条转移指令及调用指令CALL。指令汇编语言格式:JMP NEAR PTR LL1;(IP)(当前IP)+16位位移量JMP SHORT LL2;(IP)(

9、当前IP)+8位位移量,说明:,定义:转向的有效地址是一个寄存器或一个存储单元的内容,这内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,然后用得到的转向有效地址来取代IP寄存器的内容。寻址方式如图3.17所示:图3.17 段内间接寻址,2段内间接寻址,这种寻址方式和以下二种段间寻址方式都不能用于条件转移指令,而无条件转移指令JMP和调用指令CALL则可用4种寻址方式中的任意一种。汇编格式:JMP BX JMP WORD PTR BX其中:WORD PTR用以指出BX寻址所取得转向地址是一个字的有效地址。以上两种寻址方式都是段内转移,所以直接把求得的有效地址送到IP寄存器就可以了。计

10、算物理地址PA公式为:PA=16(CS)+EA,说明:,定义:指令中直接提供转向段基址和偏移地址,从而实现从一段转移到另一段的操作。寻址方式如图3.18所示:,图3.18 段间直接寻址,3段间直接寻址,用指令中指定的偏移地址IP用指令中指定的段地址CS指令的汇编语言格式:JMP FAR PTR LLL,说明:,4段间间接寻址 定义:用内存中两个相继字的内容取代IP、CS以达到段间转移目的。内存单元的地址是由紧跟在操作码之后除立即数方式和寄存器方式以外的任何一种寻址方式取得。寻址方式如图3.20所示:图3.20 段间间接寻址,用内存中两个相继字(即双字)的低字取代IP,高字取代CS;指令汇编语言

11、格式:JMP DWORD PTR BX其中,DWORD PTR是双字操作符,转向地址双字(段间转移),BX是数据寻址方式的寄存器间接寻址。,说明:,数据传送指令(Data transfer Instruction)算术运算指令(Arithmetic Instruction)逻辑运算和移位指令(Logic&Shift Instruction)串操作指令(String manipulation Instruction)控制转移指令(Control Transfer Instruction)处理器控制指令(Processor Control Instruction),3.2 8086的指令系统,80

12、86数据传送指令用于实现CPU的寄存器之间、CPU与存储器之间、以及CPU与I/O端口之间的数据传送。数据传送指令又可分为以下四种:通用传送指令累加器专用传送指令地址传送指令标志传送指令,3.2.1 数据传送指令,格 式:MOV dest,src执行的操作:(dest)(src)即把源操作数的内容传送给目的操作数,目的操作数原有的内容消失。它对标志位没有影响;它可以完成字节(或字)之间的传送,不过源操作数和目的操作数之间的长度要匹配。MOV指令的数据传送方向如图3.21所示:,(1)MOV 传送指令,1通用传送指令 8086提供方便灵活的通用的传送操作,适用于大多数操作数。通用传送指令(除了X

13、CHG以外)是唯一允许以段寄存器为操作数的指令。,图3.21 MOV指令数据传送方向,CPU内部寄存器之间的数据的任意传送(除了代码段寄存器CS和指令指针IP以外),段寄存器之间不能直接传送。立即数传送至CPU内部通用寄存器组(AX、BX、CX、DX、BP、SP、SI、DI),用于给寄存器赋初值,不能直接给段寄存器赋值;立即数也可传送给存储器。CPU内部寄存器(除CS和IP外)与存储器之间的数据传送,可以实现一字节或一个字的传送,存储单元之间不能直接传送。,MOV指令能实现以下操作:,两个存储单元之间不能直接传送数据。立即数不能直接传送给段寄存器。段寄存器之间不能直接传送数据。,CS和IP不能

14、作为目的操作数;MOV CS,AX;(非法),对于MOV指令使用,应注意以下几点:,(2)PUSH 进栈指令 格 式:PUSH src 执行的操作:(SP)(SP)2(SP)+1,(SP)(src),(3)POP 出栈指令 格 式:POP dest 执行的操作:(dest)(SP)+1,(SP)(SP)(SP)2,堆栈操作都按字操作;PUSH,POP指令的操作数只能有三种:通用寄存器、段寄存器(CS除外,PUSH CS合法,POP CS非法)、存储器;当字数据进栈时,将它的低字节放到低地址,将它的高字节放到高地址;当字数据出栈时,注意它的低字节在低地址,它的高字节在高地址;堆栈的最大容量就是S

15、P的初始化值;堆栈工作原则是“后进先出”。因此,保存和恢复字数据时,PUSH、POP指令应该成对使用,以保证数据的正确性和保持堆栈原有状态。,使用堆栈操作指令需注意以下几点:,(4)XCHG 交换指令 格 式:XCHG dest,src 执行的操作:(dest)(src)即源操作数与目的操作数相交换。它可以实现字节交换,也可以实现字交换。交换的过程可以在通用寄存器之间,也可以在通用寄存器与存储器之间。使用交换指令,注意以下两点:两个存储单元之间不能直接交换,两个操作数中必须有一个在寄存器中。段寄存器(CS、DS、SS、ES)和指令指针IP不能作为它的源操作数,也不能作为目的操作数。,8086和

16、其他微处理器一样,累加器acc(即AX或AL)仍然是数据传送的核心。,(1)IN 输入指令 长 格 式:IN AL,port(字节端口)IN AX,port(字端口)执行的操作:(AL)(port)(AX)(port+1,port)短 格 式:IN AL,DX(字节端口)IN AX,DX(字端口)执行的操作:(AL)(DX)(AX)(DX)+1,(DX),2.累加器专用传送指令,(2)OUT 输出指令 长 格 式:OUT port,AL(字节端口)OUT port,AX(字端口)执行的操作:(port)(AL)(port+1,port)(AX)短 格 式:OUT DX,AL(字节端口)OUT

17、DX,AX(字端口)执行的操作:(DX)(AL)(DX)+1,(DX)(AX),格式:XLAT str_table 或 XLATstr_table表格符号地址(首地址),只是为了提高可读性而设置,是可有可无的,而指令执行时只会使用预先已经存入BX中的表格首地址。该指令不影响标志位。执的行操作:(AL)(BX)+(AL),(3)XLAT 换码指令,XLAT指令使用方法:先建立一个字节表格,表格的内容就是所要换取的代码;然后将表格首地址存入BX;再将需要换取的代码的序号(即相对与表格首地址的位移量)存入AL;最后再使用XLAT,它执行指令后,转换后的代码就在AL中。,8086/8088 提供三条将

18、地址指针写入指定寄存器或寄存器的指令。,(1)LEA 有效地址送寄存器指令 格 式:LEA reg16,mem16 执行的操作:(reg16)EA 该指令把源操作数的有效地址装入指定的寄存器。通常用于加载有效地址,写近地址指针。注意以下两点:LEA指令中的目标寄存器必须是16位的通用寄存器,源操作数必须是一个存储器操作数。LEA指令与MOV指令注意比较使用.,3.地址传送指令,(2)LDS 地址指针送寄存器和DS指令 格 式:LDS reg16,mem32 执行的操作:(reg16)(EA)(DS)(EA)+2)该指令是将源操作数四个相继的字节分别送给指令指定的寄存器和DS。即将指令指定mem

19、32单元的前两个字节单元内容(16位偏移量)装入指定通用寄存器,把后两个字节单元内容(段地址)装入到DS段寄存器。,(3)LES 地址指针送寄存器和ES指令 格 式:LES reg16,mem32 执行的操作:(reg16)(EA)(ES)(EA)+2)该指令是将源操作数四个相继的字节分别送给指令指定的寄存器和ES。,通过这些指令可以读出当前标志寄存器的内容,也可以对标志寄存器重新设置新值。,(1)LAHF 标志位送AH 格 式:LAHF 执行的操作:(AH)(标志寄存器PSW的低字节),(2)SAHF AH送标志寄存器 格 式:SAHF 执行的操作:(标志寄存器PSW的低字节)(AH),4.

20、标志寄存器传送指令,(4)POPF 标志寄存器出栈指令格 式:POPF执行操作:(PSW)(SP)1,(SP),(SP)(SP)2 使用标志位传送指令,注意以下两点:LAHF、PUSHF不影响标志位,SAHF、POPF由装入的值确定标志位的值,即影响标志位。PUSHF和POPF一般分别用于子程序或中断服务程序的首尾,起保护主程序标志和恢复主程序标志的作用。,(3)PUSHF 标志寄存器进栈指令格 式:PUSHF执行的操作:(SP)(SP)2,(SP)+1,(SP)(PSW),8086指令系统提供了加、减、乘、除四种基本算术操作。8086指令系统还提供了各种校正指令,从而可以实现组合的(即用一个

21、字节表示两个BCD码)或非组合的(即用一个字节表示一个BCD码,其中高四位为0)十进制的算术运算。算术运算指令又可分为以下五种:加法指令减法指令乘法指令除法指令十进制调整指令,3.2.2 算术运算指令,(1)ADD 加法指令 格 式:ADD dest,src 执行的操作:(dest)(dest)+(src)注意以下三点:它可以进行8位、16位的无符号数和带符号数的加法运算;它的源操作数和目标操作数不能同时为存储器操作数;该指令影响标志位SF,ZF,AF,PF,OF,CF。,1.加法指令,格 式:ADC dest,src执行的操作:(dest)(dest)+(src)+CF其中CF为进位位标志的

22、现行值。注意以下两点:它与ADD指令相似,只是在两个操作数相加时,要把进位位标志CF的现行值加上去,结果送给目的操作数。主要用于多字节运算中。,(2)ADC 带进位加法指令,格 式:INC dest 执行的操作:(dest)(dest)+1 使操作数的内容加1,然后再送回该操作数。该操作数可以是寄存器操作数、存储器操作数。注意以下两点:标志位影响:它影响SF,ZF,AF,PF,OF,不影响CF。主要用于在循环程序中修改地址指针和循环次数。,(3)INC 加1指令,(1)SUB 减法指令格 式:SUB dest,src;执行的操作:(dest)(dest)(src)注意以下三点:它可以进行8位、

23、16位的无符号数和带符号数的减法运算;它的源操作数和目标操作数不能同时为存储器操作数;该指令影响标志位SF,ZF,AF,PF,OF,CF。,2.减法指令,格式:SBB dest,src执行的操作:(dest)(dest)(src)CF其中CF表示进位标志位CF的现行值。注意以下两点:它与SUB指令相似,只是在两个操作数相减时,要把进位位标志CF的现行值减出去,结果送给目的操作数。主要用于多字节运算中。,(2)SBB 带借位减法指令,格 式:DEC dest 执行的操作:(dest)(dest)1 使操作数的内容减1,然后再送回该操作数。该操作数可以是寄存器操作数、存储器操作数。注意以下两点:标

24、志位影响情况:它影响SF,ZF,AF,PF,OF,不影响CF;主要用于在循环程序中修改地址指针和循环次数。,(3)DEC 减1指令,格 式:NEG dest执行的操作:(dest)0(dest)即把操作数按位求反后末位+1,因此该操作可以表示为:(dest)0FFFFH(dest)+1,(4)NEG 求补指令,该指令要影响标志位:SF,ZF,AF,PF,OF,CF,特别要注意CF和OF:CF:只有操作数为0时求补,CF=0;否则CF=1;OF:只有对操作数128 或32768求补,OF=1;否则OF=0;,格 式:CMP dest,src执行的操作:(dest)(src)CMP比较指令是执行两

25、个数的相减操作,但不送回相减的结果,只是使结果影响标志位:SF,ZF,AF,PF,OF,CF。,(5)CMP 比较指令,CMP指令主要是通过比较来设置状态标志位,分以下三种情况讨论:根据ZF标志,判断两个数据是否相等;即两个数相减后,如果ZF=1,则表示比较的两个操作数相等;如果ZF=0,则表示比较的两个操作数不相等;根据CF标志,判断两个无符号数的大小;即两个无符号数相减后,如果CF=1,则表示被减数小,减数大;如果CF=0,则表示被减数大,减数小。根据SF、OF标志,判断两个带符号数的大小;对于有符号数的比较操作,如果得到溢出标志位OF和符号标志位SF的值相同(均为0或者均为1),则说明被

26、减数比减数大;如果得到溢出标志位OF和符号标志位SF的值不同(一个为0另一个为1),则说明被减数比减数小;,格 式:MUL src 执行的操作:(src)为字节操作数:(AX)(AL)(src)(src)为字操作数:(DX,AX)(AX)(src),3.乘法指令,(1)MUL 无符号数乘法,格 式:IMUL src执行的操作:(src)为字节操作数:(AX)(AL)(src)(src)为字操作数:(DX,AX)(AX)(src),(2)IMUL 带符号数乘法,说 明:MUL和IMUL指令执行的操作是一样的,只不过MUL的运算对象是无符数,而IMUL的运算对象是带符号数。在乘法指令里面,目的操作

27、数必须是累加器,字运算时为AX,字节运算时为AL。两个8位数相乘得到的16位乘积保存在AX中;当进行字乘法时,两个16位数相乘得到的32位乘积存放在DX、AX寄存器对中,其中DX存放高位字,AX存放低位字。乘法指令只影响CF和OF,而对AF、SF、ZF、PF未定义。,格 式:DIV src执行的操作:(src)为字节操作数:(AL)(AX)/(src)的商(AH)(AX)/(src)的余数(src)为字操作数:(AX)(DX,AX)/(src)的商(DX)(DX,AX)/(src)的余数,4.除法指令,(1)DIV 无符号数除法指令,说 明:即当进行字节操作时,16位被除数在AX中,8位除数为

28、源操作数,结果的8位商在AL中,8位的余数在AH中。当进行字操作时,32位被除数在DX、AX寄存器对中,16位除数为源操作数,结果的16位商在AX中,16位的余数在DX中。,格 式:IDIV src 执行的操作:(SRC)为字节操作数:(AL)(AX)/(src)的商(AH)(AX)/(src)的余数(SRC)为字操作数:(AX)(DX,AX)/(src)的商(DX)(DX,AX)/(src)的余数,(2)IDIV 带符号数除法指令,说 明:除法指令可以是除立即数寻址以外的任何一种寻址方式。而其目的操作数则必须存放在AX或DX.除法指令对状态标志位没有定义。除法指令要求字节操作时商为8位,字操

29、作时商为16位。如果是字节操作时被除数的高8位的绝对值大于除数的绝对值或字操作时被除数的高16位的绝对值大于除数的绝对值,商就会产生溢出。由于除法指令在字节操作时要求被除数为16位放在AX中,在字操作时要求被除数为32位放在DX、AX寄存器对中。,格 式:CBW 执行的操作:将AL的内容符号扩展到AH。即如果(AL)的最高有效位0,则(AH)=00;否则(AH)=0FFH。,格 式:CWD 执行的操作:将AX的内容符号扩展到DX。即如果(AX)的最高有效位0,则(DX)=0000;否则(AH)=0FFFFH。,(3)CBW 字节转换为字指令,(4)CWD 字转换为双字指令,5.十进制调整指令

30、为了便于十进制数的运算,计算机还专门提供了一组十进制数调整指令。,格 式:DAA 执行的操作:把AL中的和调整为压缩的BCD码格式并保存到AL中,这条指令之前必须执行ADD或ADC指令。该指令的调整方法如下:如果AF标志为1或者AL的低4位是十六进制的AF,则AL的内容加06H,且将AF位置1;如果CF标志为1或者AL的高4位是十六进制的AF,则AL的内容加60H,并将CF位置1。DAA指令对OF标志没有定义,但影响其他所有状态标志。,(1)DAA 加法十进制调整指令,格 式:DAS 执行的操作:把AL中的差调整为压缩的BCD码格式并保存到AL中,这条指令之前必须执行SUB或SBB指令,减法指

31、令必须把两个压缩的BCD码相减,并把结果存在AL寄存器中。该指令的调整方法如下:如果AF标志为1或者AL的低4位是十六进制的AF,则AL的内容减06H,且将AF位置1;如果CF标志为1或者AL的高4位是十六进制的AF,则AL的内容减60H,并将CF位置1。DAS指令对OF标志没有定义,但影响其他所有状态标志。,(2)DAS 减法十进制调整指令,格 式:AAA执行的操作:(AL)把AL中的和调整为非压缩的BCD码格式(AH)(AH)调整产生的进位值 该指令执行之前必须执行ADD或ADC指令,加法指令必须把两个非压缩的BCD码相加,并把结果放在AL中。该指令的调整方法如下:如AL的低4位在09之间

32、,且AF位为0,则跳过第步,执行第步;如AL的低4位在十六进制数AF之间或AF位为1,则AL的内容加6,AH的内容加1,并将AF位置1;清除AL的高4位;AF位的值送CF位。,(3)AAA 加法十进制调整指令,格 式:AAS 执行的操作:(AL)把AL中的差调整为非压缩的BCD码格式(AH)(AH)调整产生的借位值 该指令执行之前必须执行SUB或SBB指令,减法指令必须把两个非压缩的BCD码相减,并把结果放在AL中。该指令的调整方法如下:,(4)AAS 减法十进制 调整指令,如AL的低4位在09之间,且AF位为0,则跳过第步,执行第步;如AL的低4位在十六进制数AF之间或AF位为1,则AL的内

33、容减6,AH的内容减1,并将AF位置1;清除AL的高4位;AF位的值送CF位。,格式:AAM执行的操作:(AX)把AL中的乘积调整为非压缩的BCD码格式 该指令执行之前必须执行MUL指令,乘法指令必须把两个非压缩的BCD码相乘(此时要求高4位为0),并把结果放在AL中。该指令的调整方法是:把AL的内容除以0AH,商放到AH中,余数放到AL中。该指令根据AL的内容设置SF、ZF、PF,对OF、CF、AF没有定义。,(5)AAM 乘法十进制调整指令,格 式:AAD执行的操作是:(AL)(AH)0AH(AL)(AH)0该指令根据AL的内容设置SF、ZF、PF,对OF、CF、AF没有定义。,(6)AA

34、D 除法十进制调整指令,3.2.3 逻辑运算和移位指令 8086指令系统提供了对8位数和16位数的逻辑操作指令。这些指令分为两类:一类是逻辑运算指令;另一类是逻辑移位指令。,(1)AND 逻辑“与”指令 格 式:ANDdest,src 执行的操作:(dest)(dest)(src)该指令对指定的两个操作数按位进行逻辑“与”运算,即只有相与的两位全为1,“与”运算的结果才为1;否则“与”运算的结果才为0。注意以下三点:“与”指令中操作数不能同时为存储器;该指令执行后CFOF=0,AF未定义,SF、ZF、PF根据运算结果设置;“与”指令一般用来对一个数据的指定位清0,而其余位保持不变。,1.逻辑运

35、算指令,(2)TEST(测试指令)格 式:TEST dest,src执行的操作:(dest)(src)本指令完成AND指令同样的操作,但不送回“与”操作结果,只是使结果反映在标志位上。TEST指令常常用来检测指定位是1还是0。,“或”指令中操作数不能同时为存储器;该指令执行后CFOF=0,AF未定义,SF、ZF、PF根据运算结果设置;“或”指令一般用来对一个数据的指定位置1,而其余位保持不变。,使用OR指令,注意以下三点:,(3)OR 逻辑“或”指令,格 式:OR dest,src 执行的操作:(dest)(dset)(src)该指令对指定的两个操作数按位进行逻辑“或”运算,即进行“或”运算的

36、两位中的任一位为1(或两位都为1),则“或”的结果为1,否则为0。,(4)XOR 逻辑“异或”指令,格式:XOR dest,src 执行的操作:(dest)(dest)(src)该指令对指定的两个操作数按位进行逻辑“异或”运算,即进行“异或”运算的两位不相同时,“异或”的结果为1,否则为0,“异或”指令是使操作数初值清0的有效方法;该指令执行后CFOF=0,AF未定义,SF、ZF、PF根据运算结果设置;“异或”指令一般用来对一个数据的指定位变反,而其余位保持不变。,使用XOR指令,注意以下三点:,格 式:NOT dest 执行的操作:字节求反:(dest)0FFH(dest)字求反:(dest

37、)0FFFFH(dest)对操作数按位求反,它对标志位没有影响。,(5)NOT 逻辑“非”指令,逻辑运算指令小结:特点:逻辑运算指令可以对字或字节操作数执行逻辑运算;逻辑运算是按位操作,对标志位的影响:NOT指令不影响标志位,其他4种指令将使CF0F=0,AF未定义,而SF、ZF、PF根据运算结果设置。应用:AND指令用来对指令的指定位清“0”。OR指令常用来对某些位置1。XOR指令用在程序开头,使某个寄存器清“0”。NOT指令对某个数据取反,再加1变成补码。TEST指令用来检测指定位为1,还是0。,8086移位指令可以分为两大类,一类是算数逻辑移位指令,另一类是循环移位指令。,(1)SHL

38、逻辑左移指令格式:SHL dest,cnt执行的操作如下图3.26所示:图3.26 移位指令执行的操作,2.移位指令,使用SHL指令,注意以下三点:SHL指令格式中dest可以是除立即数以外的任何寻址方式,可以是字或字节操作数。cnt表示移位次数,当cnt=1时,1可直接写在指令中;当cnt1时,必须在移位指令前把移位次数置于CL寄存器中,而移位指令中的cnt写为CL即可。该指令执行后要影响标志位,CF根据各条指令的规定设置;OF只有当cnt=1才有效,移位前后最高位发生变化时(即移位之前最高位为0,移位之后最高位为1;或移位之前最高位为1,移位之后最高位为0)OF=1,否则OF=0;SF、Z

39、F、PF要根据移位后的结果来设置,AF没有定义。逻辑移位指令在执行时,实际上把操作数看成无符号数进行移位;算术移位指令在执行时,实际上把操作数看成有符号数进行移位。,(2)SAL 算术左移指令格式:SAL dest,cnt 执行的操作图与SHL指令一样,见图3.26,实际上SAL和SHL指令的功能完全一样,每移位一次,最低位补0,最高位进入CF。,(3)SHR 逻辑右移指令格式:SHR dest,cnt,(4)SAR 算术右移指令格式:SAR dest,cnt 算术逻辑移位指令常常用来做乘以2或除以2的操作。,格 式:ROL dest,cnt执行的操作如图3.27所示:图3.27 循环移位指令

40、执行的操作,(5)ROL 不含CF循环左移指令,(6)ROR 不含CF循环右移指令格式:ROR dest,cnt,(7)RCL 含CF循环左移指令格式:RCR dest,cnt,(8)RCR 含CF循环右移指令 格式:RCR dest,cnt,在使用循环指令,要注意它们对标志位的影响,对于OF和CF的具体设置,实际上又与算术逻辑指令设置情况一样。循环移位指令(Rotate)与移位指令(Shift)最大的不同是循环移位指令移位后,操作数中原来各数位的信息不会丢失,只是移动了位置。,说明:,8086的串操作指令有以下的几个特点:它可以对字节串进行操作,也可以对字串进行操作;通过加重复前缀来实现串重

41、复操作;所有的串操作指令都用SI对源操作数进行间接寻址,并且假定是在DS段中;而所有的串操作指令都是用DI寄存器对目的操作数进行间接寻址,并且假定在ES段中。串操作时,地址的修改方向与方向标志位DF有关,当DF=1时,SI、DI作自动减量修改;当DF=0时,SI、DI作自动增量修改。,3.2.4串操作指令,REP(Repeat)重复格式:REP String Primitive其中,String Primitive可为:MOVS、STOS、LODS指令。REP重复串操作直到(CX)=0为止。执行的操作过程:如果(CX)=0,则退出REP,否则往下执行;如果(CX)0,(CX)(CX)1;执行R

42、EP后的串操作指令;重复;,1)与REP相配合工作的MOVS、STOS、LODS指令,格式:MOVS dest,src或 MOVSB(字节)或 MOVSW(字)其中第二、三种格式明确注明传送字节或字,第一种则应在操作数中表明是字还是字节操作。执行的操作:(ES):(DI)(DS):(SI)(SI)(SI)1,(DI)(DI)1或(SI)(SI)2,(DI)(DI)2当方向标志DF=0(即CLD)时用“”;DF=1(即STD)时用“”。,(1)MOVS 串传送,它可以把由(SI)指向的数据段中的一个字(或字节)传送到由(DI)指向的附加段中的一个字(或字节)中去,并根据方向标志DF及数据格式(字

43、或字节)对SI、DI进行修改。在使用MOVS指令时,应该先做好以下准备工作:数据段中源串首地址存入SI寄存器中;附加段中目的串首地址存入DI寄存器中;数据串长度存入CX寄存器;用CLD指令(即使DF=0)或STD指令(即使DF=1)建立方向标志。,功能:,(2)LODS 从串取指令,格 式:LODS src或 LODSB(字节)或 LODSW(字)执行的操作:字节操作:(AL)(DS):(SI),(SI)(SI)1 字操作:(AX)(DS):(SI),(SI)(SI)2 功能:该指令把由(SI)指定的数据段中某字节(或字)单元内容送AL(或AX)。注意:该指令允许用段跨越前缀来指定非数据段的存

44、储区;它不影响条件码;一般说来,它不与REP联用,每重复一次,累加器的内容就改变一次,而累加器AL(或AX)中只能保持最后一个元素.,(3)STOS 存入串指令,格式:STOS dest或 STOSB(字节)或 STOSW(字)执行的操作:字节操作:(ES):(DI)(AL),(DI)(DI)1字操作:(ES):(DI)(AX),(DI)(DI)2用途:与REP联用时,(CX)缓冲区长度,用来建立一串相同的值。,REPE/REPZ 相等/为零则重复格式:REPE(或REPZ)string primitive其中String primitive可为:CMPS,SCAS指令。执行的操作过程:如果(

45、CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出REPE,否则往下执行;(CX)(CX)1;执行REPZ后的串操作指令;重复;,2)与REPE/REPZ和REPNE/REPNZ联合工作的CMPS和SCAS指令,格式:REPNE(或REPNZ)string primitive执行的操作过程:如果(CX)=0或ZF=1(即某次比较的结果两个操作数相等)时退出REPNE,否则往下执行;(CX)(CX)1;执行REPNZ后的串操作指令;重复;,REPNE/REPNZ当不相等/不为零时重复串操作,格式:CMPS dest,src或 CMPSB(字节)或 CMPSW(字)执行操作:(SI)(D

46、I)字节操作:(SI)(SI)1,(DI)(DI)1字操作:(SI)(SI)2,(DI)(DI)2功能:指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果。,(1)CMPS 串比较指令,格式:SCAS dest或 SCASB(字节)或 SCASW(字)执行的操作:字节操作:(AL)(ES):(DI),(DI)(DI)1字操作:(AX)(ES):(DI),(DI)(DI)2功能:指令把AL(或AX)的内容与由DI指定的在附加段中的一个字节或字进行比较,并不保存结果,只根据结果设置标志位,其它特性与MOVS同。,(2)SCAS 串扫描指令

47、,在8086中有以下五种控制转移指令:,格式:JMP 操作数功能:无条件的转去执行从目标地址开始的指令。转移可以分成两类:段内转移和段间转移。段内转移:是指在同一段的范围之内进行转移,此时只需要改变IP寄存器的内容.段间转移:是指在不同的段之间进行转移。要实现从一个段转移到另一个段去执行程序,不仅要修改IP寄存器的值,还要修改CS寄存器的值才能达到目的.,3.2.5 控制传送指令,1.无条件转移指令JMP,格式:JCC OPR其中“J”后面的“CC”是指“某一测试条件”。条件转移指令根据上一条指令所设置的条件码来判别测试条件,当满足测试条件时,则转移到由指令指出的目标地址去执行那里的程序;当不

48、满足条件时则不转移,即顺序地执行下一条指令,条件转移指令可以分为四大类:,2.条件转移指令,格式:JCXZ OPR测试条件:(CX)=0由于CX寄存器经常用来设置计数值,所以这条指令可以根据CX寄存器内容的修改情况来产生两个不同的分支。,(1)测试CX的值为0则转移指令,(2)简单条件转移指令,假设在条件转移指令之前使用了比较指令,比较了两个无符号数M、N,指令进行的操作是MN,转移指令如下表3.3所示:,(3)无符号数条件转移指令,假设在条件转移指令之前使用了比较指令,比较了两个带符号数M、N,指令进行的操作是MN,转移指令如下表3.4所示:,(4)带符号数条件转移指令,3.子程序调用指令

49、汇编语言中的子程序相当于高级语言中的过程。当主程序中需要完成某一个独立功能时,则可以调用能够完成该独立功能的子程序,8086提供了以下指令:,(1)CALL调用指令 CALL调用指令具体可以分成4中情况进行调用:段内直接调用、段间直接调用、段内间接调用、段间间接调用,执行的操作:(SP)(SP)2(SP)1,(SP)(IP)(IP)(IP)D16,段内直接调用格式:CALL OPR,段内间接调用:格式:CALL OPR执行的操作:(SP)(SP)2(SP)1,(SP)(IP)(IP)(EA)其中EA:由OPR寻址方式(除立即数以外的任何一种寻址方式)所确定的有效地址。,段间直接调用:格式:CA

50、LL FAR PTR OPR执行的操作:(SP)(SP)2(SP)1,(SP)(CS)(SP)(SP)2(SP)1,(SP)(IP)(IP)OPR偏移地址(指令中第2,3字节)(CS)OPR段地址(指令中第4,5字节)因为主程序和子程序不在同一段中,所以在保留返回地址和设置目标地址的时候都必须把段地址考虑在内。,格式:CALL DWORD PTR OPR 执行的操作:(SP)(SP)2(SP)1,(SP)(CS)(SP)(SP)2(SP)1,(SP)(IP)(IP)(EA)(CS)(EA2)其中EA是由OPR的寻址方式确定的有效地址。实际上,CALL指令的使用方法与JMP指令相同,所以在指令的

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号