资源描述
单击此处编辑母版标题样式,Copyright 2005.9,mfy,ustc,.,edu,.,cn,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,8086/8088寻址方式及指令系统,第二部分,主要内容,1,寻址方式,2,指令格式及数据类型,3,指令系统,Copyright 2005.9,mfy,ustc,.,edu,.,cn,计算机语言分类,机器语言,低级语言,二进制形式,原始,使用不方便,已不再使用,汇编语言,中级语言,助记符形式。是用户能利用计算机所有特性直接控制硬件的惟一语言,它能直接使用,CPU,的指令系统和寻址方式,从而得到占用空间少,执行速度快的高质量代码,对于一些需要直接控制硬件的场合,汇编语言是必不可少的。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,汇编语言,-,助记符语言,典型的指令助记符,Copyright 2005.9,mfy,ustc,.,edu,.,cn,计算机语言分类,高级语言,分为面向对象(,Java,C+,等)和面向过程(,C、Fortran、Basic,等)两种。使用方便,编程效率高。,机器语言代码无须编译和连接;汇编语言代码和高级语言代码需要编译和连接,然后才可以在计算机上运行。,机器语言和汇编语言与,CPU,指令系统密切相关。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,3.1,寻址方式,汇编语言指令性语句格式:,指令,目的,操作数,,,源,操作数,汇编语言语句作用,第一,要指出进行什么操作,这由指令操作符来表明。,第二,要指出大多数指令涉及的操作数的来源和操作结果送到哪里去,即操作数的寻址问题。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,寻址方式,8086,的寻址方式:,操作数的寻址方式,(1),立即,数,寻址,(2),寄存器寻址,(3),直接寻址,(4),寄存器间接寻址,(5),基址,/,变址寻址方式,(6),基址,+,变址寻址方式,(7),串寻址,(8),I/O,端口寻址,操作数寻址,:操作数存放的位置,如何找到操作数,即如何生成操作数的物理地址,Copyright 2005.9,mfy,ustc,.,edu,.,cn,0).,有效地址,图,1存储器地址的计算,Copyright 2005.9,mfy,ustc,.,edu,.,cn,1),立即,数,寻址,立即操作数,可以是,8,位或,16,位,并且是指令的一部分,立即数总是和操作码一起被放入,BIU,中的指令队列里,在指令执行时不需再存取存储器。,MOV AX,1234H,;,十六进制数,1234,H,送入,AX。,需要,BIU,执行操作将立即数,1234,H,取到,CPU,内部吗?,Copyright 2005.9,mfy,ustc,.,edu,.,cn,2),寄存器寻址,操作数存放在指令规定的寄存器中,,对于,16,位操作数,寄存器可以是,AX,BX,CX,DX,SI,DI,SP,或,BP,;,而对,8,位操作数,寄存器可以是,AH,AL,BH,BL,CH,CL,DH,或,DL。,例如:,MOV AX,BX;,将寄存器,BX,的内容送入,AX,中,在哪里完成?需要,CPU,与其它部件交互吗?,Copyright 2005.9,mfy,ustc,.,edu,.,cn,3),直接寻址,操作数的有效地址,EA,是指令的一部分,如下例中,EA=2000H,,与操作码一起存放在代码段中,但操作数一般是在数据段中。,MOV AL,DS:2000H;,将逻辑地址为,DS:2000,单元,内的字节送入,AX。,若段基址,DS=4000H,,则段起始物理地址为,4000,H,左移,4,位,即,40000,H,,此指令将数据段中物理地址为,42000,H,单元的内容,56,H(,一个字节,)传到,AL,寄存器。,在什么地方?存储器还是寄存器?,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,4),寄存器间接寻址,操作数的有效地址,EA,存放在基址寄存器,(,BX,或,BP,),或变址寄存器,(,DI,或,SI,),中。,MOV AX,BX,;BX,内容为有效地址,EA(,偏移量,),。,若,DS=4000H,BX100H,,此指令将物理地址,40100,H,单元的内容传至,AX,寄存器,(,段基地址同样为,40000,H)。(,一个字,),Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,5),基址,/,变址寻址方式,操作数的有效地址,EA,是8,位或,16,位的位移量与基址寄存器,BX,或基址指示器,BP,或某个变址寄存器,(,DI,或,SI),之和。,MOV AL,BX+5,;,若,DS6000H,BX2000H,BX,的内容加上,8,位位移量,05,H,作为操作数的有效地址。传送数据段中的一个字节到,AL,中。如果使用,BP,,则隐含地表示操作数存放在堆栈段中。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,6),基址,+,变址寻址方式,有效地址,EA,是由基址寄存器,BX(,或基址指示器,BP),的内容与变址寄存器,(,DI,或,SI),的内容之和。,MOV AX,BX+SI;,BX,的内容与,SI,的内容之和作为操作数的有效地址。传送数据段中的,一个字,。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,6),基址,+,变址寻址方式,操作数的有效地址是一个,8,位或,16,位的位移量和一个基址加变址之和。,MOV AH,BX+DI+1234H ;,BX,的内容加上,DI,的内容再加上位移量,1234,H,作为操作数的有效地址。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,7),串寻址,用于,8086,的串操作指令中,源和目的操作数均位于内存单元中。,源操作数逻辑地址:,DS:SI,目的操作数逻辑地址:,ES:DI,重复操作时用方向标志,DF,控制地址改变,Copyright 2005.9,mfy,ustc,.,edu,.,cn,I/O,端口寻址,操作数在外部设备时,使用,I/O,指令:,IN,或,OUT。,通过,I/O,端口,访问外部设备。,外部设备用,8,位寻址时,使用直接端口寻址方式,直接给出端口地址。(,0-255,),外部设备用,16,位寻址时,使用寄存器间接寻址方式,端口地址,DX,。,IN AL,25H;,MOV DX,3E4H;OUT DX,AL;,Copyright 2005.9,mfy,ustc,.,edu,.,cn,3.2,指令操作数及数据类型,指令中的操作数,指令中的数据类型,Copyright 2005.9,mfy,ustc,.,edu,.,cn,指令中的操作数,单操作数指令,INC AX;40H,INC BX ;43H,双操作数指令,MOV AL,04;B004H,POP DI ;5FH,ADD AX,BX;01D8H,Copyright 2005.9,mfy,ustc,.,edu,.,cn,指令中的数据类型,(8/16,位),无符号数,带符号数,ASCII,码,BCD,码,Copyright 2005.9,mfy,ustc,.,edu,.,cn,3.3,指令系统,1,数据传送类,2,算术运算类,3,逻辑运算与移位指令,4,字符串处理,5,控制转移指令,6,处理器控制指令,Copyright 2005.9,mfy,ustc,.,edu,.,cn,1,数据传送类,1).,通用数据传送指令,2).,输入,输出指令,3).,目标地指传送指令,4).,标志位传送指令,Copyright 2005.9,mfy,ustc,.,edu,.,cn,1,数据传送类,Copyright 2005.9,mfy,ustc,.,edu,.,cn,1).,通用数据传送指令,格式:操作码,OPd,OPs,OPd,OPs,必须同为字节类型或同为字类型,;,运算结果送入,OPd,中,而源操作数,OPs,则不变,;,OPd,,,OPs,不能同时为存储器操作数;,目的操作数,OPd,不能是立即数,;,CS,和,IP,两个寄存器不能作为目的操作数。,如:,MOV,OPd,,,OPs,Copyright 2005.9,mfy,ustc,.,edu,.,cn,MOV,指令,指令格式:,MOV,dst,src,举例,MOV AL,BL,MOV AX,BX,MOV BX,1234;MOV BX,1234H,MOV SI,BP+8AH,MOV WORD PTRSI,5678H;,将立即数,5678,H,送入,SI,和,SI+1,所指的两个内存单元中。,目的操作数不能为立即数,为什么?,段寄存器,CS DS SS ES,通用寄存器,AX BX CX DX,BP SP SI DI,立即数,存 储 器,Copyright 2005.9,mfy,ustc,.,edu,.,cn,XCHG,指令,XCHG AH,CL;AH,与,CL,中字节内容交换,XCHG BX,SI ;SI,与,BX,中字内容交换,Copyright 2005.9,mfy,ustc,.,edu,.,cn,XLAT,指令,XLAT,换码指令,(,或称为查表转换指令,),。此指令的功能为:使累加器,AL,中的一个值变换为内存某表格中的一个字节值,一般用此指令实现编码制间的转换。,格式:,XLAT OPRD,或,XLAT,操作:,AL,(BX+AL),Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,2).,目标地指传送指令,LEA,有效地址送寄存器,LDS,指针装入寄存器和,DS,指令,LES,指针装入寄存器和,ES,指令,Copyright 2005.9,mfy,ustc,.,edu,.,cn,LEA,传送偏移地址指令,,字还是字节操作?,格式,LEA REG,MEM,LEA AX,2786H,LEA SI,0482,比较:,MOV AX,DI+10H,LEA AX,DI+10H,MOV AX,BX,和,LEA AX,BX,没区别,BX,所指的内存单元的地址给,AX,所以 就是,AX=BX,Copyright 2005.9,mfy,ustc,.,edu,.,cn,LDS,传送偏移地址和数据段基址指令,LDS REG,MEM,功能为:把源,(,存储器,),操作数指定的存储器字的内容,(,偏移地址,),装入指令规定的目的寄存器,REG,中,再将下一个高地址中的字,(,即段基地址的高,16,位值,),传送到,DS,寄存器。,双字操作,Copyright 2005.9,mfy,ustc,.,edu,.,cn,LDS,LDS DI,2130H;,Copyright 2005.9,mfy,ustc,.,edu,.,cn,LES,传送偏移地址和附加段基址指令。,LES REG,MEM,此指令的功能与,LDS,指令功能类似,所不同的是将高地址中的字传送到,ES,附加段寄存器中。此指令用于,更换当前附加段。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,3).,输入,输出指令,I/O,端口,:,16,位二进制表示,,I/O,接口中的寄存器。包含,64,k,个8,位端口。,IN,输入,I/O CPU,OUT,输出,I/O CPU,格式:,IN,AL,PORT;IN,AX,PORT,OUT PORT,AL,;OUT PORT,AX,IN,AL,DX ;IN,AX,DX,OUT DX,AL,;OUT DX,AX,Copyright 2005.9,mfy,ustc,.,edu,.,cn,IN/OUT,传送类中的指令只能通过累加器,(,AL,或,AX),完成,IO,数据传送。对于较小规模的微机系统,IO,端口寻址范围仅为,0255,时,可采用直接寻址的,IO,指令;,IN AL,PORT;IN AX,PORT,OUT PORT,AL;OUT PORT,AX,Copyright 2005.9,mfy,ustc,.,edu,.,cn,当,IO,端口寻址大于,255,的端口地址号时,就必须用间接寻址,I/O,指令。事先应将,IO,端口地址号存入,16,位的,DX,寄存器中。,MOV DX,3020H,IN AL,DX ;IN AX,DX,OUT DX,AL ;OUT DX,AX,Copyright 2005.9,mfy,ustc,.,edu,.,cn,例:设当前,CS2000H,IP0300H。8,位端口地址号为,40,H,,其中内容为,68,H。,执行如下输入指令,IN AL,40H,;,将,IO,端口号,(40,H)=68H,送到,AL,中。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,4,)堆栈操作指令,PUSH,src,;,将,src,压入堆栈,;,字操作。,sp,sp-2,(sp+1,sp),src,Push ax,POP,dst,将,dst,弹出堆栈,;,字操作。,(,sp+1,sp),dst,sp,sp+2,POP,bx,Copyright 2005.9,mfy,ustc,.,edu,.,cn,2算术运算类,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,ADD,不带进位位的加法指令,ADD,执行两个字或两个字节的相加操作,结果放在原来存放目的操作数的地方。,例如:,ADD AL,50H,ADD CX,1000H,ADD DI,SI,ADD BX,十,DI,AX,ADD AX,BX+2000H,如何实现,50+80,?,Copyright 2005.9,mfy,ustc,.,edu,.,cn,ADC,带进位位的加法指令,ADC,在形式上和功能上都和,ADD,指令类似,只有一点区别,就是,ADC,指令被执行时,将进位标志,CF,的值加在和中。,格式:,ADC,dst,src,功能:,(,dst,),(,dst,)+(,src,)+CF,例如:,ADC AXSI,ADC DX,SI,ADC BX,3000H,ADC AL,5,ADD、ADC,指令的执行结果将影响标态位,OF,SF,ZF,AF,PF,和,CF。,如何实现:,12345678,H+ABCDEF12H?,Copyright 2005.9,mfy,ustc,.,edu,.,cn,ADC,实现多字节加法,2000,2001,2002,2003+3000,3002,3002,3003,Copyright 2005.9,mfy,ustc,.,edu,.,cn,INC,3),增量指令,INC,只有一个操作数,指令在执行时,将操作数的内容加,1,,再送回该操作数。,操作数能为立即数吗?,指令将影响,SF、ZF、AF、PF,和,OF,,但对进位标志,CF,没影响。其操作数类型可以是寄存器或存储器,但不能是段寄存器。字节操作或字操作均可。,例如:,INC WORD PRTBX+SI+500,INC AX,Copyright 2005.9,mfy,ustc,.,edu,.,cn,BCD,码,BCD,码(,BINARY CODE DECIMAL),即,二,十进制编码,,是计算机中使用最广泛的一种数字编码,因为这种编码既照顾了人们熟悉十进制的习惯,又考虑到计算机只能识别二进制数的特点,从而方便了人机联系。,BCD,码本质上表示的是十进制数,,但每位十进制数用相应的,4,位二进制码表示,又具有二进制的形式。,4,位二进制可以表达,16,种状态,,BCD,码只需要,10,种,从,16,种状态中选取,10,个状态表示十进制数,09,的方法很多,可以产生多种,BCD,码,其中最常用的,8421,码。,8421,是指这种编码的各位所代表的“权”,最高位是,8,,依次是,4,2,1,。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,BCD码,压缩,BCD,码,所谓压缩,BCD,码,,是用,4,位二进制表示一位十进制数,一个字节表示两位十进制数最大为,99,。,非压缩,BCD,码,所谓非压缩,BCD,码,是用一个字节表示一位十进制数,高,4,位总是,0000,,最大表示的十进制数为,9,。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,BCD,码,Copyright 2005.9,mfy,ustc,.,edu,.,cn,BCD,码的加法十进制调整指令,BCD,码运算 按 二进制运算 重新调整为,BCD,码,为什么调整,BCD,码数是用,4,位二进制码表示一位十进制数,最大值为,9(即,l001)。,当,BCD,码数先按二进制运算时,不可避免会出现大于,9,的结果,这样运算结果就已不是有效的,BCD,码了。所以必须对结果进行调整。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,DAA和AAA,格式:,DAA ;,BCD,码十进制加法调整指令(用于压缩,BCD,码),如何调整,由于四位二进制码是逢,16进1,,而,BCD,码是逢,10进,l,,二者差,6,。于是加法调整指令的操作过程为:对压缩,BCD,码,若相加后低,4,位大于,9,或辅助进位位,AF=1,,则加,06,H,修正;若高,4,位大于,9,或进位位,CF=1(,字节运算,),则加,60,H,修正;若两者同时发生或,高,4,位虽等于,9,但低,4,位修正有进位,,则应进行加,66,修正。,86+19,格式:,AAA ;,ASCII,码十进制加法调整指令(用于非压缩,BCD,码),Copyright 2005.9,mfy,ustc,.,edu,.,cn,DAA和AAA,Copyright 2005.9,mfy,ustc,.,edu,.,cn,DAA和AAA,例:试求下列两个,2位,BCD,码之和24+53;28+53;,91+85,;45+57,Copyright 2005.9,mfy,ustc,.,edu,.,cn,SUB,不带借位的减法指令,SUB,格式:,SUB,dst,src,功能,:完成两个字节或两个字的相减。,(,dst,),(,dst,)-(,src,),SUB BX,CX,SUB BP+2,CL,SUB AL,20,SUB SI,5010H,SUB WORD PTRDI,1000H,Copyright 2005.9,mfy,ustc,.,edu,.,cn,SBB,带借位的减法指令,SBB,在形式上和功能上都和,SUB,指令类似只是,SBB,指令在执行减法运算时,,还要减去,CF,的值。,在减法运算中,,CF,的值就是两数相减时,向高位产生的借位。,SBB,dst,src,;(,dst,),(,dst,)-(,src,)-CF,SBB,主要用在多字节减法运算中。,SBB AX,2030H,SBB WORD PRTDI+2,1000H,SUB,和,SBB,可以进行字节相减,也可以字相减。数据类型可以为带符号数或无符号数;,指令对标志位,SF,ZF,AF,DF,CF,和,OF,有影响。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,DEC,3),减量指令,减量指令只有,1,个操作数,执行时,将操作数的值减,1,,再将结果送回操作数。,操作数类型对标志位影响均同增量指令。,DEC AX,DEC BL,DEC BYTE PRTDI+2,Copyright 2005.9,mfy,ustc,.,edu,.,cn,NEG,4),取补指令,NEG,对指令中给出的操作数取补码,再将结果送回。,因为对一个操作数取补码相当于用,0,减去此操作数,所以,NEG,指令执行的也是减法操作。,NEG AL,NEG CX,利用,NEG,指令可以得到负数的绝对值。,求补指令对大多数标志位如,SF,ZF,AF,PF,CF,及,OF,有影响。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,CMP,5),比较指令,CMP,也是执行两个数的相减操作,但,不送回相减的结果,。只是使结果,影响标志位。,对标志位,SF,ZF,AF,PF,CF,及,OF,有影响。,CMP AX,2000H,CMP AL,50H,CMP AX,BX+DI+100,CMP DX,DI,后面经常会有一条条件转移指令,用于检查标志位的状态是否满足了某种关系,从而决定程序走向,。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,BCD,码的减法十进制调整指令,DAS和AAS,Copyright 2005.9,mfy,ustc,.,edu,.,cn,乘法指令,乘法运算,MUL,和,IMUL,是双操作数运算,,8086/8088,在执行乘法指令时,有一个乘数总是放在累加器,(8,位数放在,AL,中,,16,位数放在,AX),中,并将,DX,寄存器看成是,AX,寄存器的扩展部分。,8,位数相乘,其乘积,16,位存放在,AX,中。,16,位数相乘,其乘积为,32,位,其中高,16,位存于,DX,中,低,16,值存于,AX,中。,另一个操作数,(,被乘数,),必须在寄存器或存储单元中。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,乘法运算的操作数及其运算结果间关系,Copyright 2005.9,mfy,ustc,.,edu,.,cn,MUL,不带符号位的乘法指令,MUL,用于无符号二进制数乘法。若乘积的高半部分,(,字节乘法为,AH,,字乘法为,DX),不为,0,则标志位,CF,和,OF,均置,1,,表示,AH,和,DX,中含有乘积的有效数字,否则,CF,和,OF,置0,。而,SF、ZF、AF,和,PF,不确定因而没有意义。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,下列程序段执行之后,乘积在,AX,中。由于乘积高半部,(,AH),不为,0,,故,CF1,OF1,其余标志位状态不定。,MOV AL,0A7H,MOV BL,85H,MUL BL ;,乘积为,5191,H,在,AX,寄存器中,Copyright 2005.9,mfy,ustc,.,edu,.,cn,IMUL,带符号位的乘法指令,IMUL,称为整数乘法指令,用于实现有符号数,(,以补码形式表示,),的乘法运算。,MOV AX,04E8H,MOV BX,4E20H,IMUL BX;(DX:AX)=(AX)*(BX),Copyright 2005.9,mfy,ustc,.,edu,.,cn,AAM,BCD,码的乘法十进制调整指令,AAM,只用于对非压缩的,BCD,码相乘结果进行调整。调整之前,先用,MUL,指令将两个非压缩的,BCD,码相乘,结果放在,AL,中,然后用,AAM,指令进行调整。,MOV AL,7,MOV BL,9,MUL BL;(AX)=7*9=003FH,AAM ;(AH)=06H,(AL)=03H,;(SF)=0,(ZF)=0,(PF)=1,Copyright 2005.9,mfy,ustc,.,edu,.,cn,除法指令,8086/8088,执行除法运算时规定:除数只能是被除数的一半字长。当被除数为,16,位时,除数应为,8,位;被除数为,32,位时,除数为,16,位,并规定:,(,a),当被除数为,16,位,应存放于,AX,中。除数,8,位,可存放在寄存器或存储器中。而得到的,8,位商放在,AL,中,,8,位余数放在,AH,中。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,除法指令,Copyright 2005.9,mfy,ustc,.,edu,.,cn,DIV和IDIV,不带符号位的除法指令,DIV,带符号位的除法指令,IDIV,Copyright 2005.9,mfy,ustc,.,edu,.,cn,符号位扩展指令,CBW,指令将,AL,中的单字节数的符号位扩展到,AH,中;,CWD,指令将寄存器,AX,中的符号位扩展到,DX,寄存器中。,指令的执行不影响任何标志位。,MOV AL,0A0H;(AL)=1010 0000B=-96,CBW ;(AH,AL)=1111 1111 1010 0000B=-96,MOV AX,0345H;(AX)=0000 0011 0100 0101B=837,CWD ;(DX:AX)=0000 0000 0000 0000 0011 0100 0101B =837,Copyright 2005.9,mfy,ustc,.,edu,.,cn,3,逻辑运算与移位指令,1).,逻辑运算指令,2).,移位与循环移位指令,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,AND,指令可借助于某给定的操作数将另一个操作数的某些位清除,(置0),,也称将某些位屏蔽。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,XOR,XOR“,异或”指令,常用于改变某一特定位的状态。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,TEST,TEST,是条,测试指令,,它对两个操作数进与操作并根据结果设置状态标志位,但不改变两个操作数的值。这条指令常用于测某些条件是否满足,但又不希望改变原操作数的情况。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,移位指令和循环移位指令,指令操作数中的目的操作数可以是字节或字,同逻辑运算指令的目的操作数一样,它只能是寄存器或存储器操作数,.,操作数中的计算值,CNT,决定移位或循环的位数。,CNT,可以是,1或,CL,中的值,因而最多可移位,255,位。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,SAL AL,1;,将,AL,中的数左移一位,得,2,X,MOV BL,AL;,2X,保存在,BL,中,MOV CL,2;,移位次数置入,CL,中,SAL AL,CL;,2X,左移,2,位,得,8,X,ADD AL,BL;,2X,加上,8,X,,所以,AL,中为,10,X。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,4,串操作指令,串操作指令是用于对存储器中一个连续的字符、数值的字节,(,也称字符串,),进行操作、处理。,串操作就是对字符串中的每一个元素进行操作。例如,把一个数据串的全部元素从存储器的一个区域传送到另一个区域。还可进行比较、查找、插入、删除等功能。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,串操作指令特点,(1),通过加重复前缀来实现串操作。,(2),可以对字节串进行操作,也可以对字串进行操作。,(3),所有的串操作指令都用寄存器,SI,对源操作数进行间接寻址,并是假定是在,DS,段中;此外,所有的串操作指令都用寄存器,DI,为目的操作数进行间接寻址,并且假定是在,ES,段中。串操作指令是唯一的一组源操作数和目的操作数都在存储单元的指令。,源串:,DS:SI,目的串:,ES:DI,Copyright 2005.9,mfy,ustc,.,edu,.,cn,(4),串操作时,地址的修改往往与方向标志,DF,有关,,DF1,时,,SI,和,DI,作自动减量修改,当,DF0,时,,SI,和,DI,作自动增量修改,.,(5),在同一个段内实现字符串传送时,应该将数据段基址和附加段基址设置成同一数值,即,(,DS)(ES),,此时,仍由,SI,和,DI,分别指出源串操作数和目的操作数的偏移地址,.,Copyright 2005.9,mfy,ustc,.,edu,.,cn,字符串指令的隐含参数,Copyright 2005.9,mfy,ustc,.,edu,.,cn,字符串指令与重复前缀,Copyright 2005.9,mfy,ustc,.,edu,.,cn,字符串的传送,MOVS,在使用,MOVS,指令进行字符串传送时,要注意传送方向,其方向标志的作用如下页图所示。,如果源字符串与目标字符串不重迭,(,如图,(,a),,则传送方向没有任何影响。,如果源字符串与目标字符串部分重迭,(,如图,(,b),和(,c),,则传送方向要特别注意。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,STOS,STOS,指令是把累加器,ALAX,中的内容存到内存中去,如果使用了重复前缀,则可以方便地使内存的某一区域初始化为某一数值,(,以字节或字为单位,),,即顺利地完成块的填充。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,SCAS,SCAS,指令是用来从目标串中查找某个关键字,要求查找的关键字应事先置入,AX,或,AL,寄存器中。,SCAS,指令的操作是将,AXAL,寄存器中的关键字减去由,DI,所指向的目标串中一个元素,不传送结果,只根据结果置标志位,修改,DI,寄存器内容指向下一元素。,通常在,SCAS,指令之前加重复前缀,REPNEREPNZ,,用来从目标串中寻找关键字,操作一直进行到,ZF1,或,CX0,为止。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,CMPS,CMPS,指令是用来将源串的一个元素减去目标串中相对应的一个元素,不回送结果,只根据结果特征置标志并修改,SI,和,DI,内容指向下一元素。,通常在,CMPS,指令前加重复前缀,REPEREPZ,,用来寻找两个串中的第一个不相同数据。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,CMPS,例如,检验一段被传送过的数据是否与源串完全相同,程序如下;,Copyright 2005.9,mfy,ustc,.,edu,.,cn,重复前缀,REP CX=0,时重复,REPZ/REPE CX=0,且,ZF=1,时重复,REPNZ/REPNE CX=0,且,ZF=0,时重复,Copyright 2005.9,mfy,ustc,.,edu,.,cn,无条件转移,JMP,Copyright 2005.9,mfy,ustc,.,edu,.,cn,5,控制转移指令,在,86,系列系统中,程序的寻址是由,CS,和,IP,两部分组成的。为了使程序转移到一个新的地址去执行,或者改变,CS,和,IP(,即改变段和偏移量,),或者仅改变,IP(,即改变偏移量,),,都可以达到这个目的。其中,前者称为段间转移或段间调用,可用,FAR,来表示,这时需要将目标标号的段基址和偏移地址分别置入,CS,和,IP,中;后者称为段内转移或段内调用,可用,NEAR,来表示,这时只需将目标标号的偏移地址置入,IP,寄存器中。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,为了进一步节省目标码的长度,对于很短距离内的段内转移,(一128,一十,127),86,系列义把它进一步分别开来,称为短转移,用,SHORT,来表示。,无论是段内转移还是段间转移,都还有直接和间接转移之分。所谓直接转移,就是转移的目标地址信息直接出现在指令的机器码中。所谓间接转移就是转移的目标地址信息间接存储于某一个寄存器中或某一个内存变量中。当通过寄存器间接转移时,因为寄存器只能是,16,位的,所以只能完成段内间接转移。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,计算段内转移地址有两种方法:一种是把当前的,IP,值增加或减少某一个值,也就是以当前指令为中心往前或往后转移,称为相对转移;,另一种是以新的值完全代替当前的,IP,值,称为绝对转移。,在,86,系列中,所有的段内直接转移都是相对转移,所有的段内间接转移和段间转移都是绝对转移。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,由于相对转移指令及其目标地址是相对于该指令本身而言的,因而适用于与位置无关(即动态浮动)的程序。这种程序中,相对转移指令及其目标都在同一段中,并一起浮动。,JMP,指令具有所有这些转移地址的功能,,CALL,,和,RET,指令没有短转移的功能。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,条件转移指令,条件转移指令是根据执行该指令时,CPU,标志的状态而决定是否发生控制转移的指令。所有条件转移指令完成的都是短距离相对转移,因此适用于与位置无关的程序。,如果转移距离超过短距离范围,则必须使用两级跳转才能达到目的。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,第1类和第2类是测试各种标志的组合,其中,第1类是为无符号数设计的,第2类是为带符号数设计的,这两类条件转移指令前面都要求是一条,SUB,或,CMP,指令。第3类是测试单个标志。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,循环控制指令,循环控制指令,LOOP,也是短距离相对转移指令,可用来控制软件循环的重复过程。,LOOP,指令用,CX,寄存器作为计数器,它首先使,CX,减,l,,若减,1,后不为,0,,则转移到目标地址;否则就执行,LOOP,指令之后的指令。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,6,处理器控制指令,1,对标志位操作指令,标志操作指令的作用是分别用来置位或复位进位标志、方向标志、中断允许标志。,在这些指令中,没有直接置位和复位单步执行标志位,TF,的指令,如果要对,TF,标志位进行操作,应该先用,PUSHF,指令将标志寄存器的内容压入堆栈,在堆栈中设定,TF,位的值,然后再从堆栈中弹回标志寄存器。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,Copyright 2005.9,mfy,ustc,.,edu,.,cn,2,同步指令,(1),WAIT,指令,使,CPU,进入等待状态。每隔,5,个时钟周期,测试一次,86,系列芯片上的了,TEST,状态,直到,TEST,线上的信号变为有效为止。,WAIT,指令与,ESC,指令联合使用,提供了一种存取,8087,数值的能力。,(2),ESC,指令的作用是不用修改处理机就可以扩充,86,系列的指令集。该指令中的外部操作码是外部协处理机的操作码,它是一个,6,位的立即数,由汇编程序将其编入这条指令的机器码中。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,(3),LOCK,指令实际上是一个前缀。它使86系列在执行下一条指令期间发出总线封锁(,LOCK),信号,所以,在该指令执行过程中禁止其它协处理机使用总线。这条前缀指令在构成多处理机系统时尤为重要。,Copyright 2005.9,mfy,ustc,.,edu,.,cn,
展开阅读全文