寻址方式与指令系统.ppt
第3章 8086寻址方式与指令系统,本章主要内容,3.1 概述,指令是指挥计算机进行操作的命令。指令系统是指微处理器能执行的各种指令的集合。程序是一系列按一定顺序排列的指令。执行程序的过程就是计算机的工作过程。微处理器的主要功能由它的指令系统来体现。不同的微处理器有不同的指令系统,其中每一条指令对应着处理器的一种基本操作,这在设计微处理器时确定。,通常一条指令包括两部分:操作码:决定要完成的操作操作数:指参加运算的数据或是该数所在的内存单元的地址。指令的一般格式如下:操作码 操作数1,操作数2,操作数n没有操作数的指令称为无操作数指令。有两个操作数的指令称为双操作数或二地址指令。操作码和操作数地址都由二进制数码表示,整条指令以二进制编码的形式存放在存储器中。,指令系统与寻址方式的重要性,采用不同CPU的计算机的指令系统不同。采用不同CPU的计算机的指令的格式不同。采用不同CPU的计算机的各指令允许的寻址方式不同。要使用某种微处理器,必须先要掌握其指令系统和各指令允许的寻址方式。,3.2 8086寻址方式,寻址方式:指令中给出的求出操作数有效地址的方法。寻址操作:计算机按照指令给出的寻址方式求出操作数有效地址的过程。,808的七种基本的数据寻址方式,(1)立即寻址;(2)寄存器寻址;(3)直接寻址;(4)寄存器间接寻址;(5)寄存器相对寻址;(6)基址变址寻址;(7)相对基址变址寻址。,存储器寻址方式,3.2.1 立即寻址,操作数直接出现在指令中,此时的操作数也叫立即数。立即数紧跟在操作码后面,一起存放在代码段中。例如:MOV AX,2010H在该指令格式中,AX是目标操作数,2010H是源操作数。,立即寻址方式的指令执行示意图,立即寻址方式说明,在所有的指令中,立即数只能作源操作数,不能作目标操作数。立即数应与目标操作数的长度一致。立即数默认采用十进制形式,以十六进制形式出现的立即数应以字母H为后缀,以八进制形式出现的立即数应以字母Q为后缀。以十六进制形式出现的立即数,若以字母开头,则必须以数字0为前缀。立即数还可以用表示+、-、/表示的算术表达式,也可以用圆括号改变运算顺序。立即数只能是整数,不能是小数、变量或其它类型的数据。,3.2.2 寄存器寻址,操作数在寄存器中,在指令中指定寄存器号。由于寄存器号短,因此,采用寄存器寻址方式的指令的机器码长度短。操作数在寄存器中,指令执行时,操作就在CPU的内部进行,不需要通过访问存储器来取得操作数,因而指令的执行速度快。在编程中,如有可能,应尽量在指令中使用这种寻址方式。例如:MOV AX,2010H,寄存器寻址方式可用的寄存器,对于16位操作数,寄存器可以是:AX,BX,CX,DXSI,DI,SP,BPCS,DS,SS和ES对8位操作数,寄存器可以是:AH,ALBH,BLCH,CLDH,DL,寄存器寻址方式指令执行示意图,寄存器寻址方式说明,在一条指令中,寄存器寻址方式既可用于源操作数,也可用于目标操作数,还可以两者都用寄存器寻址方式。源操作数与目标操作数的长度应一致。例如,不能将寄存器AX的内容传送到寄存器BH中,也不能将寄存器BH的内容传送到寄存器AX中。两个操作数不能同时为段寄存器。目标操作数不能是代码段寄存器。,3.2.4 直接寻址,操作数在存储器中,指令中以具体数值的形式直接给出操作数所在存储单元的有效地址EA。为了与立即数区别,该有效地址必须用括起。例如:MOV AX,2010H该指令的源操作数采用直接寻址方式。若(DS)=2000H,那么指令执行后,(AX)=1225H。,直接寻址方式指令执行示意图,采用直接寻址方式时,如果指令中没有用前缀说明操作数存放在哪个段,则操作数默认存放在数据段。8086系统允许操作数存放在代码段、堆栈段或附加段。此时,就需要在指令中指明段超越。例如:MOV ES:1225H,AX 该指令的目标操作数采用直接寻址方式。操作数存放在由ES指示的附加段中。物理地址=ES10H+1225H。,在汇编语言指令中,可以用符号地址代替数值地址。例如:MOV AX,NUMA此时,NUMA是存放操作数的内存单元的符号地址。上面这条指令还可以写成如下的形式:MOV AX,NUMA如DATA1数据存放在附加段,则可以用如下的形式指定段跨越前缀:MOV AX,ES:NUMA或 MOV AX,ES:NUMA,3.2.4 寄存器间接寻址,操作数的有效地址EA存放在基址寄存器BX、BP或变址寄存器SI、DI中。为了区别于寄存器寻址方式,指令中指定的寄存器名要用括起来。指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。操作数的物理地址=(DS)10H+(SI)/(DI)/(BX)或(SS)10H+(BP),例如:MOV AX,SI 该指令的源操作数采用寄存器间接寻址方式。若(DS)=2000H,(SI)=2010H,那么指令执行后,(AX)=1225H。如操作数不存放在间址寄存器默认的段,则指定段超越的指令可采用如下形式。MOV AX,ES:SI 此时,操作数的物理地址=ES10H+SI。,寄存器间接寻址方式指令执行示意图,3.2.5 寄存器相对寻址,操作数的有效地址EA是指令中指定的基址或变址寄存器的值与位移量之和。指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。操作数的物理地址=(DS)10H+(SI)/(DI)/(BX)+8位或16位位移量 或=(SS)10H+(BP)+8位或16位位移量,例如:MOV AX,8BX 该指令的源操作数采用寄存器相对寻址方式。若(DS)=2000H,(BX)=2008H,那么指令执行后,(AX)=1225H。,寄存器相对寻址方式的指令执行示意图,寄存器相对寻址说明,偏移量是符号数,8位偏移量的取值范围为:000FFH(即+127D-128D);16位偏移量的取值范围为:00000FFFFH(即+32767D-32768D)。8086汇编允许用下面三种形式表示相对寻址,它们是等效的。MOV AX,BX+8 MOV AX,8BX MOV AX,BX+8,基址变址寻址,操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值之和。指令中使用基址寄存器BX时,操作数默认存放在数据段中;使用基址寄存器BP时,操作数默认存放在堆栈段中,允许段超越。操作数的物理地址=(DS)10H+(SI)/(DI)+(BX)或=(SS)10H+(SI)/(DI)+(BP),例如:MOV AX,BX SI 该指令的源操作数采用基址变址寻址方式。若(DS)=2000H,(BX)=2008H,(SI)=8H,那么指令执行后,(AX)=1225H。,基址变址寻址方式的指令执行示意图,3.2.7 相对基址变址寻址,操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值以及8位或16位位移量之和。指令中使用基址寄存器BX时,操作数默认存放在数据段中;使用基址寄存器BP时,操作数默认存放在堆栈段中,允许段超越。操作数的物理地址=(DS)10H+(SI)/(DI)+(BX)+8位或16位位移量或=(SS)10H+(SI)/(DI)+(BP)+8位或16位位移量,例如:MOV AX,3BX SI 该指令的源操作数采用寄存器相对寻址方式。若(DS)=2000H,(BX)=2008H,(SI)=5H,那么指令执行后,(AX)=1225H。,相对基址变址寻址方式的指令执行示意图,3.3 8086指令系统,8086指令系统包括六大类指令:数据传送指令算术运算指令逻辑运算和移位指令串操作指令控制转移指令处理器控制指令,8086汇编指令中的操作数可以有零个、一个或两个,通常称为零地址、一地址或二地址指令。二地址指令中的两个操作数分别称为源操作数和目标操作数。,数据传送指令,数据传送指令是将数据或地址传送到寄存器、存储单元或I/O端口中。包括5类:通用数据传送指令;累加器专用传送指令;地址传送指令;标志传送指令;数据类型转换指令。,数据传送指令的共同特点,除了POPF和SAHF指令外,其他的数据传送指令的执行结果都不影响标志位。指令中如果列出两个操作数,则指令的执行过程是:目标操作数源操作数。指令中如果仅列出一个操作数,则另一个操作数为隐含操作数。,1.通用数据传送指令,1)传送指令格式:MOV 目标操作数,源操作数 功能:将源操作数的内容(一个字或一个字节)传送到目标操作数指定的寄存器或内存单元,源操作数内容不变。,MOV指令举例,MOV AL,5;字节传送,立即数送通用寄存器MOV AX,BX;字传送,通用寄存器送通用寄存器MOV DS,AX;字传送,通用寄存器送段寄存器,MOV指令的使用说明,源操作数可以是立即数、寄存器或内存操作数。目标操作数可以是寄存器或内存操作数。立即数和CS寄存器只能作为源操作数,不允许作为目标操作数。IP和PSW都不可作为源操作数或是目标操作数。立即数不允许直接传送至DS、ES或SS寄存器。源操作数和目标操作数不允许同时是内存操作数,也不允许同时是段寄存器。源操作数和目标操作数的类型必须相同,即同为字节类型或字类型。,1.通用数据传送指令(续),2)数据交换指令格式:XCHG 目标操作数,源操作数 功能:源操作数的内容(一个字或字节)与目标操作数的内容(一个字或字节)互换。例如:XCHG BL,AH;字节交换,寄存器与寄存器的内容交换XCHG AX,BXSI;字交换,寄存器与内存单元的内容交换,XCHG指令的使用说明,源操作数和目标操作数都可以是寄存器或内存操作数。源操作数和目标操作数不可同时是内存操作数。源操作数和目标操作数不可以同时是寄存器(累加器)AX。段寄存器、寄存器IP或立即数不可以作为源操作数或目标操作数。例如:XCHG AX,2011H;源操作数不能是立即数XCHG CS,5SI;CS不能作为操作数XCHG AX,AX;源操作数和目标操作数不可同是AX,【例3-1】若两个字数据分别存储在内存单元NUM1和NUM2中,编写汇编程序段将这两个内存单元的内容互换。汇编程序段如下:MOV AX,NUM1 XCHG AX,NUM2 MOV NUM1,AX,堆栈,堆栈是一块按照“后进先出”原则工作的内存区域。把数据从栈顶存入堆栈中的操作称为入栈(或压入);把数据通过栈顶从堆栈中取出的操作称为出栈(或弹出)。堆栈常被用于数据的暂存、交换、子程序的参数传递等场合。在调用子程序或转入中断服务程序时,堆栈是默认的被用于保存返回地址的内存区域。为了实现子程序或中断嵌套,也必须使用堆栈技术。,在8086系统中,堆栈所在的段就是堆栈段,它可以占用的最大空间是64KB。堆栈段的段地址由SS寄存器指示。堆栈指针寄存器SP始终指示栈顶的偏移地址并随着入栈和出栈操作而自动变化。当进行压入操作后堆栈指针达到定义值,表明堆栈满;当执行弹出操作后堆栈指针回到初值,表明堆栈空。当栈满时,再压入数据,称为“堆栈溢出”。,1.通用数据传送指令(续),3)堆栈操作指令8086指令系统中:堆栈操作指令中操作数的类型只能是字,不能是字节。立即数不能作为操作数。,进栈指令,格式:PUSH 源操作数功能:源操作数入栈。指令的执行如下操作:(SP)(SP)-2(SS:SP)源操作数 说明:源操作数可以是寄存器或是内存操作数。,出栈指令,格式:POP 目标操作数功能:数据出栈,存入目标操作数。指令的执行如下操作:目标操作数(SS:SP)(SP)(SP)+2 说明:目标操作数可以是段寄存器、16位寄存器或内存操作数。当目标操作数是段寄存器时,不能是CS寄存器。,【例3-2】,设(SS)=2011H,(SP)=0020H,依次执行下列汇编指令后,分析堆栈中的数据和寄存器AX、BX、SP的变化情况。MOV AX,0103HMOV BX,1228HPUSH AXPUSH BXPOP BX,2.累加器专用传送指令,(1)换码指令格式一:XLAT格式二:XLAT 表格首地址 功能:将内存表格中某一单元的值传送至寄存器AL,实现一种编码到另一种编码的转换。例如,把字符的扫描码转换成ASCII码。指令的执行如下操作:把数据段中偏移地址为BX+AL的内存单元的内容送到AL中,即:(AL)(BX+AL)。,XLAT指令使用说明,源操作数、目标操作数均隐含。该指令隐含说明:寄存器BX保存内存表格的首地址;寄存器AL保存表格中某单元在此表格中的偏移量。因此,在使用该指令之前,必须先初始化BX和AL这两个寄存器。该指令能访问的内存表格中的数据只能是字节类型的。该指令能访问的内存表格的最大容量是256字节。格式二中的表格首地址部分,只是为了提高程序的可读性而设置的。指令执行时,使用BX的值作为表格首地址。,XLAT指令用法举例,若(DS)=2000H,(BX)=0020H,(AL)=9H,则执行指令XLAT后,(AL)=39H。,(2)输入/输出指令(I/O指令),(1)输入指令格式一:IN AL,端口地址格式二:IN AX,端口地址格式三:IN AL,DX格式四:IN AX,DX功能:从指令中指定的I/O端口读入一字节数据到AL或一个字数据到AX。,(2)输出指令,格式一:OUT 端口地址,AL格式二:OUT 端口地址,AX格式三:OUT DX,AL格式四:OUT DX,AX功能:将AL或AX的内容输出到一个8位I/O端口或16位I/O端口。,IN/OUT指令的使用说明,采用格式一和格式二时,端口地址的取值范围是:0FFH,可以寻址256个I/O端口。当端口地址值超过255D时,只能采用格式三或格式四,把端口地址保存到寄存器DX中,此时,端口地址的取值范围是:0FFFFH,可以寻址65536个I/O端口。当端口是8位时,目标操作数选用AL寄存器;当端口是16位时,目标操作数选AX寄存器。,IN/OUT指令的使用举例,MOV DX,60H;端口地址送DX寄存器中IN AL,DX;从60H端口写入一个8位数OUT 90H,AX;将16位数输出到90H端口,3.地址传送指令,在汇编程序中,地址是一种特殊操作数,区别于一般数据操作数,它无符号,长度为16位。在8086系统中,有专门的指令进行地址传送。,(1)取有效地址指令LEA,格式:LEA r16,mem功能:取内存单元mem的有效地址,送到16位寄存器r16中,即:r16 EA(mem)。例如,设DS=2100H,BX=100H,SI=10H,(DS:110H)=1234H,则指令:LEA BX,BX+SI 执行后,(BX)=(BX)+(SI)=110H。,(2)地址指针装入DS指令LDS格式:LDS r16,m32功能:把内存中的32位源操作数中的低16位送到指定寄存器r16中,高16位送到段寄存器DS中。即:r16 m32低16位;DS m32高16位。(3)地址指针装入ES指令LES把上述指令中的DS换成ES,即成为LES指令。,4.标志传送指令,标志寄存器用于记载指令执行引起的状态变化及一些特殊控制位,以此作为控制程序执行的依据。标志寄存器是特殊寄存器,不能像一般数据寄存器那样随意操作,以免其中的值发生变化。,(1)取标志指令LAHF格式:LAHF该指令中的源操作数隐含为标志寄存器低8位,目标操作数隐含为AH。功能:把16位的标志寄存器低8位送寄存器AH。(2)置标志指令SAHF格式:SAHF该指令中的源操作数隐含为AH,目标操作数隐含为标志寄存器。功能:把寄存器AH中内容送至16位的标志寄存器低8位,此操作是LAHF的逆操作。,【例3-3】编写汇编程序段,把标志寄存器的CF位求反,其他位不变。LAHF;取标志寄存器的低8位XOR AH,01H;最低位求反,其他位不变SAHF;送入标志寄存器的低8位,(3)标志入栈指令PUSHF格式:PUSHF该指令中的源操作数隐含为标志寄存器,目标操作数隐含为堆栈区。功能:标志寄存器入栈。SP SP2;(SP+1,SP)FLAG。,(4)标志弹出指令POPF格式:POPF该指令中的源操作数隐含为堆栈区,目标操作数隐含为标志寄存器。功能:数据出栈到标志寄存器。FLAG(SP+1,SP);SP SP+2。此操作是LAHF的逆操作。SAHF和POPF指令直接改变标志寄存器的值。利用这一特性,可以非常方便地改变有关的标志位。,【例3-4】编写汇编程序段,把标志寄存器TF位清零,其他标志位不变。PUSHF;标志寄存器入栈POP AX;取标志寄存器内容AND AX,0FEFFH;TF清零,其他位不变PUSH AX;新值入栈POPF;送入标志寄存器,5.数据类型转换指令,(1)字节转换为字指令格式:CBW功能:把寄存器AL中数据的符号位扩到AH寄存器中,使字节转换为字。指令的执行如下操作:当AL80H时,AH00H;当AL80H时,AHFFH。说明:该指令中的源操作数隐含为寄存器AL,目标操作数隐含为寄存器AX。一个用补码表示的数经CBW指令进行符号位扩展后,数值大小不变。,(2)字转换为双字指令格式:CWD功能:把寄存器AX中数据的符号位扩到DX寄存器中,使字转换为双字。指令的执行如下操作:当AL8000H时,DX0000H;当AL8000H时,DXFFFFH。说明:该指令中的源操作数隐含为寄存器AX,目标操作数隐含为寄存器DX,AX。一个用补码表示的数经CWD指令进行符号位扩展后,数值大小不变。,例如:(1)MOV AL,75H CBW;执行结果为:AX=0075H(2)MOV AX,0A085H CWD;执行结果为:DX=0FFFFH,AX=0A085H,算术运算指令,算术运算指令用来执行算术运算,完成的操作有5种:加法、减法、乘法、除法和十进制调整。算术运算指令中的操作数有:一个或两个。双操作数指令中,除了源操作数是立即数这种情况外,其余情况下,必须有一个操作数在寄存器中。单操作数指令中的操作数不允许是立即数。所有的算术运算指令都遵守这个规则。,1.加法指令,(1)不带进位的加法指令格式:ADD dest,src功能:(dest)(dest)+(src)说明:源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。,例如:ADD CX,DIADD BP,CL ADD CL,TEMPADD BYTE PTR DI,3,(2)带进位的加法指令格式:ADC dest,src功能:(dest)(dest)+(src)+CF,用于多字节或多字加法运算。源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。例如:ADC CX,DI;CX CX+DI+CF,【例3-5】编写汇编程序段,计算11112222H+33334444H。MOV AX,2222HADD AX,4444HMOV BX,1111HADC BX,3333H,(3)加1指令格式:INC dest功能:(dest)(dest)+1说明:目标操作数可以是通用寄存器或存储器操作数。该指令执行后,影响标志:PF、AF、ZF、SF和OF。,2.减法指令,(1)不带进位减法指令格式:SUB dest,src功能:(dest)(dest)-(src)说明:源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。,例如:SUB AX,0CCCCH;AXAX-0CCCCHSUB DI,CH;由DI寻址的数据段字节单元;的值减去CH后,回存结果,(2)带进位减法指令格式:SBB dest,src功能:(dest)(dest)-(src)-CF,常用于多字节或多字减法运算。说明:源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。,例如:SUB AX,DI;(AX)(AX)-(DI)SBB BX,SI;(BX)(BX)-(SI)-CF,(3)减1指令格式:DEC dest功能:(dest)(dest)-1目标操作数可以是通用寄存器或存储器操作数。指令执行后,影响标志:PF、AF、ZF、SF和OF。例如:MOV AL,0DEC AL;AL=0FFH,OF=1,SF=1,ZF=0,AF=1,PF=1,CF=1DEC NUM;由定义NUM的方法来确定这是字节减1还是字减1,CPU运算时统一使用补码运算规则。加、减运算指令中,不区分符号数与无符号数,即符号数与无符号数使用相同的加、减指令。实际应用中,操作数是符号数还是无符号数,由编程人员看问题的视角来定。相同的编码,不同的视角,值不同,对运算结果的溢出判断标准也不同。将操作数看作符号数时,若OF=1,则结果溢出;若OF=0,则结果不溢出。将操作数看作无符号数时,若CF=1,则结果溢出;若CF=0,则结果不溢出。,(4)比较指令格式:CMP dest,src功能:(dest)-(src)源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。指令执行后,影响:CF、PF、AF、ZF、SF和OF。CMP指令通过减操作(dest)-(src),对标志寄存器的标志产生影响,不保留结果。后续指令可以通过标志值,来判别目标操作数与源操作数之间的大小关系。,例如:CMP AL,0;(AL)-0由于无符号数与符号数表示规则不同(符号数的最高位为符号位,无符号数各位均为数字位),使得无符号数与符号数大小判定依据不同。,无符号数相减,不可能有溢出,与大小相关的标志位是:ZF与CF。符号数相减,不仅考虑正、负,并且可能存在溢出,与大小相关的标志位有:SF、ZF和OF。符号数A减去符号数B时,不发生溢出(OF=1)时,如果SF=0,则AB;如果SF=1,则AB;如果SF=0,则AB。,(5)求补指令格式:NEG dest功能:(dest)0-(dest)该指令执行后,把操作数按位求反,末位加1后送回操作数。目标操作数可以是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。若操作数是-128D或-32768D,则OF=1。若操作数是非0值,则CF=1;若操作数是0,则CF=0。,例如:MOV DL,0111 1000B;DL=120DNEG DL;DL=0-0111 1000=1000 1000B=-120D,3.乘法指令,8086/8088可完成字节与字节乘、字与字乘。指令中给出乘数,被乘数隐含。乘数可以是寄存器或内存操作数,不能为立即数。字节乘时,乘积的高8位存于寄存器AH中,低8位存于寄存器AL中。字乘时,被乘数隐含为寄存器AX,乘积的高16位存于寄存器DX中,低16位存于寄存器AX中。,(1)无符号数乘法指令格式:MUL src功能:当src为字节时,AX AL src;当src为字时,(DX,AX)AX src说明:乘法指令仅影响标志位OF,CF,对其他标志位无意义。字节乘时,如果AH=0,则 OF=CF=0;如果AH 0,OF=CF=1。字乘时,如果DX=0,则 OF=CF=0;DX 0,OF=CF=1。,例如:MUL WORD PTR SI;无符号乘法,AX乘以由SI寻址的数据段存储单元的字内容,积在DX-AX中,(2)符号乘法指令格式:IMUL src功能:当src为字节时,AX AL src;当src为字时,(DX,AX)AX src说明:乘法指令仅影响标志位OF,CF,对其他标志位无意义。符号数乘时,当积的高8位(字节乘)或积的高16位(字乘)是低字节(字节乘)或低字(字乘)的符号扩展时,OF=CF=0;否则,OF=CF=1。,例如:IMUL CL;符号乘法,AL乘以CL,积在AX中,【例3-6】编写汇编程序段,计算20H0FFH。解(1)将两数看成无符号数,即32D255D=8160D。MOV AL,20H;AL=20H=32DMOV BL,0FFH;BL=0FFH=255DMUL BL;AX=1FE0H=8160D,OF=CF=1,(2)将两数看成符号数,即32D(-1D)=-32DMOV AL,20H;AL=20H=32DMOV BL,0FFH;BL=0FFH=-1DIMUL BL;AX=FFE0H=-32D,OF=0,CF=0,4.除法指令,8086/8088可完成除数为字节和除数为字的两种除法。指令中给出除数,被除数隐含。除数可以是寄存器或内存操作数,不能为立即数。除数为字节时,被除数必须为16位,隐含为寄存器AX,商存于寄存器AL中,余数存于寄存器AH中;除数为字时,被除数必须为32位,隐含为寄存器DX,AX,商存于寄存器AX中,余数存于寄存器DX中。,除法指令说明,所有标志位在除法运算无溢出时没有意义。除法“溢出”,是指除数为字节时,商大于0FFH或除数为字时,商大于0FFFFH。当发生除法溢出时,OF=1,并产生0型中断(溢出中断)。,(1)无符号除法指令格式:DIV src功能:当src为字节时,ALAX(src)的商,AHAX(src)的余数;当src为字时,AXDX AX(src)的商,DXDX AX(src)的余数。说明:src可以为寄存器或内存操作数。例如:DIV BYTE PTR BP;ALAX(SS:BP)的商,AHAX(SS:BP)的余数,(2)符号除法指令格式:IDIV src功能:当src为字节时,ALAX(src)的商,AHAX(src)的余数;当src为字时,AXDX AX(src)的商,DXDX AX(src)的余数。src可以为寄存器或内存操作数。符号数除法中,商的符号遵循除法法则,余数的符号与被除数一致。例如:IDIV BL;ALAX(BL)的有符号商,AHAX(BL)的余数,【例3-7】编写汇编程序段,计算:(V-(X*Y+Z-100)/X。已知:X、Y、Z、V均为16位符号数,已分别装入X、Y、Z、V单元中,要求将上式计算结果的商存入AX,余数存入DX。,MOV AX,X;取被乘数XIMUL Y;X*Y,结果在DX、AX中MOV CX,AX;将乘积存在BX、CX中MOV BX,DX MOV AX,Z;取被加数ZCWD;将符号扩展后的Z加到BX、CX中的乘积上ADD CX,AX,ADC BX,DX SUB CX,100 SBB BX,0;从BX、CX中减去100MOV AX,V CWD SUB AX,CX;从符号扩展后的V中减去(BX、CX)SBB DX,BX;并除以X,商在AX中,余数在DX中IDIV X,5.十进制调整指令,(1)压缩BCD码的加法调整指令格式:DAA功能:若AL的低4位9或AF=1,则进行(AL)(AL)+06H修正,同时AF置1。若AL的高4位9或CF=1,则进行(AL)(AL)+60H修正,同时CF置1。说明:目标操作数隐含为寄存器AL。DAA指令紧跟在加法指令之后用。指令执行后,影响CF、PF、AF、ZF、SF,对OF无意义。,【例3-8】编写汇编程序段,用压缩BCD码编码并计算12D+28D。MOV AL,12HADD AL,28H;AL=3AH,AF=1,CF=0DAA;AL=40H,(2)压缩BCD数减法调整指令格式:DAS功能:若AL的低4位9或AF=1,则进行(AL)(AL)-06H修正,同时AF置1。若AL的高4位9或CF=1,则进行(AL)(AL)-60H修正,同时CF置1。说明:目标操作数隐含为寄存器AL。DAS指令紧跟在减法指令之后用。该指令执行后,影响标志:CF、PF、AF、ZF、SF,对OF无意义。,【例3-9】编写汇编程序段,用压缩BCD码编码并计算37D-19D。MOV AL,37HSUB AL,19H;AL=1EH,AF=1,CF=0DAS;AL=18H,AF=1,(3)非压缩的BCD码的加法调整指令(ASCII码的加法调整指令)非压缩的BCD码用8个二进制位表示1位十进制数,通常只用低4位,高4位置0。数字09的ASCII码为30H39H,其低4位的编码与BCD编码一致,所以又把非压缩的BCD码调整称为ASCII码调整。格式:AAA,AAA指令的功能,若AL中低4位9或AF=1,则进行(AL)(AL)+06H修正,同时,(AH)(AH)+1,AF置1。清除AL寄存器的高4位。AF值送CF。,AAA指令的使用说明,目标操作数隐含为寄存器AH和AL。AAA指令紧跟在加法指令之后用。该指令执行后,影响标志:CF、AF,对PF、OF、ZF和SF的影响不确定。,【例3-10】编写汇编程序段,用非压缩BCD码编码并计算7+9。MOV AL,7;AL=37HADD AL,9;AL=70H,AF=1,CF=0AAA;AL=06H,CF=AF=1,(4)非压缩的BCD码的减法调整指令(ASCII码的减法调整指令)格式:AAS功能:如果AL中低4位小于9且AF=0,由跳过;如果AL中低4位大于9或AF=1(即低4位向高4位有借位),减6调整,且AF置1;清除AL寄存器的高4位;AF值送CF。,AAS指令的使用说明,目标操作数隐含为寄存器AH和AL。AAS指令紧跟在减法指令之后用。该指令执行后,影响标志:CF、AF,对PF、OF、ZF和SF的影响不确定。,【例3-11】编写汇编程序段,用非压缩BCD码编码并计算17-9。MOV AL,7H;AL=07HMOV AH,1H;AH=1HSUB AL,9H;AL=0FEH,AF=1,CF=1AAS;AL=8H,CF=AF=1,AH=0,(5)非压缩的BCD码的乘法调整指令(ASCII码的乘法调整指令)格式:AAM功能:把AL寄存器的内容除以10,商放在AH寄存器中,余数保存在AL寄存器中,用于MUL之后,把AL中的乘积调整成非压缩的BCD码,结果存于寄存器AX中。说明:目标操作数隐含为寄存器AH和AL。AAM指令紧跟在MUL指令之后用。该指令执行后,影响标志:PF、ZF和SF,对CF、AF和OF的影响不确定。,【例3-12】编写汇编程序,用非压缩BCD码编码并计算93。MOV AL,9H;AL=0000 1001BMOV BL,3H;BL=0000 0011BMUL BL;AH=0,AL=00011011B=27DAAM;AH=02H,AL=07H(因为2710=27),(6)非压缩的BCD码的除法调整指令(ASCII码的除法调整指令)格式:AAD功能:将AH寄存器的内容乘以10后加上AL的内容,结果回送AL,同时将AH清0。,AAD指令使用说明,被除数是2位十进制数,存于寄存器AX中,AH中为十位上的数,AL中为个位上的数,除数是1位十进制数。该指令用在DIV之前对被除数进行调整,然后,用DIV指令做除法,所得之商还要用AAM指令进行调整后,才可以得到正确的非压缩BCD结果。该指令执行后,影响标志:PF、ZF和SF,对CF、AF和OF的影响不确定。,【例3-13】编写汇编程序段,用非压缩BCD码编码并计算732。MOV AX,0703HMOV BL,02HAAD;(AL)=49H,(AH)=0DIV BL;(AL)=24H(商),(AH)=01H(余数)AAM;(AL)=03H,(AH)=06H,位运算指令,位运算指令分为:逻辑运算指令移位指令循环移位指令,1.逻辑运算指令,逻辑非(NOT)逻辑与(AND)逻辑测试(TEST)逻辑或(OR)逻辑异或(XOR)指令这些逻辑运算指令的操作数可以是8位、16位,运算按位进行。对操作数的规定与MOV指令相同。,(1)逻辑非指令格式:NOT dest功能:(dest)(dest)说明:不影响标志位。,(2)逻辑与指令格式:AND dest,src功能:(dest)(dest)(src)说明:对标志位的影响是:CF、OF清零;影响SF、ZF、PF;AF的值不定。,(3)逻辑测试指令格式:TEST dest,src功能:(dest)(src)说明:执行相与操作,以便影响标志位,但不保留结果。对标志位的影响是:CF、OF清零;影响SF、ZF、PF;AF的值不定。,(4)逻辑或指令格式:OR dest,src功能:(dest)(dest)(src)说明:对标志位的影响是:CF、OF清零;影响SF、ZF、PF;AF的值不定。,(5)逻辑异或指令格式:XOR dest,src功能:(dest)(dest)(src)说明:对标志位的影响是:CF、OF清零;影响SF、ZF、PF;AF的值不定。,例如:AND AL,BL;ALALBLXOR AX,DIOR BX,0FF02H;(BX)(BX)FF02HNOT BYTE PTR BX;字节内容求反TEST AH,4;AH4,AH不变,只改变标志,【例3-14】编写汇编程序段,把数字8,变成字符“8”。MOV AL,8HOR AL,30H;AL=38H=8【例4-15】编写汇编程序段,从端口80H读取一字节,将其D1位求反后,从80H送出。IN AL,80HXOR AL,00000010BOUT 80H,AL,【例3-16】编写汇编程序段,将寄存器AX清零。XOR AX,AX还有哪些可以将AX清零的指令?比较之。,2.移位指令,移位指令可以对寄存器或存储单元的内容按字节或字进行操作。,(1)逻辑左移指令格式:SHL dest,CNT功能:目标操作数左移CNT次,最低位补0,最高位移至标志位CF中。说明:CNT代表移动次数。当CNT 1时,必须由寄存器CL说明。CF、ZF、SF、PF的值由运算结果定。CNT=1时,若移位后符号位发生变化,则标志位OF=1,否则OF=0。CNT 1时,对OF无定义。,(2)逻辑右移指令格式:SHR dest,CNT功能:目标操作数右移CNT次,最低位移至标志位CF中,最高位补0。说明:CNT代表移动次数。当CNT 1时,必须由寄存器CL说明。CF、ZF、SF、PF的值由运算结果定。CNT=1时,若移位后符号位发生变化,则标志位OF=1,否则OF=0。CNT 1时,对OF无定义。,(3)算术左移指令格式:SAL dest,CNT功能:目标操作数左移CNT次,最低位补0,最高位移至标志位CF中。说明:CNT代表移动次数。当CNT 1时,必须由寄存器CL说明。CF、ZF、SF、PF的值由运算结果定。CNT=1时,若移位后符号位发生变化,则标志位OF=1,否则OF=0。CNT 1时,对OF无定义。,(4)算术右移指令格式:SAR dest,CNT功能:目标操作数右移CNT次,最低位移至标志位CF中,最高位不变。说明:CNT代表移动次数。当CNT 1时,必须由寄存器CL说明。CF、ZF、SF、PF的值由运算结果定。CNT=1时,若移位后符号位发生变化,则标志位OF=1,否则OF=0。CNT 1时,对OF无定义。,例如,分别给出下列移位指令执行结果。设AL=0B4H=10110100B,CF=1,CL=4。SAL AL,1;AL=01101000B,CF=1,OF=1SAR AL,1;AL=11011010B,CF=0,OF=0SHL AL,1;AL=01101000B,CF=1,OF=1SHR AL,CL;AL=00001011B,CF=0,OF无定义,移位指令的使用说明,这组指令除了可以实现基本的移位操作外,还可以用于实现数倍增(左移)或倍减(右移),使用这种方法比直接使用乘、除法效率要高得多。在不溢出的情况下,可用逻辑移位指令实现无符号数的乘、除,算术移位指令实现符号数的乘、除。,【例3-17】设无符号数X在寄存器AL中,用移位指令实现X*10的运算。MOV AH,0SAL AX,1;AX数X*2MOV BX,AXMOV CL,2SAL AX,CL;AX数X*8ADD AX,BX;AX数X*10,3.循环移位指令,(1)不带进位位循环左移指令格式:ROL dest,CNT功能:目标操作数循环左移CNT次,最高位移至最低位的同时移至标志位CF中。说明:CNT