1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,3章,8086微机机器语言指令,教学目标,:掌握数据操作数的寻址方式;掌握数据传送指令、加减运算指令、位操作指令的功能与用法;了解其它指令的作用。,教学重点,:常用指令的功能与用法。,教学难点,:指令的应用。,3.1.1,指令格式,一条指令是一个有意义的二进制代码序列,它是机器语言的一个语句,其基本格式为:,操作码字段,OP,地址码字段,A,操作码表明了指令的功能及操作,地址码又称操作数字段,指明了参与操作运算的操作数地址。,1.指令操作码,指令系统中每条指令都有唯一确定的操作码。操作码的位数越多,所能
2、表达的操作种类就越多。,(1)规整型,操作码字段的长度和位置固定,又称定长编码,编码最简单。定长编码多用在大中型计算机上,如,IBM 370,机指令操作码都为,8,bit(,位,),。,RISC,指令集采用定长编码。定长编码有利于简化硬件设计、减少指令译码时间;但往往造成资源浪费(冗余)。,(2)非规整型,非规整型操作码的长度不定,且分散在指令字的不同位置上,因此又称变长编码。变长编码广泛用在小型、微型计算机上,如,PDP,小型机。,CISC,指令集是非规整型编码。,1.指令操作码(续),扩展操作码法:灵活充分利用指令的各个字段,在不增加指令长度的情况下,扩展操作码能表示更多的指令。,80,x
3、86,微处理器采用扩展操作码法。,变长编码增加指令译码的难度,控制器的设计较复杂。,2.指令地址码,每条指令必须包括,CPU,执行所需的全部信息。对双操作数指令,除了操作码,OP(Operate),外,还必须包含:第一源操作数地址,A1(Address1),、,第二源操作数地址,A2,、,操作结果的存放地址,A3,,,以及下条指令在内存中的存放地址,A4,。,程序计数器,PC(Program counter),来指向要执行指令的地址,,现代计算机地址码字段有四种结构:三地址、双地址、单地址和零地址。,三地址指令格式:,OP A1 A2 A3,;,操作为:,A1 OP A2,A3,PC+1,PC
4、隐含),三地址指令在小型、微型计算机中很少使用。,双地址指令格式:,OP A1 A2,;,操作为:,A1 OP A2,A1,,,PC+1,PC,(,隐含),执行前,,A1,和,A2,中各存放一个源操作数,执行后结果存放到,A1,中,,A1,中原先的源操作数被冲掉。因此,A2,称源操作数,,A1,称目标操作数(又称目的操作数)。,3.1.2,基本寻址方式,1.寄存器寻址,操作数就存放在,CPU,通用寄存器中,存取操作数无需访问内存,指令执行速度快。,8086/8088,CPU,有,8,个通用寄存器,指令中只用,3,bit,即可表示,如下表所示。,2.,I/O,端口寻址,(1)直接寻址,指令
5、中用,8,位无符号数直接表示,I/O,端口地址号。如:,IN AL,n,;,输入:,AL,n,,,n,在,0,255,之间,表示端口号,(2)间接寻址,DX,指向,I/O,端口,即用,DX,内容(,16,位无符号数)表示,I/O,端口地址编号,范围在,0,65535,之间。,如:,OUT DX,AL,;,输出:,DX,AL,3.,存储器寻址,(1)立即寻址,指令地址码字段就是操作数本身。立即数只能作为源操作数。,(2)直接寻址,指令地址码字段直接给出操作数在段内的偏移量,段基址隐含给出或由段前缀指明。指令语句中,直接地址(一般为,16,位无符号数)用方括号括起来。,段隐含:,EA,DS,16,
6、偏移地址,段显式:,EA,段寄存器,16,偏移地址,(3)寄存器间接寻址,操作数在段内的地址在基址寄存器,BX,、,BP,或变址寄存器,SI,、,DI,中,根据寄存器的内容(段内的偏移地址值)到存储器中寻找操作数;段基址可用段前缀显式表示,更多的是隐含表示。,段隐含:,EA,DS,16,(,BX,或,SI,或,DI,),EA,SS,16,BP,段显式:,EA,段寄存器,16,(,BX,或,BP,或,SI,或,DI,),(4)寄存器相对寻址,操作数在段内的偏移地址为基址,/,变址寄存器内容加上指令中给出的,8,位或,16,位偏移量。段基址表示同(,3,)。,段隐含:,EA,DS,16,(,BX,
7、或,SI,或,DI,)(,8,位或,16,位偏移量),EA,SS,16,BP,(,8,位或,16,位偏移量),段显式:,EA,段寄存器,16,(,BX,或,BP,或,SI,或,DI,)(,8,位或,16,位偏移量),(5)基址变址寻址,操作数在段内的偏移地址是基址寄存器,BX,或,BP,与变址寄存器,SI,或,DI,的内容之和。段基址表示同上。,段隐含:,EA,DS,16,BX,(,SI,或,DI,),EA,SS,16,BP,(,SI,或,DI,),段显式:,EA,段寄存器,16,(,BX,或,BP,)(,SI,或,DI,),(6),基址变址相对寻址,操作数在段内的偏移地址是基址寄存器,BX,
8、或,BP,加上变址寄存器,SI,或,DI,内容再加上指令中给出的,8,位或,16,位偏移量,段基址表示同上。,段隐含:,EA,DS,16,BX,(,SI,或,DI,)(,8,位或,16,位偏移量),EA,SS,16,BP,(,SI,或,DI,)(,8,位或,16,位偏移量),段显式:,EA,段寄存器,16,(,BX,或,BP,)(,SI,或,DI,)(,8,位或,16,位偏移量),堆栈寻址,微机中普遍使用堆栈操作。堆栈操作中一个操作数隐含在栈顶(出栈为源操作数、入栈为目标 操作数),由,SP,或,ESP,(,堆栈指针)隐含指示;段基址:由,SS,段寄存器索引找到,不用在指令中表明。对堆栈的访问
9、实际上是隐含的寄存器间接寻址方式。,指令寻址,对下条指令的寻址在代码段中进行。顺序执行时由,PC,内容自动加,1,(硬件实现)完成,段内转移时一般都用相对寻址方式,即,PC,内容加上一个相对值(由 当前下条指令到转移的目标指令间的字节距离);段间转移则多采用直接寻址方式或间接寻址方式完成。,3.2,CISC,基本指令集,80,x86,微机属于,CISC,(,复杂指令集计算机),,8086/8088,指令系统是,CISC,基本指令集,只能在实地址方式下执行单任务操作。,8086/8088,指令系统有基本指令,133,条,按功能可分为六大类 数据传送指令、算术运算指令、位处理指令、程序控制指令、串
10、操作指令和处理机控制指令。,3.2.1,数据传送指令,数据传送指令:分四类 通用数据传送、累加器专用传送、地址传送和标志传送指令。,数据传送指令都不影响标志寄存器,FL,的标志位,除了两条以标志寄存器为传送目标的指令(,SAHF,和,POPF,),外。,1.通用数据传送指令,通用数据传送指令包括,MOV,传送、交换指令和堆栈操作指令。,(1),MOV,传送指令,MOV,指令的汇编语句格式及注释说明如下:,MOV,Dst,Src,;,Dst,Src,,,Dst,和,Src,可为,Reg,、,Mem,,,Src,还可为,Im,。,MOV,指令将源操作数送到目标操作数单元,而源操作数保持不变,源和目
11、标操作数长度必须一致。源和目标不能同为,Mem,,,作为存储器操作数,,Mem,可以是所有寻址方式,MOV CL,AL ;8,位寄存器传送,,CL,AL,MOV DS,AX,;,16,位通用寄存器与段寄存器之间传送,,DS,AX,MOV CX,100,;,16,位立即数,0064,H,向通用寄存器传送,,CX,64H,MOV TABSI,AL,;,8,位通用寄存器与存储器间数据传送,SI+TAB,AL,MOV DATABXDI,CS ;,段寄存器向存储器,16,位数据传送,,BX+DI+DATA,CS,(2),交换指令,交换指令是两个通用寄存器或通用寄存器与内存单元之间交换数据。指令的汇编语句
12、格式及注释说明如下:,XCHG,Dst,Src,;,DstSrc,Dst,和,Src,为,Reg、Mem,操作数,XCHG AH,AL ;8,位寄存器互相交换,,AHAL,XCHG DX,AX ;16,位寄存器互相交换,,DXAX,XCHG BX,TABSI ;,寄存器与存储单元间16位数据交换,,BXSI+TAB,(3)堆栈指令,堆栈是后入先出队列,LIFO(Last-In-First-Out Queue)。,堆栈操作有两种:压入,PUSH(,数据被填充到栈顶)和弹出,POP(,数据出栈顶)。堆栈指针,SP:,基本指令集中堆栈每次操作都是16位数据,栈顶向下生成 每次,PUSH,操作,SP,
13、减2,每次,POP,操作,SP,加2,,SP,始终指向栈顶。,堆栈指令语句格式及注释说明如下:,PUSH,Src,;SPSP-2,SPSrc,POP,Dst,;DstSP,SPSP+2,PUSH AX ;,寄存器入栈,,SPSP-2,SPAX,PUSH ES ;,段寄存器入栈,,SPSP-2,SPES,PUSH BUFFERBX ;,存储器操作数入栈,,SPSP-2,SPBX+BUFFER,POP CX ;,出栈到寄存器,,CXSP,SPSP+2,POP DS ;,出栈到段寄存器,,DSSP,SPSP+2,POP DATASI ;,出栈到存储器单元,,SI+DATA,SP,,,SP,SP+2,
14、2.,累加器专用传送指令,(1)输入/输出指令,IN Acc,n ;Acc,n,,,Acc,为,AX(16,位输入,n,为偶数,),或,AL(8,位输入,),,,n=0,255,IN Acc,DX ;Acc,DX,,,Acc,同上,,DX,当前值为,I/O,端口地址,OUT n,Acc ;n,Acc,,,Acc,与,n,同上,,OUT DX,Acc ;DX,Acc,,,Acc,同上,,DX,当前值为,I/O,端口地址,IN AX,86H ;,从,86,H,端口输入,16,位数,,AX,86H,IN AL,DX ;,从,DX,所指向的端口输入,8,位数,,AL,DX,OUT 61H,AL ;,向
15、60,H,端口输出,8,位数,,61,H,AL,OUT DX,AX ;,向,DX,所指向的端口输出,16,位数,,DX,AX,(2)查表指令,查表指令,XLAT,用于根据,AL,的内容到字节表格中查找相应位置元素的代码。,XLAT,指令执行前,必须将字节表格的首地址放入,BX,中,,AL,中内容为索引值,即所查找元素在表格中的位置(与表首的字节距离)。指令执行后将查到的元素代码放到,AL,中(,AL,原来的索引值被冲掉)。该指令格式有两种,如下所示:,XLAT;,或者,XLAT OPR;,LEA BX,DISP,MOV AL,8,XLAT,OUT 60H,AL,例:当前数据段中从,DISP(
16、2000H),单元开始连续存放十六进制数码,0,F,的,LED,显示代码,编程将,“,8,”,字的显示代码送到,60,H,端口(显示)。,3.,有效地址和地址指针传送指令,(1)有效地址传送指令,LEA,LEA,指令把源操作数在段内的偏移地址送入指定的,16,位寄存器,而不是传送该地址单元内的操作数。,LEA,指令格式及注释说明如下:,LEA,Reg,Mem,;,R16,Mem,存储器操作数的地址,(2)地址指针传送指令,地址指针传送指令有两条:,LDS,和,LES,,,它们都是把源操作数(所有寻址方式的存储器操作数)指定的,4,个相继字节单元内容作为一个地址指针送到指定的,16,位寄存器与
17、段寄存器,DS,或,ES,中。指令语句的格式及注释说明如下:,LDS,Reg,Mem,;,Reg,Mem,,,DS,Mem,+2,LES,Reg,Mem,;,Reg,Mem,,,ES,Mem,+2,4.,标志传送指令,标志传送指令在标志寄存器,FL,与通用寄存器,AH,(,8,位)或堆栈(,16,位)之间传送数据,共,4,条:,LAHF ;AH,FL-l,(,低字节),保存,SF,、,ZF,、,AF,、,PF,、,CF,到,AH,中,PUSH ;SP,SP-2,,,SP,FL,,,标志寄存器,FL,入栈,SAHF ;FL-l,(,低字节),AH,,,恢复保存在,AH,中的,SF,、,ZF,、,
18、AF,、,PF,、,CF,POPF ;FL,SP,,,SP,SP-2,,,恢复保存在堆栈中的所有标志位,传送指令种类多,应用最频繁。,传送指令汇编格式和语句操作、字节数、执行时间(时钟周期数)等 汇总于下表中。,3.2.2,算术运算指令,CISC,基本指令集提供了加、减、乘、除四种基本算术运算,运算操作数可以是,8,位或,16,位、可以是无符号数或有符号数,通过调整还可以进行十进制(,BCD,),数运算。算术运算指令执行结果一般都影响标志寄存器,FL,的状态标志位。,加减运算比较丰富。加减运算的操作数如下图所示,其中,Mem,为所有寻址方式的存储器操作数。,1.加法运算,加法指令有,3,条。指
19、令语句格式及注释说明如下:,ADD,Dst,Src,;,Dst,Dst,+,Src,,,Dst,为,Reg,、,Mem,,,Src,为,Reg,、,Mem,、,Im,;,Dst,和,Src,不可同为,Mem,ADC,Dst,Src,;,Dst,Dst,+,Src,+CF,,,Dst,、,Src,同上,INC,Dst,;,Dst,Dst,+1,,,Dst,同上,1.加法运算(续),两个,32,位加数,98765432,H,和,8901,FA45H,分别存放在数据段内,2000,H,单元和,2004,H,单元,编程将两数相加,结果从,2100,H,单元开始存放。,基本指令集没有,32,位加法指令,
20、32,位的加法程序段如下:,MOV AX,2000H,;,AX=5432H,,,被加数低,16,位,MOV BX,2002H,;,BX=9876H,,,被加数高,16,位,ADD AX,2004H,;,低,16,位相加,,AX=4E86H,ADC BX,2006H,;,高,16,位及低,16,位的进位相加,,BX=2178H,MOV 2100H,AX,;,存低,16,位的和,4,E86H,MOV 2102H,BX,;,存高,16,位的和,2178,H,MOV AX,,,0,ADC AX,0,;,获得最高位的进位,MOV 2104H,AX,;,存和的最高位,2.,减法指令,减法运算指令有,5,
21、条。指令语句格式及注释说明如下:,SUB,Dst,Src,;,Dst,Dst,-,Src,,,Dst,和,Src,同,ADD,指令,SBB,Dst,Src,;,Dst,Dst,-,Src,-CF,,,Dst,和,Src,同上,CMP,Dst,Src,;,Dst,-,Src,,,不保存结果,仅影响状态标志,,Dst,和,Src,同上,DEC,Dst,;,Dst,Dst,-1,NEG,Dst,;,Dst,0-,Dst,(,即,Dst,+1,比较指令,CMP,作两数相减运算而不存结果(被减数和减数都保持不变),但结果的特征影响,FL,寄存器的,6,个状态标志,据此比较两个数的大小,判断如下:,若,Z
22、F=1,,,表明相减结果为,0,,则两数相等。,若,ZF=0,,,表明两数不等,须再判,CF,(,无符号数)或,SF,和,OF,(,有符号数),无符号数,判,CF,:,CF=0,说明无借位,则,Dst,Src,,,否则,Dst,Src,有符号数同时判,OF(,溢出标志,),和,SF(,符号标志,),:同号,Dst,Src,,,异号,DST,Src,对上述结论,请根据,Dst,和,Src,同号,/,异号、是否溢出等情况分析之。,2.,减法指令(续),32,位的被减数和减数分别存放在,FIRT,和,SECOND,单元,求两数之差,结果放入,THIRD,开始的单元中。,基本指令集没有,32,位减法指
23、令,,32,位减法程序段,用如下六条指令实现之:,MOV AX,FIRST,;,取被减数低,16,位到,AX,SUB AX,SECOND,;,低,16,位相减,MOV THIRD,AX,;,存低,16,位差,MOV AX,FIRST+2,;,取被减数高,16,位到,AX,SBB AX,SECOND+2,;,高,16,位相减,并减去低,16,位的借位,MOV THIRD+2,AX,;,存高,16,位差,如果,FIRST,和,SECOND,是符号相异的有符号数,相减可能产生溢出,如何编程?请参考上例改编之。,3.,乘法指令,乘法指令分字节(,8,位)乘和字(,16,位)乘,要求:被乘数事先放在,A
24、L,或,AX,中,被乘数为隐含寻址;乘数放在寄存器或存储器单元中,指令中只显式地表示乘数。乘积为双字长,存放于,AX,(,8,位乘)或,DXAX,(,16,位乘)中。,乘法指令有两条:无符号数乘和有符号数乘。,指令语句格式及注释说明如下:,MUL,Src,;,8,位乘:,AX,AL*,Src,,,16,位乘:,DXAX,AX*,Src,;,Src,为,8,位或,16,位通用寄存器或所有寻址方式的存储器操作数,IMUL,Src,;,同上,但被乘数、乘数和双字长乘积都是有符号数,与加减指令不同,乘法指令执行只确定地影响,CF,和,OF,状态:若乘积的高半部分为,0,(,MUL,指令)或者为低半部分
25、符号位的扩展(,IMUL,指令)则,CF,和,OF,均为,0,,否则均为,1,;对其余状态位的影响不确定。,已知,AL=0FFH,,,SI=0FFH,,(,0FFH,可视为无符号数,255,或有符号数,-1,),若执行指令,MUL SI,;,则,AX=0FE01H,(,即,255*255=65025,),若执行指令,IMUL SI,;,则,AX=0001H,(,即(,-1,),*,(,-1,),=1,),4,除法指令,除法是乘法的逆运算,要求:被除数为双字长,放在,AX,(,8,位除法)或,DXAX,(,16,位除法)中;除数在指令中显式地指定,为,8,位或,16,位的寄存器或所有寻址方式的存
26、储 器操作数;商放在,AL,(,8,位除法)或,AX,(,16,位除法)中,余数放入,AH,(,8,位除法)或,DX,(,16,位除法)中;有符号除法的余数和被除数同号。,除法指令有无符号数除法,DIV,和有符号数除法,IDIV,两条。为了将被除数扩展为双字长,还有两条相应的符号扩展指令,CBW(8,位扩展为16位)和,CWD(16,位扩展为32位)。,除法指令语句格式及注释说明如下:,DIV,Src,;8,位除,AX,Src,AL,商,AH,余数;16位除,DXAX,Src,AX,商,DX,余数,IDIV,Src,;,同上,但被除数、除数和商、余数都是有符号数,;余数和被除数同号,CBW ;
27、AL,的符号位扩展到,AH,中,不影响状态标志。,CWD ;AX,的符号位扩展到,DX,中,不影响状态标志。,两条除法指令对,FL,的状态标志均无确定的影响。,4,除法指令(续),若被除数高半部分的绝对值大于除数,执行除法指令将产生溢出,引起,0,类中断。,已知,x,、,y,、,z,均为,16,位有符号数,已分别装入,X,、,Y,、,Z,单元,编程计算:,(,x*y+z-568)/x,,,商放入,AX,中,余数放入,DX,中。,MOV AX,X,;,AX,被乘数,IMUL Y,;,求,x*y,MOV CX,AX,;,BXCX,32,位乘积,MOV BX,DX,MOV AX,Z,;,AX,加数,
28、z,CWD,;,将加数,z,扩展成,32,位,ADD AX,CX,;,32,位相加,ADC DX,BX,SUB AX,568,;,减去,16,位立即数,568,SBB DX,0,;,高,16,位减去低,16,位的借位,IDIV X,;,双字长被除数除以,16,位除数,x,5.,十进制调整指令,DAA,;,加法十进制调整指令,将,AL,中的和调整成压缩型,BCD,数,DAS,;,减法十进制调整指令,将,AL,中的差调整成压缩型,BCD,数,调整规则如下:,(,AL,0FH,),9,)(,AF=1,),,则,AL,AL,6,,,AF,1,(,AL,9FH,)(,CF=1,),,则,AL,AL,60
29、H,,,CF,1,已知,AH,和,AL,中有两个十进制数,28,和,59,(即,BCD,数,28,H,和,59,H,),,BH,和,BL,中有两个十进制数,85,和,37,(即,BCD,数,85,H,和,37,H,),,分别做十进制加减运算如下:,ADD AL,AH,;,AL=81H,DAA,;,AL=87H,(,28,与,59,之和的,BCD,结果),MOV AL,BH,;,AL,85H,SUB AL,BL,;,AL=4EH,DAS,;,AL=48H,(,即,85,与,37,之差的,BCD,结果),上机内容,:,1,假定,(AL)=48H,(BL)=59H,执行,ADD AL,BL DAA,
30、后,运行结果是什么,?,2,如,(BCD1)=34H,(BCD2)=89H,编程使,(BCD3)=BCD1)+(BCD2),其中各变量为两位,BCD,数,3,如,(BCD1)=1834H,(BCD2)=2789H,编程使,(BCD3)=BCD1)+(BCD2),其中各变量为四位,BCD,数,4,如,(BCD1)=1834H,(BCD2)=2789H,编程使,(BCD3)=BCD1)-(BCD2),其中各变量为四位,BCD,数,5,已知各变量为两位,BCD,数,编程使,U=V+(S-6),6,已知各变量为四位,BCD,数,编程使,U=V+(S-6),算术运算指令汇编格式和语句操作、指令字节数、执
31、行时间(时钟周期数)及对状态标志位的影响等汇总于右表。,3.2.3,位操作指令,位操作包括逻辑运算、移位和循环移位。位操作指令执行结果都将影响,FL,标志寄存器相应状态标志位,,NOT,除外。,1.逻辑运算指令,逻辑运算指令有五条:与(,AND)、,或(,OR)、,非(,NOT)、,异或(,XOR),和测试(,TEST),AND,Dst,Src,;,Dst,Dst,Src,Dst,为,Reg,、,Mem,,,Src,为,Reg,、,Mem,、,Im,;,Dst,和,Src,不能同为,Mem,OR,Dst,Src,;,Dst,Dst,Src,,,Dst,与,Src,同上,NOT,Dst,;,Ds
32、t,0-,Dst,,,Dst,同上,XOR,Dst,,,Src,;,Dst,Dst Src,,,即,Dst,DstSrc,,,Dst,与,Src,同上,TEST,Dst,Src,;,Dst,Src,不存结果,只影响状态标志位,Dst,与,Src,同上,对一个位串,,AND,可以屏蔽(清0)某些位,,OR,可以置位(置1)某些位,,XOR,可以取反某些位,,XOR,可以检查两个位串是否匹配。,AND AX,0;AX,清0,AND CL,0FH;,屏蔽,CL,的高4位,OR BH,00111100B;,将,BH,的中间4位置位,XOR BL,0F0H;,将,BL,高4位变反,XOR DX,378H
33、DX,中端口地址是,378,H,吗?是则结果为,0,(使,ZF=1,),NOT,指令执行不影响状态标志,其他逻辑指令执行后将重新设置,SF、ZF、PF,的 状态,而总使,CF=0、OF=0,AF,状态不确定。,2.,移位指令,移位有逻辑移位和算术移位两种,每种又分左移和右移。算术左移,n,位相当于,2,n,,,右移,n,位相当于,2,n,。,移位的对象可以是寄存器或所有寻址方式的存储器操作数,移位的次数在指令中给出:,1(,只移位,1,次)或,CL(CL,中的数值即移位的次数)。,逻辑左移和算术左移完全等价,因此移位指令实际上只有,3,条(但有,4,种格式)。,例:将,DX,和,AX,中
34、的低,8,位拼成一个,16,位数放在,DX,中,要求原,DX,中的低,8,位置于,16,位数中的高位。,MOV CL,8,SHL DX,CL,AND AX,0FFH,OR DX,AX,3.,循环移位指令,循环移位首尾相连移位(不丢失移位单元的位信息),分带进位移位(,CF,在循环链之内)和不带进位移位(,CF,在循环链之外),同时又分左移和右移。移位的对象和次数同移位指令。,3.,循环移位指令,AX,中有,16,位数,X,,,求,X,3,16,,,要求不损失任何有效位。,X,3,16,X,(,2,1,),16,X,8,X,16,,,程序段如下:,MOV BX,0,SAR AX,1;,以下求,X
35、8,,先求,X2,RCR BX,1;,SAR AX,1;,求,X4,RCR BX,1;,SAR AX,1;AXBXX8,RCR BX,1;X,中低3位移至,BX,高3位,PUSH AX;,保存,X8,PUSH BX,SAR AX,1;,求,X16,RCR BX,1,POP DX,ADD BX,DX,POP DX,ADC AX,DX;AXBXAX316(,高位在,AX,中,低位在,BX,中),3.,循环移位指令,(续),位操作指令的汇编格式、语句操作、字节数、执行时间及对标志位的影响汇总于右表。,3.2.4,程序控制指令,程序控制指令能选择不同的程序段执行,可构成转移、循环、调用和返回,控制程序
36、执行的流程。,1.控制转移指令,转移指令分无条件转移和条件转移两类,它们本身执行后都不影响,FL,寄存器的状态标志。,(1)无条件转移指令,无条件转移指令,JMP ,,,控制程序转移到,TARGET,(,目标)标号处去执行。按,TARGET,目标地址单元的属性有四种转移范围、五种指令格式。,JMP SHORT,TARGET,;,段内直接短转移,JMP NEAR PTR,TARGET,;,段内直接近转移,JMP WORD PTR,TARGET,;,段内间接转移,JMP FAR PTR,TARGET,;,段间直接转移,JMP DWORD PTR,TARGET,;,段间间接转移,(1)无条件转移指令
37、续),段内转移只改变,IP,值,,CS,(,代码段基址)不变。段内直接转移为相对寻址,将,IP,指向的(下条)指令距目标,TARGET,的偏移量(字节距离)与,IP,的当前值相加后送,IP,;,段内短转移的偏移量为,8,位、(以当前指令位置为准的)转移范围 为,129,-126,(若以,IP,当前值为准则为,127,-128,),段内直接近转移的偏移量为,16,位、(以当前指令位置为准的)转移 范围为,32769,-32766,(若以,IP,当前值为准则为,32767,-32768,);段内间接转移是绝对寻址,,TARGET,是一个,16,位的寄存器或存储器 单元,将其内容直接赋给,IP,。
38、段间转移跨段 段间直接转移将指令中给出的,TARGET,偏移量和段基址赋给,IP,和,CS,,,段间间接转移将指令中给出的,TARGET,存储单元开始的,4,个字节分别 赋给,IP,和,CS,,,从而实现跨段转移。,(1)无条件转移指令(续),(2),条件转移指令,条件转移指令测试标志寄存器,FL,的当前状态标志,满足条件就转移到目 标地址去执行,否则顺序向下执行。条件是对一个或两个或三个状态标志位的状态判断。,(2),条件转移指令(续),所有条件转移指令的执行时间都是,16,T/4T,(,转移,/,不转移)。,例:一个16位数的数组存储在以,ARRAY,为首地址的数据段中,长度为,n(,小
39、于256)。编程求数组中正数、0及负数的个数,分别存放在,BH、BL、DL,中。,MOV CX,;,数组长度送计数器,CX,MOV AX,0,MOV SI,AX;,数组指针初始化为0,MOV BX,AX;,结果寄存器清0,MOV DL,AL,AGAIN:CMP AX,ARRAYSI;,比较,JG PLUS,JZ ZERO,INC DL;,是负数,负数个数寄存器加1,JMP NEXT,ZERO:NC BL;,是0,0个数寄存器加1,JMP NEXT,PLUS:INC BH;,是正数,正数个数寄存器加1,NEXT:ADD SI,2;,指向下一个数组元素,DEC CX,JNZ AGAIN;,未结束则
40、继续,从,80386,开始,扩大了条件转移的范围,实模式下能够转移到代码段的任何位置。,2.,循环指令,循环程序非常普遍,用条件指令可实现之;为方便编程,基本指令集特意提供了,4,条循环指令。,循环指令放在循环程序的开头或结尾,测试,CX,是否为,0,、以及,ZF,标志的状态,来控制循环结束与否。循环指令长度都是,2,个字节,一个字节操作码加,8,位偏移量,循环转移范围为,-128,127,。循环指令执行不影响标志寄存器,FL,的状态标志。,2.,循环指令(续),例:一字符串长度(,256),存放在,ASCIISTR,单元,,ASCIISTR,单元之后接着存放该字符串。请编程判断该字符串中是否
41、有“空格”字符:若有,DL,置,1,,否则,DL,清,0,。,MOV BX,0,;,地址指针初始化为,0,MOV DL,BL,;,预置没有“空格”标志,MOV AL,20H,;“,空格”字符送,AL,MOV CX,ASCIISTRBX,;,串长度送,CX,NEXT:INC BX,CMP AL,ASCIISTRBX,;,是空格吗?,LOOPNZ NEXT,JNZ DONE,MOV DL,,,01H,;,置有“空格”标志,DONE:,;,没有,“,空格,”,,继续运行,32,位的,80,x86,微处理器还可以使用32位的,ECX,作为隐含的循环计数器。即便,80486,,循环指令也只能在短距离内作
42、循环,即相对于当前循环指令的地址,转移的范围为,129,-126,。,3.,子程序调用指令,CALL,和返回指令,RET,子程序调用不同于转移指令,首先要把,CALL,指令的下一条指令地址(即返回地址)入栈保存,然后转向子程序的首地址去执行。调用分段内调用和段间调用。段内调用只对,IP,操作,(,CS,不变),段间调用要同时对,CS:IP,操作。段内,/,段间调用又分直接调用和间接调用。调用和返回指令都没有条件判断,且,都不影响标志寄存器,FL,的标志位。,4.,中断指令,INT,和中断返回指令,IRET,中断指令,INT,是种特殊的调用指令(调用例行中断子程序),是段间调用;与段间,CALL
43、指令相同的是:须先把,CS:IP,入栈保存,不同的是:还要首先把标志寄存器,FL,入栈保存。中断返回是段间返回,执行,IRET,指令,依次恢复,IP,、,CS,和,FL,。,3.2.5,串操作指令,串是由字节、字、或双字组成的字符或数据序列,存放在存储器中。,基本指令集处理的串长度不超过,64,K,。,串操作常用于数据块的快速移动、比较、搜索和存取,执行一次操作串中一个元 素,配上重复前缀可按条件完成对整个串的操作。,1.,串操作的寻址与控制,(1),串操作均为隐含寻址,源串起始地址在,DS:SI,中,目标串起始地址在,ES:DI,中。,AL/AX,为串扫描的关键字,或存串的源操作数、取串的
44、目标操作数。,(2),串操作时自动修改地址指针,SI,和,DI,。,当标志寄存器,FL,的控制标志位,DF=0,时每完成 一次串元素操作,SI,和,DI,自动增量,当,DF=1,时,SI,和,DI,自动减量;如果串元素是字节,,SI,和,DI,每次加,1,或减,1,;如果串元素是字,,SI,和,DI,每次加,2,或减,2,。,(3),串长度在,CX,中,每完成一次串元素操作,CX,自动减,1,(不管串元素是字还是字节)。,(4),源串和目标串在不同的段内,分别由,DS,和,ES,指明。若,DS,和,ES,相等则两串在相同物 理段中。,(5),串比较和串扫描都是作减法操作,所以每次串操作都影响对
45、标志寄存器,FL,的,6,个状 态标志,而串传送、存串和取串都是作传送操作,所以都不影响,FL,的状态标志位。,(6),加重复前缀则串操作指令重复执行。串指令在重复执行过程中,SI,、,DI,和,CX,自动修改,但指令指针,IP,保持指向重复前缀的 存储地址。因此串操作可以被中断,中断返回后可继续原来的串操作。,(7),串操作指令本身都是单字节指令,加上重复前缀共,2,个字节,可对串中元素按条件 重复操作。,2.,重复前缀,重复前缀指令的名称、汇编格式、重复条件、后续的串指令及操作见下表。,重复前缀也是一条指令,但不能单独使用,需加在串操作指令之前,使 串操作指令重复或条件重复执行,相当于运行
46、一个循环程序;取串指令,LODS,一般不加重复前缀,因为重复取出串中的元素送到累加 器,Acc,无意义(后面取出的数冲掉前面取出的数)。,3.2.6,处理器控制指令,处理器控制指令执行对标志位(,CF,、,DF,、,IF,),的置位,/,复位操作和其它控制操作。,处理器控制指令的汇编格式、语句操作、目标代码、执行时间等汇总于下表中。,3.3,扩展指令集,3.3.1,一般扩展指令集,32,位,80,x86,微机存储器寻址空间大大扩展(达,4,GB,或,64,GB,),,操作数宽度也扩展至,32,位,指令功能进一步丰富,因此指令长度也有所扩展,达,1,12,个字节:,1,2,个字节操作码字段,,0
47、2,个字节寻址方式码字段,,0,、,1,、,2,、,4,个字节的偏移量字段,,0,、,1,、,2,、,4,个字节的立即数字段,不超过,4,个字节的前缀码段。,80,x86,指令集在基本集基础上扩展而来,依次是,286,(,16,位处理器)、,386,、,486,指令集,在代码级保持向上兼容。扩展主要表现在,32,位寻址和,32,位操作,还体现在指令种类增多、功能增强,如浮点数运算指令、操作系统型指令,指令操作数也扩展到,3,个等等。,80,x86,常用扩展指令,(,续,),80,x86,常用扩展指令,(,续,),3.3.2,多媒体,SIMD,指令集,SIMD(Single Instructi
48、on Multiple Data,:,单指令多数据,),一条指令能处理多个数据,使操作的并行性进一步增强,提高了计算机的多媒体处理能力。,SIMD,指令集是开放的:包括,MMX,、,3D NOW,!、,SSE,和,SSE2,等。,1.,MMX,指令集,游戏、音乐合成、语音压缩,/,解压、图像图形处理、,MPEG,视频等应用程序具有一些共同特征:,短整数数据类型(像素:,8/16,位,音频:,16,位),频繁的乘与累加,高度重复的小循环体,巨大计算量的算法,高度并行操作,MMX,技术借用现成的浮点堆栈生成,8,个,64,位,MMX,寄存器,,MMX,寄存器支持四种新型数据类型:紧缩字节(,8,个
49、字节)、紧缩字(,4,个字)、紧缩双字(,2,个双字)和四字,可将它们移入,MMX,寄存器同时完成对多个数据的算术运算和逻辑运算,特别适合整数运算密集的图像处理、视频和音频回放等多媒体应用,提高其性能。,1.,MMX,指令集,MMX,指令有,57,条,包括算术运算(加、减、乘、除、算术移位和累加)、比较、逻辑操作(与、与非、或、异或)、转换操作(把数据紧缩和拆放)、移位操作、移数(在,MMX,寄存器之间、,MMX,寄存器与存储单元之间移入,/,移出)。,1.,MMX,指令集(续),音像多媒体数据流算法中常用到矢量点积、矩阵乘、,FIR/IIR,滤波、,FFT/DCT,变换等,指令,PMADDW
50、D,(,紧缩字相乘并相加)就可方便快速地完成这类运算。,PMADDWD,:,16,位,16,位,32,位(积)再累加,a3 a2 a1 a0,b3,b2,b1,b0,a3,b3+a2,b2 a1,b1+a0,b0,该指令将两组,4,个,16,位数对应相乘,得到,4,个,32,位乘积,再将高两个乘积相加存入一个,MMX,寄存器的高,32,位(,D,63,D,32,),,将低两个乘积相加存入同一,MMX,寄存器的低,32,位(,D,31,D,0,)。,一条,PMADDWD,指令可同时处理,4,个乘法和,2,个加法。,多数,MMX,指令可在一个时钟周期内完成。经测试,同样的,Pentium,芯片,采






