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

下载本文档

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

文档简介

寻址方式和指令系统本章主要内容概述1

8086寻址方式2

8086指令系统33.1概述指令是指挥计算机进行操作的命令。指令系统是指微处理器能执行的各种指令的集合。程序是一系列按一定顺序排列的指令。执行程序的过程就是计算机的工作过程。微处理器的主要功能由它的指令系统来体现。不同的微处理器有不同的指令系统,其中每一条指令对应着处理器的一种基本操作,这在设计微处理器时确定。

通常一条指令包括两部分:操作码:决定要完成的操作操作数:指参加运算的数据或是该数所在的内存单元的地址。指令的一般格式如下:操作码[操作数1,操作数2,……,操作数n]没有操作数的指令称为无操作数指令。有两个操作数的指令称为双操作数或二地址指令。操作码和操作数地址都由二进制数码表示,整条指令以二进制编码的形式存放在存储器中。指令系统与寻址方式的重要性采用不同CPU的计算机的指令系统不同。采用不同CPU的计算机的指令的格式不同。采用不同CPU的计算机的各指令允许的寻址方式不同。要使用某种微处理器,必须先要掌握其指令系统和各指令允许的寻址方式。3.28086寻址方式寻址方式:指令中给出的求出操作数有效地址的方法。寻址操作:计算机按照指令给出的寻址方式求出操作数有效地址的过程。808的七种基本的数据寻址方式(1)立即寻址;(2)寄存器寻址;(3)直接寻址;(4)寄存器间接寻址;(5)寄存器相对寻址;(6)基址变址寻址;(7)相对基址变址寻址。存储器寻址方式3.2.1立即寻址操作数直接出现在指令中,此时的操作数也叫立即数。立即数紧跟在操作码后面,一起存放在代码段中。例如:MOVAX,2010H在该指令格式中,AX是目标操作数,2010H是源操作数。立即寻址方式的指令执行示意图立即寻址方式说明在所有的指令中,立即数只能作源操作数,不能作目标操作数。立即数应与目标操作数的长度一致。立即数默认采用十进制形式,以十六进制形式出现的立即数应以字母H为后缀,以八进制形式出现的立即数应以字母Q为后缀。以十六进制形式出现的立即数,若以字母开头,则必须以数字0为前缀。立即数还可以用表示+、-、×、/表示的算术表达式,也可以用圆括号改变运算顺序。立即数只能是整数,不能是小数、变量或其它类型的数据。3.2.2寄存器寻址操作数在寄存器中,在指令中指定寄存器号。由于寄存器号短,因此,采用寄存器寻址方式的指令的机器码长度短。操作数在寄存器中,指令执行时,操作就在CPU的内部进行,不需要通过访问存储器来取得操作数,因而指令的执行速度快。在编程中,如有可能,应尽量在指令中使用这种寻址方式。例如:MOVAX,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。为了与立即数区别,该有效地址必须用[]括起。例如:MOVAX,[2010H]该指令的源操作数采用直接寻址方式。若(DS)=2000H,那么指令执行后,(AX)=1225H。直接寻址方式指令执行示意图采用直接寻址方式时,如果指令中没有用前缀说明操作数存放在哪个段,则操作数默认存放在数据段。8086系统允许操作数存放在代码段、堆栈段或附加段。此时,就需要在指令中指明段超越。例如:MOVES:[1225H],AX该指令的目标操作数采用直接寻址方式。操作数存放在由ES指示的附加段中。物理地址=ES×10H+1225H。在汇编语言指令中,可以用符号地址代替数值地址。例如:MOVAX,NUMA此时,NUMA是存放操作数的内存单元的符号地址。上面这条指令还可以写成如下的形式:MOVAX,[NUMA]如DATA1数据存放在附加段,则可以用如下的形式指定段跨越前缀:MOVAX,ES:NUMA或MOVAX,ES:[NUMA]3.2.4寄存器间接寻址操作数的有效地址EA存放在基址寄存器BX、BP或变址寄存器SI、DI中。为了区别于寄存器寻址方式,指令中指定的寄存器名要用[]括起来。指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。操作数的物理地址=(DS)×10H+(SI)/(DI)/(BX)或(SS)×10H+(BP)例如:MOVAX,[SI]该指令的源操作数采用寄存器间接寻址方式。若(DS)=2000H,(SI)=2010H,那么指令执行后,(AX)=1225H。如操作数不存放在间址寄存器默认的段,则指定段超越的指令可采用如下形式。MOVAX,ES:[SI]

