微型计算机原理与接口技术第五版(中国科学技术大学出版社)第3章课件_第1页
微型计算机原理与接口技术第五版(中国科学技术大学出版社)第3章课件_第2页
微型计算机原理与接口技术第五版(中国科学技术大学出版社)第3章课件_第3页
微型计算机原理与接口技术第五版(中国科学技术大学出版社)第3章课件_第4页
微型计算机原理与接口技术第五版(中国科学技术大学出版社)第3章课件_第5页
已阅读5页,还剩134页未读 继续免费阅读

下载本文档

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

文档简介

第三章 8086的寻址方式和指令系统,3-1 8086的寻址方式,指令有单操作数、双操作数和无操作数之分。如果是双操作数指令,要用逗号将两个操作数分开,逗号右边的操作数称为源操作数,逗号左边的为目的操作数。,MOV功能:将BX中的源操作数AX(目的),而象单操作数指令 INC AX 其中AX既是源操作数,又是目的操作数,其功能是:AX+1AX。 而象指令NOP,没有操作数。,前面举的例子都是操作数在寄存器中,操作数还可以在存储器或I/O端口中,也可以是立即数。,8086的寻址方式,下面主要以MOV指令来说明8086的 这些寻址方式。,一、立即寻址方式,操作数直接包含在指令中,它是一个8位或16位的常整数,也叫立即数。,例如 MOV AL,30H MOV AX,0FFFCH MOV 1000H,1234H 注意:1.常数以AF开头时,应在其前加0,以区别其 它符号(如0FFFCH)。 2.立即数只能作源操作数,不能作目的操作数。 (如MOV 23H,BL ),二、寄存器寻址方式,操作数包含在寄存器中。对于16位操作数,寄存器可以是AX,BX,CX,DX,SI,DI,SP,BP等等;对于8位操作数,寄存器可以是AH,AL,BH,BL,CH,CL,DH,DL。 例 1:MOV DX,AX 2: MOV BL,CL 注意:源操作数的长度必须与目的操作数一致。,三、直接寻址方式(存储器寻址),1.直接寻址方式,有效地址 (EA):操作数的偏移地址。 使用直接寻址方式的指令时,存储单元的有效地址直接由指令给出,而段地址如没有指令前缀,默认由数据段寄存器给出。例如MOV AX,2000H;存储单元的有效地址EA=2000H,段地址由数据段DS指定(设DS=3000H)。此指令的执行过程如下图所示。,指令MOV AX,2000H的执行过程,2.段超越前缀 如果要对代码段、堆栈段或附加段寄存器所指出的存储区进行直接寻址,应在指令中指定段超越前缀。,3.符号地址(变量名) 在汇编语言中还允许用符号地址代替数值地址,实际上就是给存储单元起一个名字,这样,要与这些单元打交道,只要使用其名字即可,不必记住具体数值是多少。例如MOV AX,AREA1这里的AREA1就是操作数的符号地址,该指令执行后,将从有效地址为AREA1的存储单元中取出一个字送到AX中去。,注意:光从指令的形式上看,AREA1不仅可代表符号地址,也可以表示它是一个16位的立即数,两者之间究竟如何来区别呢?程序中还必须事先安排说明语句也叫做伪指令来加以说明。,四、寄存器间接寻址方式,指令中给出的寄存器中的值不是操作数本身,而是操作数的有效地址EA,这种寻址方式称为寄存器间接寻址。寄存器名称外面必须加方括号,以与寄存器寻址方式相区别。这类指令中使用的寄存器有基址寄存器BX、BP及变址寄存器SI、DI。,例如 MOV BX,SI 设DS=1000H,SI=2000H,(12000H)=3456H 则物理地址=DS16+SI =10000H+2000H =12000H 此指令的功能就是(12000H)字BX,因此指令执行后BX=3456H。执行过程如下图所示。,指令MOV BX,SI的执行过程,例如指令MOV AX,BP,则默认操作数在堆栈段中,操作数的物理地址=SS16+BP。 设SS=4000H,BP=1000H,(41000H)=5678H 则物理地址=SS16+BP =40000H+1000H =41000H 此指令的功能就是(41000H)字AX,因此指令执行后AX=5678H。执行过程如下图所示。,指令MOV AX,BP的执行过程,寄存器间接寻址方式的指令中也可以指定段超越前缀来从默认段以外的段中取得数据,如: MOV BX,DS:BP 物理地址=DS16+BP MOV AX,ES:DI 物理地址=ES16+DI,五、寄存器相对寻址方式 操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位移量之和。这种寻址方式与寄存器间接寻址十分相似,主要区别是前者在有效地址的基础上还要加一个位移量。同样,当指令中指定的寄存器是BX,SI或DI时,默认的段寄存器是DS,当指定寄存器是BP时,默认的段寄存器是SS。,指令MOV BX,COUNTSI的执行过程,六、基址变址寻址方式 操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,两个寄存器均由指令指出。 若基址寄存器BX时,段寄存器用DS; 若基址寄存器BP时,段寄存器用SS。,指令MOV AX,BXSI的执行过程,七、相对基址变址寻址方式 操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容,再加上指令中指定的8位或16位位移量之和。 若基址寄存器BX时,段寄存器用DS; 若基址寄存器BP时,段寄存器用SS。,指令MOV AX,MASKBXSI的执行过程,从以上这些寻址方式可以看到,在涉及到操作数的地址时,常常要在指令中使用方括号,有关带方括号的地址表达式必须遵循下列规则:,立即数可以出现在方括号内,表示直接寻址,如1000H;,只有BX,BP,SI和DI这四个寄存器可以出现在方括号内,它们可以单独出现,也可以由两个寄存器组合起来(只能相加),同时还可以加上一个8位或16位的位移量,但BX和BP不能同时出现在方括号中,SI和DI也不能同时出现在方括号中;,由于方括号有相加的含义,下面几种写法都是等价的: 6BXSI BX+6SI BXSI+6 BX+SI+6,若方括号内出现BP,则隐含使用SS段来提供段地址,物理地址=SS16+EA,其他情况均使用DS段来提供段地址,物理地址=DS16+EA,当然我们可以通过加段超越前缀来修改段地址。,八、其它寻址方式,1.隐含寻址 指令中不指明操作数,但有隐含规定的寻址方式。例如指令DAA,它的含义是对寄存器AL中的数据进行十进制数调整,结果仍保留在AL中。,2. I/O端口寻址 分为直接端口寻址和间接端口寻址。 直接:端口号由指令直接给出,是一个8位的立即数。 端口号范围为:00FFH; 间接:端口号由寄存器DX指定,端口范围为: 0000FFFFH。,3.一条指令有几种寻址方式 前面介绍的各种寻址方式都是针对源操作数的,目的操作数均用寄存器来表示。实际上,目的操作数也可以除立即寻址方式以外的所有寻址方式指定。,4.转移类指令寻址 将在后面章节详细介绍。,3-2 指令的机器码表示方法,一、机器语言指令的编码目的和特点 1.机器语言指令 用汇编语言(即主要由指令系统组成 的语言)编写的程序称为汇编语言源程序, 若直接将它送到计算机,机器并不认识那 些构成程序的指令和符号的含义,还必须 由汇编程序将源程序翻译成计算机能认识 的二进制机器语言(机器码)后,才能被 计算机识别和执行,得到运算结果。,通常,计算机用户采用汇编语言编写 程序时,一般可不必了解每条指令的机器 码。不过,若要透彻了解计算机的工作原 理,以及能看懂包含机器码的程序清单, 对程序进行正确的调试、排错等,就需要 熟悉机器语言。所以我们要简单介绍一下 机器语言指令的基本概念和编码方式。 2.机器语言指令的编码特点 对于Z80、8085等8位微处理器,进行 指令编码是很容易的事,只要有一张指令 编码表,汇编语言源程序与机器码之间的,对应关系就一目了然,很容易通过查表求 出每条指令的机器码。但对于8086系统来 说,由于其很多种寻址方式,很难列出一 张8086指令与机器语言的对照表。但我们 可以为每种基本指令类型给出一个编码格 式,对照格式填上不同的数字来表示不同 的寻址方式、数据类型等,就能求得每条 指令的机器码。,二、 机器语言指令代码的编制 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-1 8086寄存器编码表,在这类MOV指令中有两个操作数, 其中有一个必为寄存器,其编号由REG决 定,另一个操作数可能是寄存器,也可能 是存储单元,由指令代码的MOD和R/M来 指定。表3-2给出MOD和R/M的编码格式, 其中D8表示8位位移量,D16为16位位移量。,表3-2 MOD和R/M的编码表,2.寄存器间传送指令的编码 例3-18 求指令MOV SP,BX的机器码 REG决定寄存器SP,图3-8 指令MOV SP,BX的编码,=8B E3H,图3-8.1指令MOV SP,BX在代码段中的存放,REG决定寄存器BX,=89 DCH,图3-9 指令MOV SP,BX的另一种编码,图3-9.1指令MOV SP,BX在代码段中的存放,作业:P120(1,2,3) 其中1(1),(3),(5) 2(2),(4),(6) 3(7),(8),(9),3-3 8086的指令系统,8086指令系统中包含133条基本指令,分六大类: 数据传送指令 算术运算指令 逻辑运算和移位指令 字符串操作指令 控制转换指令 处理器控制指令,一、数据传送指令,分4类: 通用数据传送指令 输入输出指令 地址目标传送指令 标志传送指令,1.通用数据传送指令,(1)MOV传送指令 指令格式:MOV 目的,源 指令功能:将源操作数(一个字节或一个字)传送到目的操作数。,几点说明:,指令中,立即数不能作为目的操作数,CS和IP也不能作为目的操作数,即它们的值不能随意修改。同时IP还不能作为源操作数。,两个内存单元之间,以及两个段寄存器之间不能直接传送数据。,立即数不能直接传送给段寄存器,必须通过寄存器传送给段寄存器。,当指令是给SS段寄存器赋值时,系统会自动禁止外部中断,等到本条指令和下条指令执行之后,又自动开中断。(目的?),针对第点说明,我们简单了解一下一个数据段的定义,以及段地址DS?,例如,下面是某个程序的数据段: DATA SEGMENT ;数据段开始 AREA1 DB 14H,3BH AREA2 DB 3 DUP(0) ARRAY DW 3100H,01A6H STRING DB GOOD DATA ENDS ;数据段结束,图3-13 数据段占用存储空间的情况,(2)PUSH进栈指令 指令格式:PUSH 源 指令功能:将源操作数压入堆栈。 源操作数可以是16位通用寄存器、段寄存器或存储器中的数据字,但不能是立即数。,(3)POP出栈指令 指令格式:POP 目的 指令功能:将当前SP和SP+1所指向的单元内容目的操作数。 源操作数可以是16位通用寄存器、段寄存器或存储器中的数据字,但CS不能作为目的操作数。,例3-29 假如当前SS=C000H,SP=1000H,AX=1234H BX=5678H,CX=ABCDH,则执行指令PUSH AX, PUSH BX,POP CX后,堆栈中的内容发生什么变 化,AX,BX,CX中的内容又是多少?画图说明。,(4)XCHG交换指令 指令格式:XCHG 目的, 源 指令功能:把一个字或字节的源操作数和目的操作数相交换。,几点说明:,段寄存器、IP,立即数不能作为操作数,两个存储单元之间不能直接交换数据,目的和源操作数的长度必须一致,(5)XLAT表转换指令(查表指令) 指令格式:XLAT 转换表 指令功能:将一个字节从一种代码转换成另一种代码。,使用过程:,在内存中建立一个表格(就是定义一段字节数据,这些数据就是转换以后的代码)。,将表的首地址BX寄存器中(只能是BX),在AL中存放一个数据(就是需要转换的代码),而这个数据实际是表的首地址与所要查找的某一项之间的位移量(表格中最多包含256个字节),执行XLAT指令,指令执行后,将转换后的代码(所查的字节内容)就AL中。,例3-31 如下图所示的8段数码管,显示段码的格式为:(dp g f e d c b a)2 ,当相应的位为1时,此段就显示;为0时,就不显示。如0的段码为:(0 0 1 1 1 1 1 1)2=3FH;1的段码为:(0 0 0 0 0 1 1 0)2=06H等等。现要求编一程序段,通过查表将5的显示段码DL中。,程序如下: DISP DB 3FH,06H,5BH,4FH,66H DB 6DH,7DH,07H,7FH,6FH MOV BX,OFFSET DISP ;表首址BX MOV AL,5 ;5的段码与表首址之间的 位移量AL XLAT(XLAT DISP); 5的段码6DHAL MOV DL,AL ; 5的段码6DH保存到DL,2.输入输出指令 用来完成I/O端口与累加器之间的数据传送,指令中要给出I/O端口的地址。,(1)IN输入指令 指令格式: IN AL,端口地址; IN AX,端口地址 IN AL,DX; IN AX,DX; 指令功能:从8位端口读一个字节AL,或从16位端口读一个字AX。,IN AL,50H; 从50H端口读一个字节AL,(2)OUT输出指令 指令格式: OUT 端口地址,AL;OUT 端口地址,AX OUT DX,AL; OUT DX ,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 求下列指令执行后,对标志位有何影响? MOV AL,5EH ADD AL,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。,(5)DAA加法的十进制调整指令 指令格式:DAA 指令功能:将两个压缩BCD数相加后的结 果调整为正确的压缩BCD数。相加后的结果必须在AL中,才能使用DAA指令。,例3-47 若AL=BCD 88,BL=BCD 49,求两数之和。下面看看运算过程:,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=BCD 3,CL=BCD 8,求两数之差。显然,结果为BCD 5,但要向高位借位。调整过程如下:,(7)DAS减法的十进制调整指令 指令格式:DAS 指令功能:将两个压缩BCD数相减后的结果调整为正确的压缩BCD数。相减后的结果必须在AL中,才能使用DAS指令。,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 目的,计数值,四、字符串处理指令,这里所谓的字符串是指一系列存放在存储器中的字或字节数据,不管它们是不是ASCII码。字符串长度可达64K字节,组成字符串的字节或字称为字符串元素,每种字符串指令对字符串中的元素只进行同一种操作。,字符串操作指令共有5条,其特点如下:,1.字符串传送指令MOVSB/MOVSW 指令格式: MOVSB 目的串,源串 或MOVSW 目的串,源串,例3-75 要求把数据段中以SRC_MESS为偏移地址的一串字符“HELLO!”,传送到附加段中以NEW_LOC开始的单元中。 实现该操作的程序如下: DATA SEGMENT ;数据段 SRC_MESS DB HELLO;源串 DATA ENDS ; EXTRA SEGMENT;附加段 NEW_LOC DB 6 DUP(?);存放目的串 EXTRA ENDS ;,CODE SEGMENT ;代码段 ASSUME CS:CODE,DS:DATA,ES:EXTRA START: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX LEA SI,SRC_MESS LEA DI,NEW_LOC MOV CX,6 CLD REP MOVSB CODE ENDS END START,2.字符串比较指令CMPSB/CMPSW 指令格式: CMPSB 目的串,源串 或CMPSW 目的串,源串,3.字符串扫描指令SCASB/SCASW 指令格式: SCASB 目的串 或SCASW 目的串,4.取字符串指令LODSB/LODSW 指令格式: LODSB 源串 或LODSW 源串,5.存字符串指令STOSB/STOSW 指令格式: STOSB 目的串 或STOSW 目的串,五、控制转移指令 通常,程序中的指令都是顺序地逐条执行的,在8086中,指令的执行顺序由CS和IP决定,每取出一条指令,指令指针IP自动进行调整,一条指令执行完后,就从该指令之后的下一个存储单元中取出新的指令来执行。利用控制转移指令可以改变CS和IP的值,从而改变指令的执行顺序。为满足程序转移的不同要求,8086提供了无条件转移和过程调用、条件转移、循环控制以及中断等几类指令,见下表。,1.无条件转移和过程调用指令,(1)JMP无条件转移指令 指令格式:JMP 目的 指令功能:使程序无条件地转移到指令中指定的目的地址去执行。,这类指令又分成两种类型:,不论段内还是段间转移,就转移地址提供的方式而言,又可分为两种方式:,无条件转移指令可分为: 段内直接转移 段内间接转移 段间直接转移 段间间接转移,段内直接转移指令 指令格式:JMP SHORT 标号 JMP NEAR PTR 标号 或JMP 标号,段内间接转移指令 指令格式: JMP 16位寄存器 JMP WORD PTR存储单元 这类指令转向的16位有效地址存放在一个16位寄存器或字存储单元中。,段间直接(远)转移指令 指令格式:JMP FAR PTR 标号,段间间接转移指令 指令格式:JMP DWORD PTR 存储单元 ,(2)过程调用和返回指令 在编写程序时,往往把某些能完成特定功能而又经常要用到的程序段,编写成独立的模块,并把它称为过程,习惯上也称作子程序,然后在程序中用CALL语句来调用这些过程,调用过程的程序称为主程序。,段内直接调用和返回 例3-83 CALL PROG_N; PROG_N是一个近标号 根据附录B可知,该指令占3个字节,机器码格式为:,执行CALL的过程为: SP-2SP,即新的SP=0100H-2=00FEH,返回地址的IP入栈。,根据当前IP值和位移量DISP计算出新的IP值,作为子程序的入口地址。,RET指令的寻址方式与CALL指令的寻址方式一致,在本例中是段内直接调用,所以过程PROG_N中的RET指令将执行如下操作:,(SP+1,SP)单元内容IP,IP=1053H, SP+2SP,即新的SP=0100H,段内间接调用和返回 例3-84 CALL BX CALL WORD PTRBX,它们执行的操作分三步进行,具体为: SP-2SP; CALL指令的下一条指令的IP入栈; BXIP或DS:BX单元字内容IP;,对应的RET指令执行的操作与段内直接过程的返回指令相类似。,段间直接调用 例3-85 CALL FAR PTR PROG_F;远标号 该指令占5个字节,编码格式为:,执行远调用CALL指令的过程为:,SP-2SP,然后返回地址段地址CS=1000H入栈;,SP-2SP,然后返回地址偏移地址IP=205FH入栈;,转子程序入口,将PROG_F的段地址和偏移地址分别送到CS和IP寄存器。即3000HCS,0500HIP,执行子程序,过程PROG_F中的RET指令的寻址方式也是段间直接调用,返回时执行的操作为:,SP+2SP,然后将栈中内容205FHIP; SP+2SP,然后将栈中内容1000HCS ; 所以程序将返回到CS:IP=1000:205FH处即CALL指令的下一条指令处继续执行。,段间间接调用 这类调用指令的操作数必须是存储单元,从该单元开始存放的双字表示过程的入口地址,其中前2个字节是偏移量IP,后两个字节是代码段地址CS。指令中用DWORD PTR说明是对存储单元进行双字 操作。,2.条件转移指令 条件转移指令是根据上一条指令执行后,CPU设置的状态标志作为判别测试条件来决定是否转移。每一种条件转移指令都有它的测试条件,当条件成立,便控制程序转向指令中给出的目的地址,去执行那里的指令,否则,程序仍顺序执行。,条件转移指令通常用在比较指令或算术运算指令之后,根据比较或运算结果,转向不同的目的地址。在指令中,目的地址均用标号表示,因此指令的格式为: 条件操作符 标号,条件转移指令共有18条,可以归类成以下两大类:,(1)直接标志转移指令 这类转移指令在指令助记符中直接给出标志状态的测试条件,它们以CF,ZF,SF,OF和PF等5个标志的10种状态为判断的条件,共形成10条指令。,例3-87 求AL和BL寄存器中的两数之和,若有进位,则AH置1,否则AH清0。可用如下程序段来实现该操作: ADD AL,BL;两数相加 JC NEXT;若有进位,转NEXT MOV AH,0;无进位,AH清0 JMP

温馨提示

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

评论

0/150

提交评论