计算机微机原理8066指令.ppt
1,第3章,8086指令系统,2,本章内容,3.1 基本数据类型3.2 8086的指令格式3.3 8086指令的操作数寻址方式3.4 8086的通用指令总结,3,3.1 基本数据类型,字节字双字四字双四字,注意基本数据类型在内存中的字节顺序,4,字、双字、四字和双四字的对齐,当数据对齐时,对字来说,地址要被2整除,对双字、四字和双四字来说,地址要被4、8和16整除。,应该将数据的地址对齐,以取得较高的存取速度,80X86处理器能够访问任何有效地址的数据类型,而不需要对齐数据。但对于不对齐地址的数据,处理器访问时,需要额外的访问存储器时间。,5,3.1.2 数字数据类型,(1)无符号整数,范围从0到2n 1,其中,n为整数的位数。,(2)符号整数,用补码表示,范围从-2n-1到2n-1-1。其中,n为整数的位数。,6,3.2 8086的指令格式,标号:助记符 参数1,参数2;注释,各部分之间至少用一个空格作为间隔,带方括号部分表示任选项,助记符:说明计算机要执行哪种操作,用英文单词的缩写表示。,参数:指令执行的参与者,即各种操作的对象。参数1是目的操作数,参数2是源操作数,BACK,7,3.3 8086指令的操作数寻址方式,寻找操作数存放地址的方式称为寻址方式。,什么是寻址方式,注意操作数的表达方法,为展开8086指令系统做好准备,8,操作数存放位置,指令中 寄存器 存储器 I/O端口,9,传送指令MOV(move)的格式,MOV dest,src;destsrc MOV指令的功能是将源操作数src传送至目的操作数dest,例如:MOV AL,05H;AL05HMOV BX,AX;BXAXMOV AX,SI;AXDS:SIMOV AX,BP+06H;AXSS:BP+06HMOV AX,BX+SI;AXDS:BX+SI,10,1、立即数寻址方式,操作数直接存放在指令中。操作数称为立即操作数。,MOV CL,5 MOV AX,3100H,11,立即寻址注意问题,*只能用于源操作数字段,12,2、寄存器寻址方式,操作数存放在寄存器中,指令指定寄存器号。对16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP、DS、CS、ES、SS等。对8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH等。,如:MOV AX,BX,13,3、直接寻址方式,有效地址在指令中直接给出默认的段地址在DS段寄存器,可使用段超越前缀改变MOV AX,2000H;AXDS:2000HMOV AX,ES:2000H;AXES:2000H,表示其中为偏移地址,段超越前缀,即偏移地址,直接寻址,14,AX(Accumulator)累加器BX(Base)基址寄存器CX(Count)计数寄存器DX(Data)数据寄存器SI(Source Index)是源变址寄存器DI(Destination Index)是目的变址寄存器SP(Stack Pointer)为堆栈指针寄存器BP(Base Pointer)为基址指针寄存器,通用寄存器的名称与符号,数据寄存器,指针寄存器,15,4、寄存器间接寻址方式,操作数存放在存储器中,而操作数的地址的16位偏移量可在BX、BP或SI、DI寄存器中。,1、选择BX、SI、DI作为间址寄存器,则操作数在数据段中,所以用DS寄存器的内容作为段地址。操作数的物理地址为:,例 1 MOV AX,BX,寄存器间接寻址,16,寄存器间接寻址(续),2、选择BP作为间址寄存器,则操作数在堆栈段中,所以用SS寄存器的内容作为段地址。操作数的物理地址为:,物理地址=(SS)左移4位+(BP),例2 MOV AX,BP,说明:指令中也可指定段超越前缀来取得其他段中的数据。如:,17,MOV AX,ES:BX 源操作数的物理地址为:(ES)左移4位+(BX)MOV AX,DS:BP源操作数的物理地址为:(DS)左移4位+(BP),18,以下情况不能段超越,程序的指令序列必须安排在代码段程序使用的堆栈一定在堆栈段串操作的目的区必须是附加段,19,5、寄存器相对寻址方式,有效地址是寄存器内容与有符号8位或16位位移量(补码表示)之和,寄存器可以是BX、BP或SI、DI 有效地址BX/BP/SI/DI8/16位位移量段地址对应BX/SI/DI寄存器默认是DS,对应BP寄存器默认是SS;可用段超越前缀改变,20,寄存器相对寻址指令,MOV AX,SI+06H;AXDS:SI+06HMOV AX,BP+06H;AXSS:BP+06H,寄存器相对寻址,21,6、基址加变址寻址方式,有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:有效地址BX/BPSI/DI段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变,注意:必须一个是基址寄存器,另一个是变址寄存器,不能两个都是基址寄存器,也不能两个都是变址寄存器,22,基址加变址寻址指令,MOV AX,BX+SI;AXDS:BX+SIMOV AX,BP+DI;AXSS:BP+DIMOV AX,DS:BP+DI;AXDS:BP+DI,基址加变址寻址,23,7、相对基址变址寻址方式,有效地址是基址寄存器(BX/BP)、变址寄存器(SI/DI)与一个8位或16位位移量之和:有效地址BX/BPSI/DI8/16位位移量段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变,注意:必须一个是基址寄存器,另一个是变址寄存器,不能两个都是基址寄存器,也不能两个都是变址寄存器,24,相对基址变址寻址指令,MOV AX,BX+DI+06H;AXDS:BX+DI+06H,相对基址加变址寻址,25,多种表达形式,同一寻址方式可以写成不同的形式:MOV AX,BXSI;等同于 MOV AX,BX+SIMOV AX,COUNTSI;等同于 MOV AX,SI+COUNTMOV AX,WNUMBXSI;等同于 MOV AX,WNUMBX+SI;等同于 MOV AX,BX+SI+WNUM,注意:位移量写在的左边,26,寻址方式总结(1),7种寻址方式归纳为3大类:,立即方式:立即数寄存器方式:寄存器操作数存储器方式(直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址、相对基址加变址寻址):存储器操作数,27,寻址方式总结(2),对于存储器方式,有效地址可以由以下三种成分组成:位移量(Displacement)是存放在指令中的一个8位或16位数,但它不是立即数,而是一个地址。基址(Base)是存放在基址寄存器(BX或BP)中的内容。变址(Index)是存放在变址寄存器(SI或DI)中的内容。,有效地址的计算可用下式表示:EA=基址+变址+位移量它们任意组合使用,可得到不同的寻址方式。,28,寻址方式总结(3),没有指明时,一般的数据访问在DS段;使用BP访问主存,则在SS段默认的情况允许改变,需要使用段超越前缀指令;8086指令系统中有4个:CS:;代码段超越,使用代码段的数据SS:;堆栈段超越,使用堆栈段的数据DS:;数据段超越,使用数据段的数据ES:;附加段超越,使用附加段的数据,BACK,29,3.4 8086的通用指令,16位8086指令系统是Intel 80 x86系列微处理器指令系统的基础,30,学习指令的注意事项,指令的功能该指令能够实现何种操作。通常指令助记符就是指令功能的英文单词或其缩写形式指令支持的寻址方式该指令中的操作数可以采用何种寻址方式指令对标志的影响该指令执行后是否对各个标志位有影响,以及如何影响(参见P425)其他方面该指令其他需要特别注意的地方,如指令执行时的约定设置、必须预置的参数、隐含使用的寄存器等,31,指令遵循的规则,两个操作数的类型要一致两个操作数不能都是存储器只有MOV、PUSH、POP指令允许以段寄存器作为操作数目的操作数不能是立即数和CS单操作数指令中的操作数不能是立即数,32,数据传送指令,数据传送是计算机中最基本、最重要的一种操作传送指令把数据从一个位置传送到另一个位置只有这种通用传送指令(除了XCHG以外),才是惟一的允许以段寄存器作为操作数的指令。,33,1、MOV(MOVE)指令,此指令不影响标志位,34,MOV指令举例,mov al,4;al4,字节传送mov ax,bx;axbx,字传送mov dx,bp;dxss:bp,35,2、交换指令XCHG(exchange),XCHG OPRD1,OPRD2执行操作:OPRD1 OPRD2,数据传送指令不影响标志位,36,XCHG指令数据交换方向,寄存器与寄存器之间对换数据寄存器与存储器之间对换数据不能在存储器与存储器之间对换数据段寄存器不能作为操作数,也可以是8位寄存器,37,xchg ax,bxxchg ah,alxchg ax,2000hxchg al,2000h,XCHG指令举例,XCHG AX,DLXCHG BX,0100H,这些都是错误指令!,38,3、堆栈操作指令,堆栈是以“后进先出”方式工作的一个存储区(内存区),堆栈操作必须在堆栈段中进行,其段地址由堆栈段寄存器SS确定。它的一端固定,另一端浮动,固定的一端叫栈底,浮动的一端叫栈顶。堆栈只有一个出入口,即当前栈顶;用堆栈指针寄存器SP指定,SP的内容是栈顶的偏移地址。进栈指令和出栈指令都必须根据当前SP的内容来确定进栈或出栈的单元,而且必须及时修改SP的值,使SP的内容指向当前的栈顶。栈顶是地址较小的一端,39,堆栈操作指令,堆栈只有两种基本操作:进栈和出栈,对应两条指令PUSH和POP堆栈操作的单位是字指令不影响标志位,40,入栈指令PUSH(Push word onto the stack),说明:OPRD可以使用除立即数以外的任何一种寻址方式.,这是错误指令,PUSH 1234H,PUSH r16/m16/seg,push axpush 2000h,41,出栈指令POP(Pop word from the stack),注意:POP指令不允许使用立即数和CS寄存器,POP 1234H POP CS,这些都是错误指令,POP r16/m16/seg,pop axpop 2000h,42,PUSH指令举例,例 PUSH AX,已知指行指令前(SP)=0305H,(AX)=8057H指令的执行过程如下:,0305H,80H,57H,0304H,0303H,(SP)=0303H,43,POP指令举例,例 POP BX已知执行指令前,(SP)=0303H,(BX)=1234H指令的执行过程如下:,指令执行后,(SP)=0305H,(BX)=8057H,BL,BH,44,4、输入输出指令,8086通过输入输出指令与外设进行数据交换;呈现给程序员的外设是端口(Port)即I/O地址8086用于寻址外设端口的地址线为16条,端口最多为21665536(64K)个,端口号为0000HFFFFH每个端口用于传送一个字节的外设数据输入输出指令不影响标志位,45,输入输出寻址方式,8086的端口有64K个,无需分段,设计有两种寻址方式直接寻址:只用于寻址00HFFH前256个端口,操作数i8表示端口号间接寻址:可用于寻址全部64K个端口,DX寄存器的值就是端口号对大于FFH的端口只能采用间接寻址方式,46,(1)输入指令IN(Input),将外设数据传送给CPU内的AL/AX,IN AL,n;字节输入:ALI/O端口(n直接寻址)IN AL,DX;字节输入:ALI/O端口(DX间接寻址)IN AX,n;字输入:AXI/O端口(n直接寻址)IN AX,DX;字输入:AXI/O端口(DX间接寻址),n取值000FFH,47,;直接寻址,字节量输入in al,21hmov ah,alin al,20h;直接寻址,字量输入in ax,20h;间接寻址,字量输入mov dx,20hin ax,dx,两段功能相同 字量数据传送实际上实现了连续的两个端口地址的字节量传送,IN指令举例,48,(2)输出指令OUT(Outout),将CPU内的AL/AX数据传送给外设,OUT n,AL;字节输出:I/O端口AL(n直接寻址)OUT DX,AL;字节输出:I/O端口AL(DX间接寻址)OUT n,AX;字输出:I/O端口AX(n直接寻址)OUT DX,AX;字输出:I/O端口AX(DX间接寻址),49,5、(符号)扩展指令,什么是符号扩展?,50,符号扩展的概念,符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,另一个操作数的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)对于数据ffd2H(表示有符号数46),其最高位D15为1,符号扩展后高16位都是1,成为ffffffd2H(仍表示有符号数46),51,符号扩展的实际意义,将数据进行符号扩展是为了产生一个位数加倍、但数值大小不变的结果,以满足有些指令对操作数位数的要求,例如倍长于除数的被除数,再如加、减、乘运算的操作数位数相同。,52,CBW(convert byte to word);AL的符号扩展至AH;如AL的最高有效位是0,则AH00;AL的最高有效位为1,则AHFFH。AL不变,CWD(convert word to double word);AX的符号扩展至DX;如AX的最高有效位是0,则DX00;AX的最高有效位为1,则DXFFFFH。AX不变,符号扩展指令,不影响标志位,53,符号扩展指令举例,对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数,54,3.4.2 二进制算术运算指令,8086指令系统提供加、减、乘、除四种基本的算术运算操作。这些操作都可用于字节或字的运算,也都可以用于带符号数与无符号数的运算。若是符号数,则用补码表示。指令运算指令会根据运算结果影响状态标志,使用它们时请留心有关状态标志。,55,1、加法指令,ADDADC,56,加法指令ADD(Addition),ADD r,im/r/mem;rrim/r/memADD mem,im/r;memmemim/r,ADD指令将源与目的操作数相加,结果送到目的操作数ADD指令按状态标志的定义相应设置,57,带进位加法指令ADC(Add with carry),ADC指令将源与目的操作数相加,再加上进位CF标志,结果送到目的操作数ADC指令按状态标志的定义相应设置ADC指令主要与ADD配合,实现多精度加法运算,ADC r,im/r/mem;rrim/r/memCFADC mem,im/reg;memmemim/rCF,58,mov ax,4652h;ax=4652hadd ax,0f0f0h;ax=3742h,CF=1mov dx,0234h;dx=0234hadc dx,0f0f0h;dx=f325h,CF=0;DX.AX0234 4652HF0F0 F0F0HF325 3742H,ADC指令举例,59,2、减法指令,SUBSBB,60,减法指令SUB(subtract),SUB指令将目的操作数减去源操作数,结果送到目的操作数SUB指令按照定义相应设置状态标志,SUB r,im/r/mem;rrim/r/memSUB mem,im/r;memmemim/r,61,带借位减法指令SBB(subtract with borrow,SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数。SBB指令按照定义相应设置状态标志SBB指令主要与SUB配合,实现多精度减法运算,SBB r,im/r/mem;rrim/r/memCFSBB mem,im/r;memmemim/rCF,62,MULIMUL,3、乘法指令,63,乘法指令,MUL r8/mem8;无符号字节乘法;AXALr8/mem8MUL r16/mem16;无符号字乘法;DX.AXAXr16/m16,IMUL r8/mem8;有符号字节乘法;AXALr8/m8IMUL r16/mem16;有符号字乘法;DX.AXAXr16/m16,MUL(Multiplication)无符号数乘法指令,IMUL(Integer Multiplication)带符号数乘法指令,64,乘法指令的功能,乘法指令分无符号和有符号乘法指令乘法指令的源操作数显式给出,隐含使用另一个操作数AX和DX字节量相乘:AL与r8/m8相乘,得到16位的结果,存入AX字量相乘:AX与r16/m16相乘,得到32位的结果,其高字存入DX,低字存入AX,65,乘法指令对标志的影响,乘法指令如下影响OF和CF标志:MUL指令若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1IMUL指令若乘积的高一半(AH或DX)是低一半(AL或AX)的符号扩展,则OF=CF=0;否则均为1乘法指令对其他状态标志没有定义,对标志没有定义:指令执行后这些标志是任意的、不可预测(就是谁也不知道是0还是1)对标志没有影响:指令执行不改变标志状态,66,乘法运算指令举例,mov al,0b4h;al=b4h=180mov bl,11h;bl=11h=17mul bl;ax=Obf4h=3060;OF=CF=1,AX高8位不为0mov al,0b4h;al=b4h=76mov bl,11h;bl=11h=17imul bl;ax=faf4h=1292;OF=CF=1,AX高8位含有效数字,67,4、除法指令,DIVIDIV,68,DIV r8/m8;无符号字节除法:ALAXr8/m8的商,AhAXr8/m8的余数DIV r16/m16;无符号字除法:;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数,IDIV r8/m8;有符号字节除法:ALAXr8/m8的商,AhAXr8/m8的余数IDIV r16/m16;有符号字除法:;AXDX.AXr16/m16的商,DXDX.AXr16/m16的余数,除法指令,DIV(Division)无符号数除法指令,IDIV(Integer Division)带符号数除法指令,69,除法指令的功能,除法指令分无符号和有符号除法指令除法指令的除数显式给出,隐含使用另一个操作数AX和DX作为被除数字节量除法:AX除以r8/m8,8位商存入AL,8位余数存入AH字量除法:DX.AX除以r16/m16,16位商存入AX,16位余数存入DX除法指令对标志位没有定义,70,字节操作要求被除数是16位,若不是,则需扩展为字(用CBW指令);字操作要求被除数是32 位,若不是,则需扩展为双字(用CWD指令)。,除法指令的功能,71,5、增量减量指令,(1)增量指令INC(increment),INC指令对操作数加1(增量)INC指令不影响进位CF标志,按定义设置其他状态标志,INC r/mem;r/memr/mem1,inc bx,72,(2)减量指令DEC(decrement),DEC指令对操作数减1(减量)DEC指令不影响进位CF标志,按定义设置其他状态标志,DEC r/mem;r/memr/mem1,73,6、求补指令NEG(negative),NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数求补运算也可以表达成:将操作数按位取反后加1NEG指令对标志的影响与用零作减法的SUB指令一样,NEG r/mem;r/mem0r/mem,74,7、比较指令CMP(compare),CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志CMP指令执行的功能与SUB指令,但结果不回送目的操作数,CMP r,im/r/mem;rim/r/memCMP mem,im/r;memim/r,75,3.4.3 十进制算术指令,十进制数在计算机中也要用二进制编码表示,这就是二进制编码的十进制数:BCD码。前述二进制算术运算指令实现了二进制的加减乘除,要实现十进制BCD码的运算,还需要对二进制运算结果进行调整。,76,压缩型BCD码(组合BCD码),用4位二进制数表示一个十进制数,整个十进制数形式为一个顺序的以4位为一组的数串。,例如,9502D的压缩型BCD码为:,1001 0101 0000 0010B,每4位之间留一空格,即:9502H,77,非压缩型BCD码(非组合BCD码),以8位为一组表示一个十进制数位,8位中的低4位0000B1001B表示09,而高4位为0。,例如,9502D的非压缩型BCD码为:,00001001 00000101 00000000 00000010B,每8位之间留一空格,即:09050002H,78,3.4.4 逻辑指令,逻辑运算指令用来对字节或字按位进行逻辑运算,79,逻辑乘(与)指令AND,对两个操作数执行逻辑与运算,结果送到目的操作数,只有相“与”的两位都是1,结果才是1;否则,“与”的结果为0,AND指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,80,测试指令TEST,对两个操作数执行逻辑与运算,结果不回送到目的操作数,TEST指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,81,逻辑加(或)指令OR,对两个操作数执行逻辑或运算,结果送到目的操作数,只要相“或”的两位有一位是1,结果就是1;否则,结果为0,OR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,82,按位加(逻辑异或)指令XOR,对两个操作数执行逻辑异或运算,结果送到目的操作数,只有相“异或”的两位不相同,结果才是1;否则,结果为0,XOR指令设置CF=OF=0,根据结果设置SF、ZF和PF状态,而对AF未定义,83,求反(逻辑非)指令NOT,对一个操作数执行逻辑非运算,NOT reg/mem;reg/memreg/mem,按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”,NOT指令是一个单操作数指令NOT指令不影响标志位,84,逻辑指令应用,AND指令可用于复位某些位(同0相与),不影响其他位:将BL中D3和D0位清0,其他位不变,and bl,11110110B,OR指令可用于置位某些位(同1相或),不影响其他位:将BL中D3和D0位置1,其他位不变,or bl,00001001B,XOR指令可用于求反某些位(同1相异或),不影响其他位:将BL中D3和D0位求反,其他不变,xor bl,00001001B,85,3.4.5 移位和循环移位指令,1、移位指令(shift),将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作,86,SHL reg/mem,1/CL;逻辑左移,最高位进入CF,最低位补0,SHR reg/mem,1/CL;逻辑右移,最低位进入CF,最高位补0,SAL reg/mem,1/CL;算术左移,最高位进入CF,最低位补0,SAR reg/mem,1/CL;算术右移,最低位进入CF,最高位不变,SAL与SHL相同,87,移位指令的操作,88,移位指令对标志的影响,按照移入的位设置进位标志CF根据移位后的结果影响SF、ZF、PF对AF没有定义如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF=1;否则OF=0。当移位次数大于1时,OF不确定,89,移位指令的应用-移位实现乘,mov si,axshl si,1;si2axadd si,ax;si3axmov dx,bxmov cl,03hshl dx,cl;dx8bxsub dx,bx;dx7bxadd dx,si;dx7bx3ax,逻辑左移n位相当于无符号数乘以2n 逻辑右移n位相当于无符号数除以2n,算术左移n位相当于有符号数乘以2n算术右移n位相当于有符号数除以2n,移位指令比乘法指令执行的时间短,90,2、循环移位指令(rotate),将操作数从一端移出的位返回到另一端形成循环,分成不带进位和带进位,分别具有左移或右移操作,ROL reg/mem,1/CL;不带进位循环左移,ROR reg/mem,1/CL;不带进位循环右移,RCL reg/mem,1/CL;带进位循环左移,RCR reg/mem,1/CL;带进位循环右移,91,循环移位指令的操作,ROL 循环左移,ROR 循环右移,RCL 带进位循环左移,RCR 带进位循环右移,92,以下程序段执行后,(BX)?MOV AX,1234HSUB AX,5678HMOV BL,00110110BRCL BL,1,执行 SUB AX,5678H后,CF=1,RCL,0 1 1 0 1 1 0,0,CF,执行RCL BL,1后(BL)=01101101B,1,93,循环移位指令对标志的影响,按照指令功能设置进位标志CF不影响SF、ZF、PF、AF如果进行一位移动,则按照操作数的最高符号位是否改变,相应设置溢出标志OF:如果移位前的操作数最高位与移位后操作数的最高位不同(有变化),则OF=1;否则OF=0。当移位次数大于1时,OF不确定,94,shl ax,1rcl dx,1,循环移位指令举例-32位数移位,;将DX.AX中32位数值逻辑左移一位,如何解决AX的最高位移入DX的最低位?,95,3.4.6 控制转送指令,控制转移类指令用于实现分支、循环、过程等程序结构,控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变,96,1、无条件转移指令JMP(JUMP),只要执行无条件转移指令JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令操作数是要转移到的目标地址(目的地址、转移地址),JMP 目标地址;程序转向目标地址,97,目标地址的寻址方式,直接寻址方式转移地址直接在指令中,就是直接寻址方式间接寻址方式转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式,用标号表达,用寄存器或存储器操作数表达,98,JMP指令分成4种类型:*段内转移、直接寻址 段内转移、间接寻址 段间转移、直接寻址 段间转移、间接寻址,99,段内转移、直接寻址,Code segment jmp again;转移到again处继续执行again:dec cx;标号again的指令 jmp output;转向outputoutput:mov result,al;标号output的指令 Code ends,格式:JMP Near ptr labe,100,段内转移、间接寻址,JMP r16/m16;IPr16/m16将一个16位寄存器或主存字单元内容送入IP寄存器,作为新的指令指针,但不修改CS寄存器的内容jmp ax;IPAXjmp word ptr 2000h;IPDS:2000h,101,段间转移、直接寻址,JMP far ptr label;IPlabel的偏移地址;CSlabel的段地址将标号所在段的段地址作为新的CS值,标号在该段内的偏移地址作为新的IP值;这样,程序跳转到新的代码段执行,102,Code2 segment Otherseg:mov ax,bx Code2 ends,Code1 segment jmp far ptr otherseg;远转移到另一代码段的otherseg Code1 ends,103,段间转移、间接寻址,JMP dword ptr mem;IPmem,CSmem+2用一个双字存储单元表示要跳转的目标地址。这个目标地址存放在主存中连续的两个字单元中的,低位字送IP寄存器,高位字送CS寄存器JMP dword ptr bx;IPDS:bx,CS DS:bx+2,104,2、条件转移指令Jcc,指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令,Jcc label;条件满足,发生转移;条件不满足,顺序执行,根据上一条指令执行后,CPU设置的状态标志位作为测试条件来决定程序是否转移。,105,Jcc指令的分类,Jcc指令不影响标志位,但要利用标志位。根据利用的标志位不同,16条指令分成3种情况:1.判断单个标志位状态2.比较无符号数高低3.比较有符号数大小,106,条件转移指令中的条件,107,3、重复控制指令(loop),循环指令默认利用CX计数器,方便实现计数循环的程序结构,LOOP label;CXCX1,;CX0,循环到标号label,LOOPZ/LOOPE label;CXCX1,;CX0且ZF1,循环到标号label,LOOPNZ/LOOPNE label;CXCX1,;CX0且ZF0,循环到标号label,JCXZ label;CX0,转移到标号label,108,4、调用(Call)与返回(Return)指令,109,5、过程指令,110,3.4.7 串操作类指令,111,串数据类型,串操作指令的操作数是主存中连续存放的数据串(String)即在连续的主存区域中,字节或字的序列串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串,112,串寻址方式,源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越:DS:SI目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越:ES:DI每执行一次串操作指令,SI和DI将自动修改:1(对于字节串)或2(对于字串)执行指令CLD指令后,DF=0,地址指针增1或2执行指令STD指令后,DF=1,地址指针减1或2,113,串传送MOVS(move string),把字节或字操作数从主存的源地址传送至目的地址,MOVSB;字节串传送:ES:DIDS:SI;SISI1,DIDI1,MOVSW;字串传送:ES:DIDS:SI;SISI2,DIDI2,演示,MOVS dest_string,src_string;dest_string为源串符号地址;src_string为目的串符号地址,114,串存储STOS(store string),把AL或AX数据传送至目的地址,STOSB;字节串存储:ES:DIAL;DIDI1,STOSW;字串存储:ES:DIAX;DIDI2,演示,STOS dest_string;dest_string为目的串符号地址,115,串读取LODS(load string),把指定主存单元的数据传送给AL或AX,LODSB;字节串读取:ALDS:SI;SISI1,LODSW;字串读取:AXDS:SI;SISI2,演示,LODS src_string;src_string为源串符号地址,116,串比较CMPS(compare string),将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系,CMPSB;字节串比较:DS:SIES:DI;SISI1,DIDI1,CMPSW;字串比较:DS:SIES:DI;SISI2,DIDI2,CMPS src_string,dest_string;src_string为源串符号地址;dest_string 为目的串符号地址,117,串扫描SCAS(scan string),将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系,SCASB;字节串扫描:ALES:DI;DIDI1,SCASW;字串扫描:AXES:DI;DIDI2,SCAS dest_string;dest_string为目的串符号地址,118,重复前缀指令(repeat),串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含在CX寄存器中重复前缀分2类,3条指令:配合不影响标志的MOVS、STOS(和LODS)指令的REP前缀配合影响标志(ZF)的CMPS和SCAS指令的REPE/REPZ和REPNE/REPNZ前缀,119,REP重复前缀指令,执行的操作:(1)如果(CX)=0,则退出串操作指令,否则执行以下步骤(2)执行REP 后的串操作指令(3)(CX)(CX)-1(4)重复步骤(1)(3),REP前缀可以理解为:当数据串没有结束(CX0),则继续传送,注意:先判断CX是否为0,演示,120,执行REP MOVSB(MOVSW)之前,应先做好:(1)源串首地址(如反向传送则应是末地址)SI(2)目的串首地址(如反向传送则应是末地址末地址)DI(3)串长度 CX(4)建立方向标志,建立方向标志(用以下两条指令).CLD 该指令使DF=0,可使SI,DI自动增量.STD 该指令使DF=1,可使SI,DI自动减量,注意:如果是REP STOSB(STOSW),则不用第(1);如果是REP LODSB(LODSW),则不用第(2),121,重复串传送,lea si,sourcelea di,destinationmov cx,100;cx传送次数cldrep movsb(rep movsb source,destination),again:movsb(movsb source,destination);传送一个字节 dec cx;传送次数减1 jnz again;判断传送次数cx是否为0;不为0(ZF=0),则转移again位置执行;否则,结束,演示,122,REPE/REPZ重复前缀指令,格式:REPE/REPZ CMPSB(CMPSW)REPE/REPZ SCASB(SCASW),执行操作:如(CX)=0或ZF=0,则退出串操作指令,否则执行以下步骤执行REPE/REPZ 后的串操作指令(3)(CX)(CX)-1(4)重复步骤(1)(3),REPE/REPZ 相等/为零时重复串操作,REPZ/REPE前缀可以理解为:当数据串没有结束(CX0),并且串相等(ZF1),则继续比较,123,REPNE/REPNZ重复前缀指令,格式:REPNE/REPNZ CMPSB(CMPSW)REPNE/REPNZ SCASB(SCASW),执行操作:(1)如(CX)=0或ZF=1,则退出串操作指令,否则执行以下步骤(2)执行REPNE/REPNZ 后的串操作指令(3)(CX)(CX)-1(4)重复(1)(3),REPNE/REPNZ 不相等/不为零时重复串操作,REPNZ/REPNE前缀可以理解为:当数据串没有结束(CX0),并且串不相等(ZF0),则继续比较,124,执行REPE/REPZ(REPNE/REPNZ)CMPSB之前,应先做好:(1)源串首地址(如反向传送则应是末地址)SI(2)目的串首地址(如反向传送则应是末地址末地址)DI(3)串长度 CX(4)建立方向标志DF,注意:如果是REPE/REPZ(REPNE/REPNZ)SCASB,则不用第(1),125,查找字符串是否有空格,lea di,stringmov al,20h;空格的ASCII码20hmov cx,countcldrepnz scasb;搜索jz found;发现空格,转jmp exit;不含空格,退出found:mov di-1,a;将空格换成字符a exit:.;,126,3.4.8 标志控制操作,标志控制指令对在FLAGS寄存器中的标志进行操作,127,进位标志(CF)操作指令,用于任意设置进位标志CFCLC(Clear carry);复位进位标志:CF0STC(Set carry);置位进位标志:CF1CMC(Complement carry);求反进位标志:CFCF,128,方向标志(DF)操作指令,串操作指令中,需要使用CLD(Clear direction);复位方向标志:DF0STD(Set direction);置位方向标志:DF1,129,中断标志(IF)操作指令,在编写中断服务程序时,需要控制可屏蔽中断的允许和禁止CLI(Clear interrupt);复位中断标志:DF0STI(Set interrupt);置位中断标志:DF1,130,标志寄存器传送,标志寄存器传送指令用来传送标志寄存器FLAGS的内容