此时,操作数的物理地址=ES×10H+SI。寄存器间接寻址方式指令执行示意图3.2.5寄存器相对寻址操作数的有效地址EA是指令中指定的基址或变址寄存器的值与位移量之和。指令中使用SI、DI、BX寄存器时,操作数默认存放在数据段中;使用BP寄存器时,操作数默认存放在堆栈段中,允许段超越。操作数的物理地址=(DS)×10H+(SI)/(DI)/(BX)+8位或16位位移量

=(SS)×10H+(BP)+8位或16位位移量例如:MOVAX,8[BX]该指令的源操作数采用寄存器相对寻址方式。若(DS)=2000H,(BX)=2008H,那么指令执行后,(AX)=1225H。寄存器相对寻址方式的指令执行示意图寄存器相对寻址说明偏移量是符号数,8位偏移量的取值范围为:00~0FFH(即+127D~-128D);16位偏移量的取值范围为:0000~0FFFFH(即+32767D~-32768D)。8086汇编允许用下面三种形式表示相对寻址,它们是等效的。MOVAX,[BX]+8MOVAX,8[BX]MOVAX,[BX+8]基址变址寻址操作数的有效地址EA是指令中指定的基址寄存器的值与变址寄存器的值之和。指令中使用基址寄存器BX时,操作数默认存放在数据段中;使用基址寄存器BP时,操作数默认存放在堆栈段中,允许段超越。操作数的物理地址=(DS)×10H+(SI)/(DI)+(BX)或

=(SS)×10H+(SI)/(DI)+(BP)例如:MOVAX,[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位位移量例如:MOVAX,3[BX][SI]该指令的源操作数采用寄存器相对寻址方式。若(DS)=2000H,(BX)=2008H,(SI)=5H,那么指令执行后,(AX)=1225H。相对基址变址寻址方式的指令执行示意图3.38086指令系统8086指令系统包括六大类指令:数据传送指令算术运算指令逻辑运算和移位指令串操作指令控制转移指令处理器控制指令8086汇编指令中的操作数可以有零个、一个或两个,通常称为零地址、一地址或二地址指令。二地址指令中的两个操作数分别称为源操作数和目标操作数。数据传送指令数据传送指令是将数据或地址传送到寄存器、存储单元或I/O端口中。包括5类:通用数据传送指令;累加器专用传送指令;地址传送指令;标志传送指令;数据类型转换指令。数据传送指令的共同特点除了POPF和SAHF指令外,其他的数据传送指令的执行结果都不影响标志位。指令中如果列出两个操作数,则指令的执行过程是:目标操作数←源操作数。指令中如果仅列出一个操作数,则另一个操作数为隐含操作数。1.通用数据传送指令1)传送指令格式:MOV目标操作数,源操作数

功能:将源操作数的内容(一个字或一个字节)传送到目标操作数指定的寄存器或内存单元,源操作数内容不变。MOV指令举例MOVAL,5;字节传送,立即数送通用寄存器MOVAX,BX;字传送,通用寄存器送通用寄存器MOVDS,AX ;字传送,通用寄存器送段寄存器MOV指令的使用说明源操作数可以是立即数、寄存器或内存操作数。目标操作数可以是寄存器或内存操作数。立即数和CS寄存器只能作为源操作数,不允许作为目标操作数。IP和PSW都不可作为源操作数或是目标操作数。立即数不允许直接传送至DS、ES或SS寄存器。源操作数和目标操作数不允许同时是内存操作数,也不允许同时是段寄存器。源操作数和目标操作数的类型必须相同,即同为字节类型或字类型。1.通用数据传送指令(续)2)数据交换指令格式:XCHG 目标操作数,源操作数

功能:源操作数的内容(一个字或字节)与目标操作数的内容(一个字或字节)互换。例如:XCHGBL,AH

;字节交换,寄存器与寄存器的内容交换XCHGAX,[BX][SI]

;字交换,寄存器与内存单元的内容交换XCHG指令的使用说明源操作数和目标操作数都可以是寄存器或内存操作数。源操作数和目标操作数不可同时是内存操作数。源操作数和目标操作数不可以同时是寄存器(累加器)AX。段寄存器、寄存器IP或立即数不可以作为源操作数或目标操作数。例如:XCHGAX,2011H;╳源操作数不能是立即数XCHGCS,5[SI];╳CS不能作为操作数XCHGAX,AX

