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

下载本文档

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

文档简介

第三章8086的寻址方式和指令系统,3-18086的寻址方式,指令有单操作数、双操作数和无操作数之分。如果是双操作数指令,要用逗号将两个操作数分开,逗号右边的操作数称为源操作数,逗号左边的为目的操作数。,MOV功能:将BX中的源操作数AX(目的),而象单操作数指令INCAX其中AX既是源操作数,又是目的操作数,其功能是:AX+1AX。而象指令NOP,没有操作数。,前面举的例子都是操作数在寄存器中,操作数还可以在存储器或I/O端口中,也可以是立即数。,8086的寻址方式,下面主要以MOV指令来说明8086的这些寻址方式。,一、立即寻址方式,操作数直接包含在指令中,它是一个8位或16位的常整数,也叫立即数。,例如MOVAL,30HMOVAX,0FFFCHMOV1000H,1234H注意:1.常数以AF开头时,应在其前加0,以区别其它符号(如0FFFCH)。2.立即数只能作源操作数,不能作目的操作数。(如MOV23H,BL),二、寄存器寻址方式,操作数包含在寄存器中。对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP,BP等等;对于8位操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH,DL。例1:MOVDX,AX2:MOVBL,CL注意:源操作数的长度必须与目的操作数一致。,三、直接寻址方式(存储器寻址),1.直接寻址方式,有效地址(EA):操作数的偏移地址。使用直接寻址方式的指令时,存储单元的有效地址直接由指令给出,而段地址如没有指令前缀,默认由数据段寄存器给出。例如MOVAX,2000H;存储单元的有效地址EA=2000H,段地址由数据段DS指定(设DS=3000H)。此指令的执行过程如下图所示。,指令MOVAX,2000H的执行过程,2.段超越前缀如果要对代码段、堆栈段或附加段寄存器所指出的存储区进行直接寻址,应在指令中指定段超越前缀。,3.符号地址(变量名)在汇编语言中还允许用符号地址代替数值地址,实际上就是给存储单元起一个名字,这样,要与这些单元打交道,只要使用其名字即可,不必记住具体数值是多少。例如MOVAX,AREA1这里的AREA1就是操作数的符号地址,该指令执行后,将从有效地址为AREA1的存储单元中取出一个字送到AX中去。,注意:光从指令的形式上看,AREA1不仅可代表符号地址,也可以表示它是一个16位的立即数,两者之间究竟如何来区别呢?程序中还必须事先安排说明语句也叫做伪指令来加以说明。,四、寄存器间接寻址方式,指令中给出的寄存器中的值不是操作数本身,而是操作数的有效地址EA,这种寻址方式称为寄存器间接寻址。寄存器名称外面必须加方括号,以与寄存器寻址方式相区别。这类指令中使用的寄存器有基址寄存器BX、BP及变址寄存器SI、DI。,例如MOVBX,SI设DS=1000H,SI=2000H,(12000H)=3456H则物理地址=DS16+SI=10000H+2000H=12000H此指令的功能就是(12000H)字BX,因此指令执行后BX=3456H。执行过程如下图所示。,指令MOVBX,SI的执行过程,例如指令MOVAX,BP,则默认操作数在堆栈段中,操作数的物理地址=SS16+BP。设SS=4000H,BP=1000H,(41000H)=5678H则物理地址=SS16+BP=40000H+1000H=41000H此指令的功能就是(41000H)字AX,因此指令执行后AX=5678H。执行过程如下图所示。,指令MOVAX,BP的执行过程,寄存器间接寻址方式的指令中也可以指定段超越前缀来从默认段以外的段中取得数据,如:MOVBX,DS:BP物理地址=DS16+BPMOVAX,ES:DI物理地址=ES16+DI,五、寄存器相对寻址方式操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和。这种寻址方式与寄存器间接寻址十分相似,主要区别是前者在有效地址的基础上还要加一个位移量。同样,当指令中指定的寄存器是BX,SI或DI时,默认的段寄存器是DS,当指定寄存器是BP时,默认的段寄存器是SS。,指令MOVBX,COUNTSI的执行过程,六、基址变址寻址方式操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,两个寄存器均由指令指出。若基址寄存器BX时,段寄存器用DS;若基址寄存器BP时,段寄存器用SS。,指令MOVAX,BXSI的执行过程,七、相对基址变址寻址方式操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容,再加上指令中指定的8位或16位位移量之和。若基址寄存器BX时,段寄存器用DS;若基址寄存器BP时,段寄存器用SS。,指令MOVAX,MASKBXSI的执行过程,从以上这些寻址方式可以看到,在涉及到操作数的地址时,常常要在指令中使用方括号,有关带方括号的地址表达式必须遵循下列规则:,立即数可以出现在方括号内,表示直接寻址,如1000H;,只有BX,BP,SI和DI这四个寄存器可以出现在方括号内,它们可以单独出现,也可以由两个寄存器组合起来(只能相加),同时还可以加上一个8位或16位的位移量,但BX和BP不能同时出现在方括号中,SI和DI也不能同时出现在方括号中;,由于方括号有相加的含义,下面几种写法都是等价的:6BXSIBX+6SIBXSI+6BX+SI+6,若方括号内出现BP,则隐含使用SS段来提供段地址,物理地址=SS16+EA,其他情况均使用DS段来提供段地址,物理地址=DS16+EA,当然我们可以通过加段超越前缀来修改段地址。,八、其它寻址方式,1.隐含寻址指令中不指明操作数,但有隐含规定的寻址方式。例如指令DAA,它的含义是对寄存器AL中的数据进行十进制数调整,结果仍保留在AL中。,2.I/O端口寻址分为直接端口寻址和间接端口寻址。直接:端口号由指令直接给出,是一个8位的立即数。端口号范围为:00FFH;间接:端口号由寄存器DX指定,端口范围为:0000FFFFH。,3.一条指令有几种寻址方式前面介绍的各种寻址方式都是针对源操作数的,目的操作数均用寄存器来表示。实际上,目的操作数也可以除立即寻址方式以外的所有寻址方式指定。,4.转移类指令寻址将在后面章节详细介绍。,作业:P120(1,2,3)其中1(1),(3),(5)2(2),(4),(6)3(2),(4),(6)(8),(10),3-2指令的机器码表示方法,一、机器语言指令的编码目的和特点1.机器语言指令用汇编语言(即主要由指令系统组成的语言)编写的程序称为汇编语言源程序,若直接将它送到计算机,机器并不认识那些构成程序的指令和符号的含义,还必须由汇编程序将源程序翻译成计算机能认识的二进制机器语言(机器码)后,才能被计算机识别和执行,得到运算结果。,通常,计算机用户采用汇编语言编写程序时,一般可不必了解每条指令的机器码。不过,若要透彻了解计算机的工作原理,以及能看懂包含机器码的程序清单,对程序进行正确的调试、排错等,就需要熟悉机器语言。所以我们要简单介绍一下机器语言指令的基本概念和编码方式。2.机器语言指令的编码特点对于Z80、8085等8位微处理器,进行指令编码是很容易的事,只要有一张指令编码表,汇编语言源程序与机器码之间的,对应关系就一目了然,很容易通过查表求出每条指令的机器码。但对于8086系统来说,由于其很多种寻址方式,很难列出一张8086指令与机器语言的对照表。但我们可以为每种基本指令类型给出一个编码格式,对照格式填上不同的数字来表示不同的寻址方式、数据类型等,就能求得每条指令的机器码。指令通常由操作码和操作数两部分组成,每条指令的操作码列于附录B中。,二、机器语言指令代码的编制1.编码格式说明我们用寄存器之间或寄存器与存储器之间交换数据的MOV指令,来说明指令的编码格式,具体格式如图3-7所示。,图3-7典型的MOV指令的编码格式,W(位):说明传送数据的类型;W=0,为字节W=1,为字D(位):标明数据传送的方向;D=0,数据从寄存器传出D=1,数据传送到寄存器REG(3位):说明寄存器(段寄存器除外)的名称,与W位共同决定使用的是哪个寄存器。若使用的是段寄存器,则只需REG的低两位来决定,最高位为0。具体编码见表3-1。,表3-18086寄存器编码表,在这类MOV指令中有两个操作数,其中有一个必为寄存器,其编号由REG决定,另一个操作数可能是寄存器,也可能是存储单元,由指令代码的MOD和R/M来指定。表3-2给出MOD和R/M的编码格式,其中D8表示8位位移量,D16为16位位移量。,表3-2MOD和R/M的编码表,2.寄存器间传送指令的编码例3-18求指令MOVSP,BX的机器码REG决定寄存器SP,图3-8指令MOVSP,BX的编码,=8BE3H,图3-8.1指令MOVSP,BX在代码段中的存放,REG决定寄存器BX,=89DCH,图3-9指令MOVSP,BX的另一种编码,图3-9.1指令MOVSP,BX在代码段中的存放,3.寄存器与存储器间传送指令的编码例3-19求指令MOVCL,BX+1234H的机器码,图3-10指令MOVCL,BX+1234H的编码,=8A8F3412H,图3-10.1指令MOVCL,BX+1234H在代码段中的存放,4.立即数寻址指令的编码例3-20求指令MOVDX,5678H的机器码,=BA7856H,求指令MOVBH,34H的机器码,=B734H,例3-21求指令MOVBX+2100H,0FA50H的机器码,=C787002150FAH,图3-11.1指令MOVBX+2100H,0FA50H在代码段中的存放,5.包含段寄存器的指令的编码例3-22求指令MOVDS,AX的机器码,=8ED8H,6.段超越前缀指令的编码对于带有段超越前缀的指令编码时,要在指令代码前加一个8位的段超越前缀代码,代码的格式为001110,其中位表明段超越前缀寄存器,编码与上面列出的相同。指令的其他代码仍按前面的方法求得。例3-23若指令MOVBX,DL的机器码为8817H,试求指令MOVCS:BX,DL的代码。,解:需增加的字节为001110CS=01所以,需增加的字节为00101110=2EH所以,所求的指令机器码为2E8817H。,3-38086的指令系统,8086指令系统中包含133条基本指令,分六大类:数据传送指令算术运算指令逻辑运算和移位指令字符串操作指令控制转换指令处理器控制指令,一、数据传送指令,分4类:通用数据传送指令输入输出指令地址目标传送指令标志传送指令,1.通用数据传送指令,(1)MOV传送指令指令格式:MOV目的,源指令功能:将源操作数(一个字节或一个字)传送到目的操作数。,几点说明:,指令中,立即数不能作为目的操作数,CS和IP也不能作为目的操作数,即它们的值不能随意修改。同时IP还不能作为源操作数。,两个内存单元之间,以及两个段寄存器之间不能直接传送数据。,立即数不能直接传送给段寄存器,必须通过寄存器传送给段寄存器。,当指令是给SS段寄存器赋值时,系统会自动禁止外部中断,等到本条指令和下条指令执行之后,又自动开中断。(目的?),针对第点说明,我们简单了解一下一个数据段的定义,以及段地址DS?,例如,下面是某个程序的数据段:DATASEGMENT;数据段开始AREA1DB14H,3BHAREA2DB3DUP(0)ARRAYDW3100H,01A6HSTRINGDBGOODDATAENDS;数据段结束,图3-13数据段占用存储空间的情况,(2)PUSH进栈指令指令格式:PUSH源指令功能:将源操作数压入堆栈。源操作数可以是16位通用寄存器、段寄存器或存储器中的数据字,但不能是立即数。,(3)POP出栈指令指令格式:POP目的指令功能:将当前SP和SP+1所指向的单元内容目的操作数。源操作数可以是16位通用寄存器、段寄存器或存储器中的数据字,但CS不能作为目的操作数。,例3-29假如当前SS=C000H,SP=1000H,AX=1234HBX=5678H,CX=ABCDH,则执行指令PUSHAX,PUSHBX,POPCX后,堆栈中的内容发生什么变化,AX,BX,CX中的内容又是多少?画图说明。,(4)XCHG交换指令指令格式:XCHG目的,源指令功能:把一个字或字节的源操作数和目的操作数相交换。,几点说明:,段寄存器、IP,立即数不能作为操作数,两个存储单元之间不能直接交换数据,目的和源操作数的长度必须一致,(5)XLAT表转换指令(查表指令)指令格式:XLAT转换表指令功能:将一个字节从一种代码转换成另一种代码。,使用过程:,在内存中建立一个表格(就是定义一段字节数据,这些数据就是转换以后的代码)。,将表的首地址BX寄存器中(只能是BX),在AL中存放一个数据(就是需要转换的代码),而这个数据实际是表的首地址与所要查找的某一项之间的位移量(表格中最多包含256个字节),执行XLAT指令,指令执行后,将转换后的代码(所查的字节内容)就AL中。,例3-31如下图所示的8段数码管,显示段码的格式为:(dpgfedcba)2,当相应的位为1时,此段就显示;为0时,就不显示。如0的段码为:(00111111)2=3FH;1的段码为:(00000110)2=06H等等。现要求编一程序段,通过查表将5的显示段码DL中。,程序如下:DISPDB3FH,06H,5BH,4FH,66HDB6DH,7DH,07H,7FH,6FHMOVBX,OFFSETDISP;表首址BXMOVAL,5;5的段码与表首址之间的位移量ALXLAT(XLATDISP);5的段码6DHALMOVDL,AL;5的段码6DH保存到DL,2.输入输出指令用来完成I/O端口与累加器之间的数据传送,指令中要给出I/O端口的地址。,(1)IN输入指令指令格式:INAL,端口地址;INAX,端口地址INAL,DX;INAX,DX;指令功能:从8位端口读一个字节AL,或从16位端口读一个字AX。,INAL,50H;从50H端口读一个字节AL,(2)OUT输出指令指令格式:OUT端口地址,AL;OUT端口地址,AXOUTDX,AL;OUTDX,AX;,3.地址目标传送指令用来传送操作数的段地址和偏移地址,(1)LEA取有效地址指令指令格式:LEA目的,源指令功能:取源操作数的偏移地址目的要求:源操作数必须是内存单元目的操作数必须是一个16位的寄存器(段寄存器除外)使用时,要注意与MOV指令的区别!,(2)LDS将双字指针送到寄存器和DS指令指令格式:LDS目的,源指令功能:从源操作数指定的存储单元中,取出一个变量的4字节地址指针,送到一对目的寄存器。其中前两个字节(表示变量的偏移地址)送到指令中指定的目的寄存器,后两个字节(表示变量的段地址)送到DS段寄存器中。,要求:源操作数必须是内存单元,从该单元开始的连续4个字节单元中,存放着一个变量的地址指针(偏移地址和段地址),目的操作数必须是一个16位的寄存器(段寄存器除外),常使用SI寄存器。,(3)LES将双字指针送到寄存器和ES指令指令格式:LES目的,源指令功能:从源操作数指定的存储单元中,取出一个变量的4字节地址指针,送到一对目的寄存器。其中前两个字节(表示变量的偏移地址)送到指令中指定的目的寄存器,后两个字节(表示变量的段地址)送到ES段寄存器中。,要求:源操作数必须是内存单元,从该单元开始的连续4个字节单元中,存放着一个变量的地址指针(偏移地址和段地址)目的操作数必须是一个16位的寄存器(段寄存器除外),常使用DI寄存器。,4.标志传送指令对标志寄存器FLAGS进行操作,(1)LAHF,标志送到AH指令指令格式:LAHF指令功能:把标志寄存器的低8位对应AH,(2)SAHF,AH送到标志寄存器指令指令格式:SAHF指令功能:把AH对应标志寄存器的低8位,其高8位保持不变。,(3)PUSHF,标志入栈指令指令格式:PUSHF指令功能:把整个标志寄存器的内容压入堆栈,同时修改SP(SP-2SP),(4)POPF,标志出栈指令指令格式:POPF指令功能:把当前堆栈指针SP所指的一个字,传送到标志寄存器,同时修改SP(SP+2SP),二、算术运算指令,算术运算指令可以处理4种类型的数:,无符号二进制整数,带符号二进制整数:用补码表示,无符号压缩十进制整数:一个字节中存放两个BCD码十进制数。,无符号非压缩十进制整数:只在一个字节的低半字节存放一个BCD码十进制数,而高半字节为0。,8086指令系统提供了加、减、乘、除四种基本运算指令,可处理无符号或带符号的8位或16位二进制数的算术运算,还提供了各种调整操作指令,故可进行压缩的或非压缩的十进制数的算术运算。绝大部分算术运算指令都影响状态标志位。对于加法和减法运算指令,带符号数和无符号数的加法和减法运算的操作过程是一样的故可以用同一条加法或减法指令来完成。而对于乘法和除法运算,带符号数和无符号数的运算过程完成不同,必须分别设置无符号数的乘除法指令。,1.加法指令,(1)ADD不带进位的加法指令指令格式:ADD目的,源指令功能:源+目的目的,(2)ADC带进位的加法指令指令格式:ADC目的,源指令功能:源+目的+CF目的,例3-41求下列指令执行后,对标志位有何影响?MOVAL,5EHADDAL,3CH,上述这些标志位我们程序员不是每个都需要关心,要分不同情况考虑:当程序员把上两数看成是无符号数相加时,在这里SF和OF就没有什么实际意义了,只要关心CF就可以了。当程序员把上两数看成是有符号数相加时,这时CF位就没有什么意义了,而需要考虑SF和OF位。当进行BCD码运算或需要进行奇偶校验时,才考虑AF或PF标志位。,(3)INC增量指令指令格式:INC目的指令功能:目的+1目的,(4)AAA加法的ASCII调整指令指令格式:AAA指令功能:在用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法后,运算结果已存在AL的情况下,用此指令将AL寄存器中的运算结果调整为1位非压缩十进制数,仍保留在AL中,如果AF=1,表示向高位有进位,则进位进到AH中。,AAA指令执行时,对AL中的运算结果进行调整的过程如下:若AL低4位9或辅助进位AF=1,则AL+6AL;用与操作将AL高4位清0,低4位不变;AF置1,CF置1,AH+1AH否则,仅将AL寄存器的高4位清0。,例3-44若AL=BCD9,BL=BCD5,求两数之和。设AH=0。下面看看运算过程:,例3-45求ASCII码表示的数9(39H)和5(35H)之和。设AH=0,则运算过程如下:,(5)DAA加法的十进制调整指令指令格式:DAA指令功能:将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。相加后的结果必须在AL中,才能使用DAA指令。,例3-46若AL=BCD38,BL=BCD15,求两数之和。下面看看运算过程:,例3-47若AL=BCD88,BL=BCD49,求两数之和。下面看看运算过程:,2.减法指令,(1)SUB不带借位的减法指令指令格式:SUB目的,源指令功能:目的-源目的,(2)SBB带借位的减法指令指令格式:SBB目的,源指令功能:目的-源-CF目的,(3)DEC增量指令指令格式:DEC目的指令功能:目的-1目的,(4)NEG取负指令(求补指令)指令格式:NEG目的指令功能:0-目的目的,(5)CMP比较指令指令格式:CMP目的,源,(6)AAS减法的ASCII调整指令指令格式:AAS指令功能:在用SUB或SBB指令对两个非压缩十进制数或ASCII码表示的十进制数作减法后,运算结果已存在AL的情况下,对AL中的所得结果调整,在AL中得到一个正确的非压缩十进制数之差,如果有借位,则CF置1。AAS指令必须紧跟在SUB或SBB指令之后。,例3-54设AL=BCD3,CL=BCD8,求两数之差。显然,结果为BCD5,但要向高位借位。调整过程如下:,(7)DAS减法的十进制调整指令指令格式:DAS指令功能:将两个压缩BCD数相减后的结果调整为正确的压缩BCD数。相减后的结果必须在AL中,才能使用DAS指令。,例3-55设AL=BCD56,CL=BCD98,求两数之差。调整过程如下:,3.乘法指令,(1)MUL无符号数乘法指令指令格式:MUL源指令功能:把源操作数和累加器中的数都当成是无符号数,然后将两数相乘,源操作数可以是字节或字。,(2)IMUL有符号数乘法指令,指令格式:IMUL源指令功能:把源操作数和累加器中的数都当成是有符号数,然后将两数相乘,源操作数可以是字节或字。,(3)AAM乘法的ASCII调整指令指令格式:AAM指令功能:对已存在AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,使得在AX中得到正确的非压缩十进制数的乘积,高位放在AH中,低位放在AL中。两个ASCII码数相乘之前,必须先屏蔽掉每个数字的高半字节,从而使每个字节包含一个非压缩十进制数,再用MUL指令相乘,乘积放到AL寄存器中,然后用AAM指令进行调整。,4.除法指令,(1)DIV无符号数除法指令指令格式:DIV源指令功能:把源操作数和累加器中的数都当成是无符号数,然后将两数相除,源操作数可以是字节或字。,(2)IDIV带符号数除法指令指令格式:IDIV源指令功能:该指令执行的操作与DIV相同,但操作数都必须是带符号数,商和余数也都是带符号数,而且规定余数的符号和被除数的符号相同。25/3商=-8,余数=-1(规定)商=-9,余数=+2,(3)CBW把字节转换成字指令指令格式:CBW指令功能:把寄存器AL中字节的符号位扩充到AH的所有位,这时AH被称为是AL的符号扩充。,(4)CWD把字转换成双字指令指令格式:CWD指令功能:把寄存器AX中字的符号位扩展到DX寄存器的所有位中去。,(5)AAD除法的ASCII调整指令指令格式:AAD指令功能:在做除法之前,把BCD码转换成二进制数。,三、逻辑运算和移位指令逻辑运算和移位指令对字节或字操作数进行按位操作。,1.逻辑运算指令,(1)NOT取反指令指令格式:NOT目的指令功能:将目的操作数求反,结果送回目的操作数,即目的,(2)AND逻辑与指令指令格式:AND目的,源指令功能:对两个操作数进行按位逻辑与操作,结果送回目的操作数。,(3)OR逻辑或指令指令格式:OR目的,源指令功能:对两个操作数进行按位逻辑或操作,结果送回目的操作数。,(4)XOR异或操作指令指令格式:XOR目的,源指令功能:对两个操作数进行按位逻辑异或操作,结果送回目的操作数。,(5)TEST测试指令指令格式:TEST目的,源指令功能:对两个操作数进行按位逻辑与操作,并修改标志位,但不送回结果到目的,即指令执行后,两个操作数都不变,仅影响标志位。,2.算术逻辑移位指令(非循环移位指令)可对寄存器或存储器中的字或字节的各位进行算术移位或逻辑移位,移位的次数由指令中的计数值决定。,(1)SAL算术左移指令指令格式:SAL目的,计数值(2)SHL逻辑左移指令指令格式:SHL目的,计数值,(3)SHR逻辑右移指令指令格式:SHR目的,计数值,(4)SAR算术右移指令指令格式:SAR目的,计数值,3.循环移位指令上述的算术逻辑移位指令,移出操作数的数位均被丢失,而循环移位指令把操作数从一端移到操作数的另一端,这样从操作数中移走的位就不丢失了。,(1)ROL循环左移指令指令格式:ROL目的,计数值,(2)ROR循环右移指令指令格式:ROR目的,计数值,(3)RCL带进位的循环左移指令指令格式:RCL目的,计数值,(4)RCR带进位的循环右移指令指令格式:RCR目的,计数值,习题,10,1)字符串传送指令2)字符串比较指令3)字符串检索指令4)取字符串指令5)存字符串指令6)I/O串操作指令,四、字符串处理指令,1、字符串传送指令,MOVSB/MOVSW/MOVSD操作:(1)(ES:DI)(DS:SI)可传送字节、字(2)自动修改地址指针(3)每次只传送一个字节或字,2.字符串比较指令CMPSB/CMPSW指令格式:CMPSB目的串,源串或CMPSW目的串,源串,例比较两个字符串,一个是你在程序中设定的口令串PASSWORD,另一个是从键盘输入的字符串IN_WORD,若输入串与口令串相同,程序将开始执。否则,程序驱动PC机的扬声器发声,警告用户口令不符,拒绝往下执行。这可以用CMPSB指令来实现,有关程序段如下:,LEASI,PASSWORD;源串指针LEADI,IN_WORD;目的串指针MOVCX,COUNT;串长度CLD;使DF=0,SI、DI自动增加REPZCMPSB;CX0且串相同时重复JNZSOUND;若不相等,转发声程序OK:;比较完且相同,往下执行SOUND:,3.字符串检索指令SCASB/SCASW/SCASD,MOVDI,OFFSETSTRING;DI=字符串偏移地址=0MOVCX,COUNT;CX=字符串长度MOVAL,A;AL=关键字A的ASCII码CLD;DF=0,DI自动加1REPNESCASB;CX0(没查完)且不相同时重复JZFIND;若ZF=1,表示已搜索到,转出MOVDI,0;若ZF=0,表示没搜索到,则DI=0FIND:MOVBX,DI;搜索次数BX上述程序中,DI初值存起始地址偏移量0,搜索一次后DI自动加1,使DI的值等于1,以后,每执行一次搜索操作,DI自动加1。所以,正好可用DI的值来表示搜索次数。,4.取字符串指令LODSB/LODSW/LODSD,5.存字符串指令STOSB/STOSW/STOSD,6.I/O串操作指令,INSB/OUTSB、INSW/OUTSW、INSD/OUTSD,INSB、INSW、INSD:从一个输入端口读一串数据送到DI或EDI。在DF控制下每输入一次,DI或EDI自动修改,并修改CX或ECX。,OUTSB、OUTSW、OUTSD:从SI或ESI输出一串数据到输出端口。在DF控制下每输入一次,SI或ESI自动修改,并修改CX或ECX。,注意:1、I/O串操作指令在用时,必须将端口号预先存在DX中。2、可使用重复前缀,要求I/O端口的速度和指令执行速度匹配。,例INSBOUTSD,字符串操作指令共同特点如下:,1)关于转移指令和调用指令的寻址2)过程调用和返回指令3)无条件转移指令和条件转移指令4)循环控制指令5)中断指令INT和中断返回指令IRET/IRETD,五、控制转移指令,1、关于转移指令和调用指令的寻址,(1)段内直接转移方式JMPSHORT如:JMP1000H(2)段内间接转移方式JMP16位寄存器如:JMPCX(3)段间直接转移方式JMPFARPTR标号如:JMP2000H:1000H(4)段间间接寻址方式JMPDWORDPTR存储单元如:JMPDWORDPTRSI,2、子程序调用和返回指令,CALLCALL1000H;段内直接调用CALLAX;段内间接调用CALL2500H:3600H;段间直接调用CALLDWORDPTRDI;段间间接调用RETRETRETn,3、无条件转移指令和条件转移指令,(1)JMP(2)J*(*代表各种条件),(1)JMP无条件转移指令指令格式:JMP目的指令功能:使程序无条件地转移到指令中指定的目的地址去执行。,无条件转移指令可分为:段内直接转移段内间接转移段间直接转移段间间接转移,(2)条件转移指令根据某一状态标志位的值或某个比较结果作为判别转移的依据。若条件成立,便转向指令中给出的目的地址,去执行那里的指令,否则,程序仍顺序执行。,条件转移指令通常用在比较指令后,根据比较结果决定是否转移。在指令中,目的地址均用标号表示,因此指令的格式为:条件操作符标号,条件转移指令共有18条,可以归类成以下两大类:,直接标志转移指令这类转移指令在指令助记符中直接给出标志状态的测试条件,它们以CF,ZF,SF,OF和PF等5个标志的10种状态为判断的条件,共形成10条指令。,ADDAL,BL;两数相加JCNEXT;若有进位,转NEXTMOVAH,0;无进位,AH清0JMPEXIT;往下执行NEXT:MOVAH,1;有进位,AH置1EXIT:;程序继续进行,例求AL和BL寄存器中的两数之和,若有进位,则AH置1,否则AH清0。可用如下程序段来实现该操作:,间接标志转移这类指令以某一个标志的状态或几个标志的状态组合,作为测试的条件,若条件成立则转移,否则程序顺序往下执行。间接标志转移指令共有8条,列于下表中。每条指令都有两种不同的助记符,中间用/隔开。,4、循环控制指令,(1)LOOP(2)LOOPZ/LOOPE(3)LOOPNZ/LOOPNE,(1)LOOP计数循环指令指令格式:LOOP短标号,例将位于DS段连续的100个字节的单元内容都加1,其中第一个字节单元的偏移地址由SI来指定。程序段如下:MOVCX,100;共100个字节JIA1:ADDSI,1INCSILOOPJIA1,(2)LOOPE/LOOPZ相等或结果为0循环指令格式:LOOPE短标号或LOOPZ短标号,例设以SSS开始的内存单元中存放了100个字节的数据,编程要求找出其中第一个非0元素,并记下其偏移地址送到DI中,若全是0,则将DI清0。,(3)LOOPNE/LOOPNZ不相等或结果不为0循环指令格式:LOOPNE短标号或LO

温馨提示

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

评论

0/150

提交评论