;╳源操作数和目标操作数不可同是AX【例3-1】若两个字数据分别存储在内存单元NUM1和NUM2中,编写汇编程序段将这两个内存单元的内容互换。汇编程序段如下:MOVAX,NUM1XCHGAX,NUM2MOVNUM1,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的变化情况。MOVAX,0103HMOVBX,1228HPUSHAXPUSHBXPOPBX2.累加器专用传送指令(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)输入指令格式一:INAL,端口地址格式二:INAX,端口地址格式三:INAL,DX格式四:INAX,DX功能:从指令中指定的I/O端口读入一字节数据到AL或一个字数据到AX。(2)输出指令格式一:OUT端口地址,AL格式二:OUT端口地址,AX格式三:OUTDX,AL格式四:OUTDX,AX功能:将AL或AX的内容输出到一个8位I/O端口或16位I/O端口。IN/OUT指令的使用说明采用格式一和格式二时,端口地址的取值范围是:0~FFH,可以寻址256个I/O端口。当端口地址值超过255D时,只能采用格式三或格式四,把端口地址保存到寄存器DX中,此时,端口地址的取值范围是:0~FFFFH,可以寻址65536个I/O端口。当端口是8位时,目标操作数选用AL寄存器;当端口是16位时,目标操作数选AX寄存器。IN/OUT指令的使用举例MOVDX,60H ;端口地址送DX寄存器中INAL,DX ;从60H端口写入一个8位数OUT90H,AX ;将16位数输出到90H端口3.地址传送指令在汇编程序中,地址是一种特殊操作数,区别于一般数据操作数,它无符号,长度为16位。在8086系统中,有专门的指令进行地址传送。(1)取有效地址指令LEA格式:LEAr16,mem功能:取内存单元mem的有效地址,送到16位寄存器r16中,即:r16←EA(mem)。例如,设DS=2100H,BX=100H,SI=10H,(DS:110H)=1234H,则指令:LEABX,[BX+SI]执行后,(BX)=(BX)+(SI)=110H。(2)地址指针装入DS指令LDS格式:LDSr16,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位XORAH,01H ;最低位求反,其他位不变SAHF ;送入标志寄存器的低8位(3)标志入栈指令PUSHF格式:PUSHF该指令中的源操作数隐含为标志寄存器,目标操作数隐含为堆栈区。功能:标志寄存器入栈。①SP←SP–2;

②(SP+1,SP)←FLAG。(4)标志弹出指令POPF格式:POPF该指令中的源操作数隐含为堆栈区,目标操作数隐含为标志寄存器。功能:数据出栈到标志寄存器。①FLAG←(SP+1,SP);

②SP←SP+2。此操作是LAHF的逆操作。SAHF和POPF指令直接改变标志寄存器的值。利用这一特性,可以非常方便地改变有关的标志位。【例3-4】

编写汇编程序段,把标志寄存器TF位清零,其他标志位不变。PUSHF ;标志寄存器入栈POPAX ;取标志寄存器内容ANDAX,0FEFFH ;TF清零,其他位不变PUSHAX ;新值入栈POPF ;送入标志寄存器5.数据类型转换指令(1)字节转换为字指令格式:CBW功能:把寄存器AL中数据的符号位扩到AH寄存器中,使字节转换为字。指令的执行如下操作:当AL<80H时,AH←00H;当AL≥80H时,AH←FFH。说明:该指令中的源操作数隐含为寄存器AL,目标操作数隐含为寄存器AX。一个用补码表示的数经CBW指令进行符号位扩展后,数值大小不变。(2)字转换为双字指令格式:CWD功能:把寄存器AX中数据的符号位扩到DX寄存器中,使字转换为双字。指令的执行如下操作:当AL<8000H时,DX←0000H;当AL≥8000H时,DX←FFFFH。说明:该指令中的源操作数隐含为寄存器AX,目标操作数隐含为寄存器DX,AX。一个用补码表示的数经CWD指令进行符号位扩展后,数值大小不变。例如:(1)MOVAL,75H

CBW ;执行结果为:AX=0075H(2)MOVAX,0A085H

CWD ;执行结果为:DX=0FFFFH,AX=0A085H算术运算指令算术运算指令用来执行算术运算,完成的操作有5种:加法、减法、乘法、除法和十进制调整。算术运算指令中的操作数有:一个或两个。双操作数指令中,除了源操作数是立即数这种情况外,其余情况下,必须有一个操作数在寄存器中。单操作数指令中的操作数不允许是立即数。所有的算术运算指令都遵守这个规则。1.加法指令(1)不带进位的加法指令格式:ADDdest,src功能:(dest)←(dest)+(src) 说明:源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。例如:ADDCX,DIADD[BP],CLADDCL,TEMPADDBYTEPTR[DI],3

(2)带进位的加法指令格式:ADCdest,src功能:(dest)←(dest)+(src)+CF,用于多字节或多字加法运算。源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。例如:ADCCX,DI ;CX←CX+DI+CF【例3-5】

编写汇编程序段,计算11112222H+33334444H。MOVAX,2222HADDAX,4444HMOVBX,1111HADCBX,3333H(3)加1指令格式:INCdest功能:(dest)←(dest)+1 说明:目标操作数可以是通用寄存器或存储器操作数。该指令执行后,影响标志:PF、AF、ZF、SF和OF。2.减法指令(1)不带进位减法指令格式:SUBdest,src功能:(dest)←(dest)-(src)说明:源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。例如:SUBAX,0CCCCH ;AX←AX-0CCCCHSUB[DI],CH ;由DI寻址的数据段字节单元;的值减去CH后,回存结果(2)带进位减法指令格式:SBBdest,src功能:(dest)←(dest)-(src)-CF,常用于多字节或多字减法运算。说明:源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。例如:SUBAX,DI ;(AX)←(AX)-(DI)SBBBX,SI ;(BX)←(BX)-(SI)-CF(3)减1指令格式:DECdest功能:(dest)←(dest)-1 目标操作数可以是通用寄存器或存储器操作数。指令执行后,影响标志:PF、AF、ZF、SF和OF。例如:MOVAL,0DECAL ;AL=0FFH,OF=1,SF=1,ZF=0,AF=1,PF=1,CF=1DECNUM ;由定义NUM的方法来确定这是字节减1还是字减1CPU运算时统一使用补码运算规则。加、减运算指令中,不区分符号数与无符号数,即符号数与无符号数使用相同的加、减指令。实际应用中,操作数是符号数还是无符号数,由编程人员看问题的视角来定。相同的编码,不同的视角,值不同,对运算结果的溢出判断标准也不同。将操作数看作符号数时,若OF=1,则结果溢出;若OF=0,则结果不溢出。将操作数看作无符号数时,若CF=1,则结果溢出;若CF=0,则结果不溢出。(4)比较指令格式:CMPdest,src功能:(dest)-(src)源操作数可以是立即数、通用寄存器或存储器操作数,目标操作数只能是通用寄存器或存储器操作数。指令执行后,影响:CF、PF、AF、ZF、SF和OF。CMP指令通过减操作(dest)-(src),对标志寄存器的标志产生影响,不保留结果。后续指令可以通过标志值,来判别目标操作数与源操作数之间的大小关系。例如:CMPAL,0 ;(AL)-0由于无符号数与符号数表示规则不同(符号数的最高位为符号位,无符号数各位均为数字位),使得无符号数与符号数大小判定依据不同。无符号数相减,不可能有溢出,与大小相关的标志位是:ZF与CF。符号数相减,不仅考虑正、负,并且可能存在溢出,与大小相关的标志位有:SF、ZF和OF。符号数A减去符号数B时,不发生溢出(OF=1)时,如果SF=0,则A>B;如果SF=1,则A<B。发生溢出(OF=1)时,如果SF=1,则A>B;如果SF=0,则A<B。(5)求补指令格式:NEGdest 功能:(dest)←0-(dest) 该指令执行后,把操作数按位求反,末位加1后送回操作数。目标操作数可以是通用寄存器或存储器操作数。该指令执行后,影响标志:CF、PF、AF、ZF、SF和OF。若操作数是-128D或-32768D,则OF=1。若操作数是非0值,则CF=1;若操作数是0,则CF=0。例如:MOVDL,01111000B ;DL=120DNEGDL;DL=0-0111

1000=1000

1000B=-120D3.乘法指令8086/8088可完成字节与字节乘、字与字乘。指令中给出乘数,被乘数隐含。乘数可以是寄存器或内存操作数,不能为立即数。字节乘时,乘积的高8位存于寄存器AH中,低8位存于寄存器AL中。字乘时,被乘数隐含为寄存器AX,乘积的高16位存于寄存器DX中,低16位存于寄存器AX中。(1)无符号数乘法指令格式:MULsrc功能:当src为字节时,AX←ALsrc;当src为字时,(DX,AX)←AXsrc说明:乘法指令仅影响标志位OF,CF,对其他标志位无意义。字节乘时,如果AH=0,则OF=CF=0;如果AH0,OF=CF=1。字乘时,如果DX=0,则OF=CF=0;DX0,OF=CF=1。例如:MULWORDPTR[SI];无符号乘法,AX乘以由SI寻址的数据段存储单元的字内容,积在DX-AX中(2)符号乘法指令格式:IMULsrc 功能:当src为字节时,AX←ALsrc;当src为字时,(DX,AX)←AXsrc说明:乘法指令仅影响标志位OF,CF,对其他标志位无意义。符号数乘时,当积的高8位(字节乘)或积的高16位(字乘)是低字节(字节乘)或低字(字乘)的符号扩展时,OF=CF=0;否则,OF=CF=1。例如:IMULCL ;符号乘法,AL乘以CL,积在AX中【例3-6】编写汇编程序段,计算20H0FFH。解(1)将两数看成无符号数,即32D255D=8160D。MOVAL,20H ;AL=20H=32DMOVBL,0FFH ;BL=0FFH=255DMULBL ;AX=1FE0H=8160D,OF=CF=1(2)将两数看成符号数,即32D(-1D)=-32DMOVAL,20H;AL=20H=32DMOVBL,0FFH;BL=0FFH=-1DIMULBL ;AX=FFE0H=-32D,OF=0,CF=04.除法指令8086/8088可完成除数为字节和除数为字的两种除法。指令中给出除数,被除数隐含。除数可以是寄存器或内存操作数,不能为立即数。除数为字节时,被除数必须为16位,隐含为寄存器AX,商存于寄存器AL中,余数存于寄存器AH中;除数为字时,被除数必须为32位,隐含为寄存器DX,AX,商存于寄存器AX中,余数存于寄存器DX中。除法指令说明所有标志位在除法运算无溢出时没有意义。除法“溢出”,是指除数为字节时,商大于0FFH或除数为字时,商大于0FFFFH。当发生除法溢出时,OF=1,并产生0型中断(溢出中断)。(1)无符号除法指令格式:DIVsrc功能:当src为字节时,AL←AX(src)的商,AH←AX(src)的余数;当src为字时,AX←DXAX(src)的商,DX←DXAX(src)的余数。说明:src可以为寄存器或内存操作数。例如:DIVBYTEPTR[BP];AL←AX(SS:BP)的商,AH←AX(SS:BP)的余数(2)符号除法指令格式:IDIVsrc功能:当src为字节时,AL←AX(src)的商,AH←AX(src)的余数;当src为字时,AX←DXAX(src)的商,DX←DXAX(src)的余数。

src可以为寄存器或内存操作数。符号数除法中,商的符号遵循除法法则,余数的符号与被除数一致。例如:IDIVBL;AL←AX(BL)的有符号商,AH←AX(BL)的余数【例3-7】

编写汇编程序段,计算:(V-(X*Y+Z-100)/X。已知:X、Y、Z、V均为16位符号数,已分别装入X、Y、Z、V单元中,要求将上式计算结果的商存入AX,余数存入DX。MOVAX,X ;取被乘数XIMULY ;X*Y,结果在DX、AX中MOVCX,AX ;将乘积存在BX、CX中MOVBX,DXMOVAX,Z ;取被加数ZCWD;将符号扩展后的Z加到BX、CX中的乘积上ADDCX,AXADCBX,DXSUBCX,100SBBBX,0 ;从BX、CX中减去100MOVAX,VCWDSUBAX,CX;从符号扩展后的V中减去(BX、CX)SBBDX,BX;并除以X,商在AX中,余数在DX中IDIVX5.十进制调整指令(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。MOVAL,12HADDAL,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。MOVAL,37HSUBAL,19H ;AL=1EH,AF=1,CF=0DAS ;AL=18H,AF=1(3)非压缩的BCD码的加法调整指令(ASCII码的加法调整指令)非压缩的BCD码用8个二进制位表示1位十进制数,通常只用低4位,高4位置0。数字0~9的ASCII码为30H~39H,其低4位的编码与BCD编码一致,所以又把非压缩的BCD码调整称为ASCII码调整。格式:AAAAAA指令的功能①若AL中低4位<9且AF=0,则跳过②;②若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。MOVAL,'7' ;AL=37HADDAL,'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。MOVAL,7H ;AL=07HMOVAH,1H ;AH=1HSUBAL,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。MOVAL,9H ;AL=00001001BMOVBL,3H ;BL=00000011BMULBL;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。MOVAX,0703HMOVBL,02HAAD ;(AL)=49H,(AH)=0DIVBL ;(AL)=24H(商),(AH)=01H(余数)AAM ;(AL)=03H,(AH)=06H位运算指令位运算指令分为:逻辑运算指令移位指令循环移位指令1.逻辑运算指令逻辑非(NOT)逻辑与(AND)逻辑测试(TEST)逻辑或(OR)逻辑异或(XOR)指令这些逻辑运算指令的操作数可以是8位、16位,运算按位进行。对操作数的规定与MOV指令相同。(1)逻辑非指令格式:NOTdest 功能:(dest)←(dest)说明:不影响标志位。(2)逻辑与指令格式:ANDdest,src功能:(dest)←(dest)(src) 说明:对标志位的影响是:CF、OF清零;影响SF、ZF、PF;AF的值不定。(3)逻辑测试指令格式:TESTdest,src 功能:(dest)(src) 说明:执行相与操作,以便影响标志位,但不保留结果。对标志位的影响是:CF、OF清零;影响SF、ZF、PF;AF的值不定。(4)逻辑或指令格式:ORdest,src 功能:(dest)←(dest)(src) 说明:对标志位的影响是:CF、OF清零;影响SF、ZF、PF;AF的值不定。(5)逻辑异或指令格式:XORdest,src功能:(dest)←(dest)⊕(src) 说明:对标志位的影响是:CF、OF清零;影响SF、ZF、PF;AF的值不定。例如:ANDAL,BL ;AL←ALBLXORAX,[DI]ORBX,0FF02H ;(BX)←(BX)FF02HNOTBYTEPTR[BX] ;字节内容求反TESTAH,4;AH4,AH不变,只改变标志【例3-14】

编写汇编程序段,把数字8,变成字符“8”。MOVAL,8HORAL,30H ;AL=38H='8'【例4-15】

编写汇编程序段,从端口80H读取一字节,将其D1位求反后,从80H送出。INAL,80HXORAL,00000010BOUT80H,AL【例3-16】

编写汇编程序段,将寄存器AX清零。XORAX,AX还有哪些可以将AX清零的指令?比较之。2.移位指令移位指令可以对寄存器或存储单元的内容按字节或字进行操作。(1)逻辑左移指令格式:SHLdest,CNT 功能:目标操作数左移CNT次,最低位补0,最高位移至标志位CF中。说明:CNT代表移动次数。当CNT>1时,必须由寄存器CL说明。CF、ZF、SF、PF的值由运算结果定。CNT=1时,若移位后符号位发生变化,则标志位OF=1,否则OF=0。CNT>1时,对OF无定义。(2)逻辑右移指令格式:SHRdest,CNT 功能:目标操作数右移CNT次,最低位移至标志位CF中,最高位补0。说明:CNT代表移动次数。当CNT>1时,必须由寄存器CL说明。CF、ZF、SF、PF的值由运算结果定。CNT=1时,若移位后符号位发生变化,则标志位OF=1,否则OF=0。CNT>1时,对OF无定义。(3)算术左移指令格式:SALdest,CNT 功能:目标操作数左移CNT次,最低位补0,最高位移至标志位CF中。

说明:CNT代表移动次数。当CNT>1时,必须由寄存器CL说明。CF、ZF、SF、PF的值由运算结果定。CNT=1时,若移位后符号位发生变化,则标志位OF=1,否则OF=0。CNT>1时,对OF无定义。(4)算术右移指令格式:SARdest,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。SALAL,1 ;AL=01101000B,CF=1,OF=1SARAL,1 ;AL=11011010B,CF=0,OF=0SHLAL,1 ;AL=01101000B,CF=1,OF=1SHRAL,CL ;AL=00001011B,CF=0,OF无定义移位指令的使用说明这组指令除了可以实现基本的移位操作外,还可以用于实现数倍增(左移)或倍减(右移),使用这种方法比直接使用乘、除法效率要高得多。在不溢出的情况下,可用逻辑移位指令实现无符号数的乘、除,算术移位指令实现符号数的乘、除。【例3-17】

设无符号数X在寄存器AL中,用移位指令实现X*10的运算。MOVAH,0SALAX,1 ;AX←数X*2MOVBX,AX MOVCL,2SALAX,CL ;AX←数X*8ADDAX,BX ;AX←数X*103.循环移位指令(1)不带进位位循环左移指令格式:ROLdest,CNT 功能:目标操作数循环左移CNT次,最高位移至最低位的同时移至标志位CF中。说明:CNT代表移动次数。CNT>1时,必须由寄存器CL说明。CF由运算结果定;不影响SF、ZF、AF、PF;对OF的影响同SHL。(2)不带进位位循环右移指令格式:RORdest,CNT 功能:目标操作数循环右移CNT次,最低位移至最高位的同时移至标志位CF中。

说明:CNT代表移动次数,CNT>1时,必须由寄存器CL说明。CF由运算结果定;不影响SF、ZF、AF、PF;对OF的影响同SHL。(3)带进位位循环左移指令格式:RCLdest,CNT功能:目标操作数及标志位CF一起循环左移CNT次,最高位移至标志位中,标志位移至最低位。

说明:CNT代表移动次数,CNT>1时,必须由寄存器CL说明。CF由运算结果定;不影响SF、ZF、AF、PF;对OF的影响同SHL。(4)带进位位循环右移指令格式:RCRdest,CNT功能:目标操作数及标志位CF一起循环右移CNT次,最低位移至标志位中,标志位移至最高位。说明:CNT代表移动次数,CNT>1时,必须由寄存器CL说明。CF由运算结果定;不影响SF、ZF、AF、PF;对OF的影响同SHL。例如,设AL=01010100B,CF=1,CL=4,则:ROLAL,1 ;AL=10101000B,CF=0,OF=1RORAL,1 ;AL=00101010B,CF=0,OF=0RCLAL,1 ;AL=10101001B,CF=0,OF=1RCRAL,CL ;AL=10010101B,CF=0,OF无定义串操作指令所谓“串”是指一组数据。串操作指令的操作对象不是一字节或一个字,而是内存中地址连续的一组字节或一组字。在默认的情况下,串操作指令的源串存于数据段,目标串存于附加段。在每一次基本操作后,能够自动修改源及目标地址为下一次操作做好准备。串操作指令前通常加上重复前缀,此时,基本操作在满足条件的情况下得到重复,直至完成预设次数。1.基本串操作指令(1)串传送指令格式一:MOVSdest,src格式二:MOVSB格式三:MOVSW功能:(ES:DI)←(DS:SI);SI←SI+1/2;DI←DI+1/2MOVS指令使用说明格式一中的dest,src仅为了增加程序的可读性。字节操作时,使用格式二,地址调整量是1;字操作时,使用格式三,地址调整量是2。地址是增或减由标志位DF决定:DF=0,地址增;DF=1,地址减。寻址方式规定为寄存器间接寻址:源操作数隐含为数据段,偏移地址由寄存器SI指明,允许段超越。目标操作数隐含为附加段,偏移地址由寄存器DI指明,不允许段超越。(2)串装入指令格式一:LODSsrc格式二:LODSB格式三:LODSW 功能:AL←(DS:SI);SI←SI+1/2 (3)串送存指令格式一:STOSdest格式二:STOSB格式三:STOSW 功能:(ES:DI)←AL;DI←DI+1/2 (4)串比较指令格式一:CMPSsrc,dest格式二:CMPSB格式三:CMPSW 功能:(DS:SI)-(ES:DI);SI←SI+1/2;DI←DI+1/2(5)串扫描指令格式一:SCASdest格式二:SCASB格式三:SCASW 功能:AL/AX-(ES:DI);DI←DI+1/2说明:指令STD、CLD用于设置方向标志。STD使DF为1,CLD使DF为0。2.重复前缀指令基本串操作指令完成一个数据的操作,如果要操作一组数据,就需要在基本串操作指令前加上重复前缀。重复前缀指明该指令的基本操作是否被重复、重复的条件是什么。基本操作的重复次数隐含在寄存器CX中。(1)无条件重复前缀指令格式:REP功能:REP前缀加在串指令MOVS、STOS之前,控制串指令重复执行。串指令重复执行的次数保存在寄存器CX中。每执行一次串指令,CX←(CX)-1,直到CX=0为止。(2)相等重复前缀指令格式一:REPE格式二:REPZ功能:REPZ或REPE前缀加在串指令CMPS、SCAS指令前,控制串指令重复执行。当(CX)≠0且ZF=1时,串指令重复执行;当(CX)=0或ZF=0时,串指令重复执行结束。(3)不相等重复前缀REPNE或REPNZ格式一:REPNE格式二:REPNZ功能:REPNZ或REPNE前缀加在串指令CMPS、SCAS指令前,控制串指令重复执行。当(CX)≠0且ZF=0时,串指令重复执行;当(CX)=0或ZF=1时,串指令重复执行结束。说明:带前缀的串操作指令执行后,CX-1操作不影响标志位。【例3-18】

编写汇编程序段,把自SAREA开始的100个字复制到DAREA开始的区域中。(1)源、目标区没有重叠MOVAX,SEGSAREA ;MOVDS,AX;源区段地址送段寄存器DSMOVAX,SEGDAREA MOVES,AX;目标区段地址送段寄存器DSLEASI,SAREA;源区首字的偏移地址送SILEADI,DAREA ;目标区首字的偏移地址送DIMOVCX,100;串长送寄存器CXCLD;DF=0,地址增REPMOVSW;串传送(2)源、目标区有重叠MOVCX,100 ;串长送寄存器CXMOVAX,SEGSAREAMOVDS,AX ;源区段地址送DSMOVAX,SEGDAREAMOVES,AX;目标区段地址送DSLEASI,SAREAADDSI,CX;源区末字的偏移地址送SILEADI,DAREAADDDI,CX;目标区末字的偏移地址送DISTD;DF=1,地址减REPMOVSW;串传送【例3-19】

编写汇编程序段,将内存DS:2100~DS:2110存储区清0。MOVES,DS ;目标段段地址送ESMOVDI,2100 ;目标段首字节偏移地址送DIMOVCX,10H ;串长送寄存器CXCLD;设置方向增MOVAL,0REPSTOSB ;重复串送存控制转移指令8086程序的执行顺序由代码段寄存器CS和指令指针寄存器IP的值决定。程序可以按顺序执行,也可以根据情况改变程序的执行顺序。控制转移指令就是通过改变CS和IP的值来实现程序的转移。控制转移指令根据程序转移地址的不同,分为段内转移和段间转移。段内转移是指程序在同一代码段内转移,这时只要改变IP的值。段间转移指程序将转移到其他段,此时CS和IP的值同时改变。1.无条件转移指令无条件转移指令执行后,程序无条件转移到段内由指令中给出的目标地址处。(1)段内直接转移指令格式一:JMP标号格式二:JMP立即数指令完成的操作:IP←(IP)+以标号或立即数给出的偏移量,(CS)不变。例如:JMP2010H ;IP←2010HJMPSHORT L ;IP←(IP)+8位移量JMPNEAR NEXT ;IP←(IP)+16位移量(2)段内间接转移指令格式一:JMP寄存器格式二:JMP存储单元指令完成的操作:(IP)←寄存器或存储单元的值,(CS)不变。例如:JMPBX ;IP←(BX)JMPWORDPTR[SI] ;IP←(DS:SI)(3)段间直接转移格式:JMP FAR PTR标号指令完成的操作:(IP)←标号所在存储单元的偏移地址,(CS)←标号所在存储单元的段地址。例如:JMPFARPTRNEXT ;(IP)←标号NEXT的偏移地址 ;(CS)←标号NEXT的段地址(4)段间间接转移格式:JMPDWORDPTR存储单元指令完成的操作:(IP)←标号指出的双字存储单元的低16位,(CS)←标号给出的双字存储单元的高16位。例如:JMPDWORDPTR[SI] ;IP←(DS:SI),CS←(DS:SI+2)2.条件转移指令格式:Jcc标号功能:以标志位的状态作为转移依据。如果满足转移条件,则转移到标号指示的指令处;否则,顺序执行下一条指令。说明:cc代表跳转条件,short-label表明该指令只能实现段内短转移,参数形式通常为符号地址。(1)根据单个标志位的状态判断的转移指令指令转移条件说明JCdestCF=1有进位/借位时,转移JNCdestCF=0无进位/借位时,转移JZ/JEdestZF=1相等或等于0时,转移JNZ/JNEdestZF=0不相等或等于0时,转移JSdestSF=1为负数时,转移JNSdestSF=0为正数时,转移JOdestOF=1有溢出时,转移JNOdestOF=0无溢出时,转移JPdestPF=11的个数为偶数时,转移JNPdestPF=01的个数为奇数时,转移JZ指令用法举例例如:SUBAX,0JZZERO ;当AX=0时,程序转移到ZERO处执行(2)根据两个无符号数的比较结果判断的转移指令指令转移条件说明JA/JNBEdestCF=0且ZF=0X>Y时,转移JAE/JNBdestCF=0或ZF=1X≥Y时,转移JB/JNAEdestCF=1且ZF=0X<Y时,转移JBE/JNAdestCF=1或ZF=1X≤Y时,转移例如:CMPAX,0JAPOSITIVE ;当AX>0时,程序转移到POSITIVE处执行(3)根据两个带符号数的比较结果判断的转移指令指令转移条件说明JG/JNLEdestSF=OF且ZF=0X>Y时,转移JGE/JNLdestSF=OF或ZF=1X≥Y时,转移JL/JNGEdestSFOF且ZF=0X<Y时,转移JLE/JNGdestSFOF或ZF=1X≤Y时,转移例如:CMPAX,BXJGGREATER ;当AX>BX时,程序转移到GREATER处执行(4)若CX为0则转移的转移指令格式:JCXZ目标地址功能:当(CX)=0时,程序转移至目标地址处。例如:CMPCX,0JCXZZERO ;当CX=0时,程序转移到ZERO【例3-20】

在内存数据段2010H单元存放了一个16位无符号数。编写汇编程序段,判断该数是否是偶数。如果该数是偶数,则将CH置1,否则CH清0。MOVAX,[2010H]TESTAX,01HJZISEVENMOVCH,0JMPFINISHISEVEN:MOVCH,1FINISH:

…3.循环控制指令循环控制指令用于控制程序重复执行。循环控制指令提供了程序段循环的控制及手段。循环控制指令都用CX寄存器作为循环次数计算器,表示某程序段的最大循环次数,且循环体每执行一次,CX被减去1。8088/8086CPU规定:被循环的程序段必须在同一段内,且长度不能大于256字节。循环控制指令不影响标志位。(1)循环指令格式:LOOP目标地址

功能:①CX←CX-1②如果CX=0,结束循环,执行后续语句;否则:③转移到标号处,循环体被重复。(2)相等循环指令格式:LOOPZ/LOOPE目标地址

功能:①CX←C

温馨提示

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

评论

0/150

提交评论