资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,计算机原理讲义,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,标题样式,*,*,汇编语言,第三章 指令系统与汇编语言程序设计,指令,第,3.1,节 基本概念,指令与指令系统,(一)指令,(Instruction),指令,是微处理器执行某种操作的命令。,操作:,传送类,加工处理类:算术运算、逻辑运算、移位循环,控制类:转移、调用、中断,串操作类,指令系统与寻址方式,(二)指令系统(,Instruction Set,),微处理器全部指令的集合称为指令系统。,8086 CPU,包括,133,条指令,(三)寻址方式,一条指令通常包括两部分,操作码:规定所要执行的操作类型,操作数:所需要处理的数据或者数据的地址信息,我们把获得数据或者数据地址信息的方式称为,寻址方式,例:,MOV AX,1234H,在这条指令中有两个操作数,按照在指令中所处的位,置,将前者称为,目的操作数,,后者称为,源操作数,。该指令将数,据,1234H,传送到数据寄存器,AX,中,源操作数是,“,立即,”,寻址方,式,目的操作数是,“,寄存器,”,寻址方式。,隐含寻址,第,3.2,节,8086,寻址方式,寻址方式:寻找指令中操作数地址的方式。,数据寻址方式,(一)隐含寻址,指令已经默认对,CPU,中的某个寄存器进行操作,不用在指令中指明所使用的寄存器,即隐含了规定的操作数,这样的寻址方式称为,隐含寻址,。,例:,DAA,指令,只有操作码,无操作数,但已经规定是对,AL,中的内容进行十进制调整,立即寻址与寄存器寻址,(二)立即寻址,操作数直接写在指令中,在指令译码执行时,可以立即得到,同时把操作数又称作,“立即数”,例:,MOV AL,5 ;(AL),5,操作数,5,采用的就是立即寻址,(三)寄存器寻址,操作数放在,CPU,内部的寄存器中,在指令中直接指出寄存器的名字。,例:,MOV BX,AX ;(BX)(AX),以上三种寻址方式都是直接在处理器内部获得数据,操作速度快。,存储器寻址,(四)存储器操作数寻址,操作数存放在存储器中时,指令执行时必须通过总线在存储器中存取操作数。,执行单元,EU,根据指令中给出的寻址方式计算出,16,位的偏移量,称为,有效地址,(EA),送到总线接口单元,BIU,,经过加法器生成,20,位实际物理地址,在存储器读写总线周期对存储器进行操作,,一般在表示,EA,时,用,操作数,表示。,由于计算,EA,需要时间,进行总线操作比较慢,因此存储器操作寻址比前三种要慢。,直接寻址,指令中直接给出了操作数的有效地址,例:,MOV SI,2000H ;(SI),(2000H),上例中默认使用数据段,若需使用其他段可使用段超越,,MOV SI,ES:2000H,间接寻址,间接寻址,指令中寄存器的值是操作数的有效地址,可间接寻址的寄,存器有:,BX,、,BP,、,SI,、,DI,例:,MOV AL,BX ;(AL),(BX),BX,用于间接寻址时,默认段寄存器为,DS,,允许段超越,BP,用于间接寻址时,默认段寄存器为,SS,,允许段超越,SI,用于间接寻址时,默认段寄存器为,DS,,允许段超越,DI,用于间接寻址时,只有在串操作指令中,默认段寄存器为,ES,,其余情况默认段寄存器均为,DS,,不允许段超越,直接寻址时,默认段寄存器为,DS,,允许段超越,注:,IP,只能在代码段中,(CS),寻址,,SP,只能在堆栈段,(SS),中,寻址,相对寻址,相对寻址,基址寻址,操作数的有效地址是一个基址寄存器的内容加上一个,8,位或者,16,位的偏移量,基址寄存器是,BX,或者,BP,。,例:,MOV AX,BX+1000H ;(AX),(BX)+1000H),有时也写成,MOV AX,1000HBX,或,MOV AX,BX1000H,变址寻址,操作数的有效地址是一个变址寄存器的内容加上一个,8,位或者,16,位的偏移量,变址寄存器是,SI,和,DI,。,例:,MOV AX,ARRAYSI ;(AX),(SI)+ARRAY),在,C,语言中,常使用全局数组,例如定义了一个全局数组,A3,具有三个元素,分别为,A0,、,A1,、,A2,,实,际上,A,在编译时就转换成具体的在数据段中分配的位置,例如,1000H,,下标,0,、,1,、,2,一般就存放在寄存器中,如,SI,,通过,1000HSI,就可以访问到具体的数据。,基址变址寻址,操作数的有效地址是由基址寄存器和变址寄存器的内容相加产生,例:,MOV AX,BP+SI ;(AX)(BP)+(SI),相对基址变址寻址,操作数的有效地址是由基址寄存器、变址寄存器和偏移量三者相加产生。,例:,MOV AX,BX+SI+3H,;(AX)(BX)+(SI)+3H),有时也可写成,MOV AX,3HBXSI,或,MOV AX,3HBX+SI,基址变址寻址,I/O,端口寻址,数据串寻址,DS:SI,指示源串,,ES:DI,指示目的串,串长度计数用,CX,,并自动修改指针和计数器值,只用于串操作命令。,例:,MOVSB ;(ES:DI),(DS:SI),,,(CX)=(CX)-1,,,;(SI)=(SI)+1,(DI)=(DI)+1,(五),I/O,端口寻址,操作数存放在,I/O,端口中,指令执行时必须通过累加器(,AX,或,AL,)实现对端口的访问。,直接端口寻址,指令直接提供,8,位端口的地址。,例:,IN AL,63H ;(AL),(0063H),在端口寻址时,地址可以不需要加,,当端口地址用一个字节来表示时,可使用直接端口寻址,I/O,端口寻址,间接端口寻址,由,DX,寄存器给出,16,位端口地址。,例:,MOV DX,162H,IN AX,DX,从端口,162H,读取一个字的数据到,AX,中,实质是用,DX,间接表示端口地址。,比较:,MOV AX,DX ;(AX),(DX),IN AX,DX ;(AX),(DX),程序寻址,程序寻址方式,(一)段内直接寻址,短跳转:把,IP,的内容加上一个字节的补码数作为新的,IP,,往前最多跳,-128,个字节,往后最多跳,127,个字节。,近跳转:把,IP,的内容加上两个字节的补码数作为新的,IP,,往前最多跳,-32768,个字节,往后最多跳,32767,个字节。,(二)段内间接寻址,将寄存器或存储器操作数的内容赋给,IP,,,程序寻址,(三)段间直接寻址,直接在指令中给出新的,CS,和,IP,内容,(四)段间间接寻址,用存储器操作数的内容赋给,CS,和,IP,第,3.3,节,8086,指令格式,指令格式,指令一般由,1,6,个字节组成,具体格式如下:,7,6,5,4,3,2,1,0,OPCODE,D,W,7,6,5,4,3,2,1,0,MOD,REG,R/M,字节,1,字节,2,字节,3,字节,4,LOW DISP,或,DATA,HIGH DISP,或,DATA,字节,5,字节,6,LOW DATA,HIGH DATA,(一)说明,字节,1,OPCODE,:指令操作码,D,:操作数传输方向,(,立即数指令和串操作指令除外,),D=0,,,Reg,为源操作数,D=1,,,Reg,为目的操作数,W,:操作数字节长度,W=0,,字节操作,W=1,,字操作,指令格式,字节,2,,寻址方式,MOD,:寻址方式字段,00,存储器方式,指令中无偏移量,01,存储器方式,指令中有,8,位偏移量,10,存储器方式,指令中有,16,位偏移量,11,寄存器方式,指令中无偏移量,Reg,:寄存器编码字段,000=AL/AX 100=AH/SP,001=CL/CX 101=CH/BP,010=DL/DX 110=DH/SI,011=BL/BX 111=BH/DI,指令格式,R/M,:寄存器,/,存储器字段,在,MOD=11,寄存器模式下,,R/M,给出,第二个操作数的寄存器编码。,在,MOD11,存储器模式下,,R/M,给出计算有效地址的方法。,R/M,W=0,W=1,R/M,MOD=00,MOD=01,MOD=10,000,AL,AX,000,BX+SI,BX+SI+D8,BX+SI+D16,001,CL,CX,001,BX+DI,BX+DI+D8,BX+DI+D16,010,DL,DX,010,BP+SI,BP+SI+D8,BP+SI+D16,011,BL,BX,011,BP+DI,BP+DI+D8,BP+DI+D16,100,AH,SP,100,SI,SI+D8,SI+D16,101,CH,BP,101,DI,DI+D8,DI+D16,110,DH,SI,110,直接地址,BP+D8,BP+D16,111,BH,DI,111,BX,BX+D8,BX+D16,MOD=11,MOD,11,有效地址计算方法,指令格式,字节,3,字节,6,DISP,:存储器操作数地址偏移量,长度由,MOD,字段定义,DATA,:指令中的立即数,例:,MOV AX,BX,指令码为:,8B 07,MOV BX+SI+2000H,2345H,指令码为:,C7 80 00 20 45 23,MOV AX,BX,指令码为:,89 D8,第,3.4,节、,8086,指令系统,一、操作数符号表示,DST:,目的操作数,SRC:,源操作数,TARGET:,循环、转移和调用指令操作数,reg,:,寄存器操作数,字节或字,reg8:,寄存器操作数,字节,reg16:,寄存器操作数,字,mem,:,存储器操作数,,字节或字,mem8:,字节型,存储器操作数,mem16:,字型,存储器操作数,mem32:,双字型,存储器操作数,acc:,累加器,AL,或,AX,seg_reg,:,段寄存器,imm,:,立即操作数,字节或字,imm8:8,位立即操作数,imm16:16,位立即操作数,short_label,:,短标号,(8位偏移量),near_label,:,近标号,(16位地址或偏移),far_label,:,远标号,(,32,位地址),二、数据传送指令,(一)通用数据传送指令,MOV DST,SRC;(DST)(SRC),具体指令:,mov,mem,acc,mov,acc,mem,mov,reg,reg,mov,reg,mem,mov,mem,reg,mov,reg,imm,mov,mem,imm,mov,seg_reg,reg16 ;CS,除外,mov,seg_reg,mem16;CS,除外,mov,reg16,seg_reg,mov,mem16,seg_reg,例:,合法指令:,MOV AX,SI;(AX)(SI),MOV AL,SI;(AL)(SI),MOV DS,AX;(DS)(AX),MOV AX,DS;(AX)(DS),MOV SI,2000H;(SI),2000H,MOV SI,20H;(SI),20H,MOV SI,2000H;(SI)(2000H),MOV SI,SI+6;(SI)(SI)+6),MOV AX,AX;(AX)(AX),非法指令:,MOV SI,2000H,MOV CS,BX,MOV DS,2000H,(二)堆栈及堆栈操作,1,堆栈,堆栈是一种按先进后出(,FILO,)原则存取的存储器,它由堆栈指针寄存器,SS:SP,和,RAM,中的一部分组成,主要用于保护现场和恢复现场。,SP,的内容总是指向栈顶,即最后推入信息所在单元。,2,进栈指令,PUSH SRC;(SP)(SP)-2,(SP)+1,(SP)(SRC),具体指令:,PUSH reg16,PUSH,seg_reg,PUSH mem16,3,出栈指令,POP DST;(DST)(SP)+1,(SP),(SP)(SP)+2),具体指令:,POP reg16,POP,seg_reg,POP mem16,4,堆栈的应用,主要用于子程序调用或中断子程序的现场保护和恢复,以及参数传递等。,例,1,、保护现场,fun:PUSH DS,PUSH ES,PUSH AX,PUSH BX,;,处理部分,POP BX,POP AX,POP ES,POP DS,RET,例,2,、用堆栈交换数据,PUSH AX,PUSH BX,POP AX,POP BX,堆栈的应用,(三),交换指令,(三)交换指令,XCHG DST,SRC,;(DST)(SRC),具体指令:,XCHG,acc,reg,XCHG,mem,reg,XCHG,reg,reg,例1:,XCHG AX,BX;(AX)(BX),XCHG AL,BL;(AL)(BL),例2:使用3种方法完成将寄存器,AX,和,BX,内容交换。,方法1,XCHG AX,BX;(AX)(BX),方法,2,PUSH AX,PUSH BX,POP AX,POP BX,方法,3,:,MOV CX,AX,MOV AX,BX,MOV BX,CX,1,、输入指令,IN AL,PORT;(AL)(PORT),IN AX,PORT;(AX)(PORT),IN AL,DX;(AL)(DX),IN AX,DX;(AX)(DX),PORT,为8位直接地址,2,、输出指令,OUT PORT,AL;(PORT)(AL),OUT PORT,AX;(PORT)(AX),OUT DX,AL;(DX)(AL),OUT DX,AX;(DX)(AX),(四)累加器专用传送指令,3、,换码指令,XLAT SRC;,SRC,仅做类型检查,或,XLAT;,(AL)(BX)+(AL),例:,MOV,BX,offset,TABLE,XLAT TABLE,TABLE:DB 0,DB 1,DB 4,DB 9,DB 16,DB 25,LEA (load effective address),LDS (load DS with pointer),LES (load ES with pointer),1,、有效地址传送指令,LEA reg16,SRC;(reg16),SRC,例:,MSG db,Hello$,LEA DX,MSG;,指令执行后,(DX)=2000H,相当于,:MOV DX,OFFSET MSG,如果指令:,MOV DX,MSG,则:,(DH)=,e,,,(DL)=,H,(五)地址传送指令,2,、,指针送寄存器和,DS,LDS reg16,mem32,;,(reg16),(mem32),;(DS)(mem32+2),把源操作数指定的,4,个字节传送到指定的寄存器及,DS,寄存器中。,例:,VECT DW 01F0H,DW 2018H,LDS BX,VECT;,执行后:,(DS)=2018H,(BX)=01F0H,3、,指针送寄存器和,ES,LES reg16,mem32,;(reg16),(mem32),;,(ES)(mem32+2),把源操作数指定的,4,个字节传送到指定的寄存器及,E,S,寄存器中。,地址传送指令,(,六)标志寄存器传送,1,、,LAHF;(AH)(flag,低字节,),2,、,SAHF;(flag,低字节,)(,AH),3,、,PUSHF;(SP),(SP)-2,(SP)+1),(SP)flag,4,、,POPF;,flag(SP)+1),(SP),(SP)(SP)+2,(,六)标志寄存器传送,三、算术指令,(一)加法指令,1,、,ADD DST,SRC,;,(DST),(SRC)+(DST),具体指令:,ADD,reg,reg,ADD,reg,mem,ADD,mem,reg,ADD,reg,imm,ADD,mem,imm,ADD,acc,imm,2,、,ADC DST,SRC,;,(DST),(SRC)+(DST)+CF,具体指令,:,ADC,reg,reg,ADC,reg,mem,ADC,mem,reg,ADC,reg,imm,ADC,mem,imm,ADC,acc,imm,3,、,INC DST,;(DST)(DST)+1,具体指令:,INC reg16,INC reg8,INC,mem,算术类指令,间接寻址程序:,LEA SI,DATA1,LEA DI,DATA2,LEA BX,RESULT,MOV AX,SI,ADD AX,DI,MOV BX,AX,MOV AX,SI+2,ADC AX,DI+2,MOV BX+2,AX,直接寻址程序:,MOV AX,DATA1,ADD AX,DATA2,MOV RESULT,AX,MOV AX,DATA1+2,ADC AX,DATA2+2,MOV RESULT+2,AX,例:将数据段,DATA1,和,DATA2,中的,32,位二进制无符号数相加,结果存放在,RESULT,单元中,(二)减法指令,1、,SUB DST,SRC,;(DST),(DST)-(SRC),具体指令:,SUB,reg,reg,SUB,reg,mem,SUB,mem,reg,SUB,reg,imm,SUB,mem,imm,SUB,acc,imm,2,、,SBB DST,SRC,;(DST),(DST)-(SRC)-CF,具体指令:,SBB,reg,reg,SBB,reg,mem,SBB,mem,reg,SBB,reg,imm,SBB,mem,imm,SBB,acc,imm,5、,CMP DST,SRC,;(DST)-(SRC),仅影响标志,具体指令:,CMP,reg,reg,CMP,reg,mem,CMP,mem,reg,CMP,reg,imm,CMP,mem,imm,CMP,acc,imm,3,、,DEC DST,;(DST)(DST)-1,具体指令:,DEC reg16,DEC reg8,DEC,mem,4,、,NEG DST,;(DST)=0-(DST),具体指令:,NEG,reg,NEG,mem,(二)减法指令,1,、无符号数乘法,MUL SRC,;(AX),(AL)*(SRC),(DX,AX)(AX)*(SRC),具体指令:,MUL reg8,MUL reg16,MUL mem8,MUL mem16,(三)乘法指令,2,、有符号数乘法,IMUL SRC,;(AX),(AL)*(SRC),(DX,AX)(AX)*(SRC),具体指令:,IMUL reg8,IMUL reg16,IMUL mem8,IMUL mem16,(四)除法指令,1,、无符号数除法指令,DIV SRC,;(AL),(AX)/(SRC),(AH)(AX)%(SRC),或,(AX),(DX,AX)/(SRC),(DX),(DX,AX)%(SRC),具体指令:,DIV reg8,DIV reg16,DIV mem8,DIV mem16,2,、有符号数除法指令,IDIV SRC,;,操作与,DIV,相同,具体指令:,IDIV reg8,IDIV reg16,IDIV mem8,IDIV mem16,3,、字转换成字节指令,(有符号数),CBW,;,若,(AL)80H,则,(AH),0,,否则,(AH),FFH,。,4,、有符号字转换成双字指令,CWD;,若,(AX)8000H,则,(DX),0,否则,(DX),FFFFH.,(五),BCD,码调整指令,1、8086支持两种,BCD,码运算,压缩,BCD,码,,通常,BCD,码。每个字节,2,位,BCD,码。如:,10010101,B=95H,,值为,95,非压缩,BCD,码,,低,4,位为,BCD,码,高,4,位为零。如:,00000101,B,表示,BCD,码,5,。,加减运算非压缩,BCD,码高,4,位的值可不为,0,,乘除时高,4,位必须是,0,。,2,、压缩,BCD,码调整指令,DAA;,对加法运算结果,(AL),进行,BCD,码调整。,DAS;,对减,法运算结果,(AL),进行,BCD,码调整。,3,、非压缩,BCD,码调整,AAA;,对加法运算非压缩,BCD,码,进行调整,进位送,(AH),中,AAS;,对减法运算非压缩,BCD,码,进行调整,AAM;,对乘法运算非压缩,BCD,码,进行调整,AAD;,对除法运算非压缩,BCD,码,进行调整,例,:,下列程序段执行后,(AL)=?CF=?,MOV AL,89H,ADD AL,43H,DAA,算术类指令,例:将,32,位无符号数,DATA1,和,DATA2,相乘,结果存于,RESULT,中。,DA1H DA1L,*)DA2H DA2L,DA1L2LH DA1L2LL,DA1H2LH DA1H2LL,DA2H1LH DA2H1LL,+)DA1H2HH DA1H2HL,算术类指令,LEA SI,RESULT,SUB AX,AX,MOV SI+4,AX,MOV SI+6,AX,MOV AX,DATA1,MUL DATA2,MOV SI,AX,MOV SI+2,DX,MOV AX,DATA1+2,MUL DATA2,ADD SI+2,AX,ADC SI+4,DX,ADC SI+6,0,MOV AX,DATA1,MUL DATA2+2,ADD SI+2,AX,ADC SI+4,DX,ADC SI+6,0,MOV AX,DATA1+2,MUL DATA2+2,ADD SI+4,AX,ADC SI+6,DX,四、逻辑指令,2,、,OR,DST,SRC,;(DST)(DST)|(SRC),具体指令,OR,reg,reg,OR,reg,mem,OR,mem,reg,OR,reg,imm,OR,mem,imm,OR,acc,imm,3,、,NOT DST,;(DST),(DST),具体指令:,NOT,reg,NOT,mem,(,一)逻辑运算指令,1,、,AND DST,SRC,;(DST)(DST)&(SRC),具体指令,AND,reg,reg,AND,reg,mem,AND,mem,reg,AND,reg,imm,AND,mem,imm,AND,acc,imm,逻辑指令,4,、,XOR DST,SRC,;(DST)(DST)(SRC),具体指令,XOR,reg,reg,XOR,reg,mem,XOR,mem,reg,XOR,reg,imm,XOR,mem,imm,XOR,acc,imm,5,、,TEST,DST,SRC,;(DST)&(SRC),仅影响标志,具体指令,TEST,reg,reg,TEST,reg,mem,TEST,reg,imm,TEST,mem,imm,TEST,acc,imm,(二)移位指令,1,、逻辑左移指令,SHL,DST,count,;,;,count,可以为1,,;也可以为,CL,做移位计数。,具体指令:,SHL reg,1,SHL,reg,CL,SHL mem,1,SHL,mem,CL,;移位和循环指令均雷同。,2、,算术左移指令,SAL,DST,count,;,例:写出3条指令将寄存器,AX,中的数据乘,2,。,SAL AX,1,SHL AX,1,ADD AX,AX,3、逻辑右移,指令,SHR,DST,count,;,4、算术右移,指令,SAR,DST,count,;,5、循环左移,指令,ROL,DST,count,;,6、循环右移,指令,ROR,DST,count,;,7、带进位循环左移,指令,RCL,DST,count,;,8、带进位循环右移,指令,RCR,DST,count,;,五、串处理指令,(一)数据串传送指令,1,、串传送指令,MOVS DST,SRC;DST,与,SRC,做类型检查,,具体指令:,MOVSB;(ES:DI),(,DS:SI),(SI),(SI)1,(DI),(DI)1,MOVSW ;(ES:DI),(,DS:SI),(SI),(SI)2,(DI),(DI)2,其中,加、减地址指针,SI,和,DI,由,FLAG,中的,DF,决定,,DF=0,地址增加,,DF=1,地址减少。,2、建立方向标志指令,CLD ;DF0,STD ;,DF1,3,、重复串操作直到,(CX)=0,在串操作指令前,可加重复操作,REP,前缀,,使串连续操作直到,(CX)=0.,例:,REP MOVSB;,以,CX,寄存器做计数器,每传送一个数(,CX),减1,直到,(CX),为0。,串操作类指令,例,1,:,将,1000H,开始的,10,个字节移动到,2000H,开始的单元,MOV SI,1000H ;,置源操作数起始地址,MOV DI,2000H ;,置目的操作数起始地址,MOV AX,DS ;,将,DS,和,ES,段统一,比,PUSH DS,MOV ES,AX ;POP ES,要快,MOV CX,0AH ;,初始化,CX,为,10,,移动,10,个字节,CLD ;,使,DF=0,,使地址作增量变化,REP MOVSB ;(ES:DI),(,DS:SI),,,SISI+1,;,(DI)(DI)+1,INT 3 ;,断点指令,4,、存入串指令,STOS DST;,DST,做类型检查,具体指令:,STOSB,;(ES:DI)(AL),(DI)(DI)1,STOSW,;(ES:DI)(AX),(DI)(DI)2,由,DF,决定方向,可加入前缀,REP,。,5,、从串中取指令,LODS SRC;SRC,做类型检查,具体指令:,LODSB,;(AL)(DS:SI),(SI)(SI)1,LODSW,;(AX)(DS:SI),(SI)(SI)2,地址增减由,DF,决定。,串操作类指令,1,、串比较指令,CMPS SRC,DST,;,SRC,和,DST,仅做类型检查,具体指令:,CMPSB;(DS:SI)-(ES:DI),(SI)(SI)1,(DI)(DI)1,CMPSW;(DS:SI)-(ES:DI),(SI)(SI)2,(DI)(DI)2,串比较仅影响标志。,地址增减由,DF,决定。,2,、条件重复前缀,(1),相等或为,0,时重复,REPZ,REPE,执行操作:若,(CX)=0,或,ZF=0,(比较不相等)时退出,否则继续执行。,(2),不相等或不为,0,时重复,REPNZ,REPNE,执行操作:若,(CX)0,且,ZF=0,(比较不相等)时继续执行,否则退出。,(,二)字符串扫描和比较指令,3,、串扫描指令,SCAS DST,;,DST,做类型检查,具体指令:,SCASB;(AL)-(ES:DI),;,(DI)(DI)1,影响标志,SCASW;(AX)-(ES:DI),;,(DI)(DI)2,影响标志,地址增减由,DF,决定。,可加条件前缀。,例:,REPNZ SCASB,例:,以,ds:si,为起始地址以,NULL,结束标志的字符串,计算其长度,结果存于(,AX,)中,mov,di,si,;,mov,ax,ds,;,mov,es,ax;es:di,指向字符串,xor,al,al,;(al),清零,mov,cx,0ffffh;(cx),置初值,cld,repnz,scasb,;,查找结束符,mov,ax,cx,not ax ;(,cx,),含结束符长度,dec,ax ;,去掉结束符,ret,六、控制转移指令,(一)无条件转移指令,JMP TARGET,;,转移到目的地址,具体指令:,JMP,short_label,;(IP)-(,IP)+short_label,JMP,near_label,;(IP)-(,IP)+near_label,JMP,far_label,;(CS:IP)-,far_label,JMP mem16;,间接转移,;(IP)-(mem16),JMP reg16 ;,间接转移,;(IP)-(reg16),JMP mem32;,间接转移,;(IP)-(mem32),;(CS)-(mem32+2),(,二)条件转移指令,1,、根据单个标志转移,JZ,short_label,;,结果为,0,转移,JE,short_label,;,结果相等转移,测试条件:,ZF=1,JNZ,short_label,;,结果不为,0,则转移,JNE,short_label,;,结果不相等则转移,测试条件:,ZF=0,JS,short_label,;,结果为负则转移,测试条件:,SF=1,JNS,short_label,;,结果非负则转移,测试条件:,SF=0,JNO,short_label,;,结果不溢出则转移,测试条件:,OF=0,JO,short_label,;,结果溢出则转移,测试条件:,OF=1,JP,short_label,;,奇偶为,1,则转移,JPE,short_label,;,偶转移,测试标志:,PF=1,JNP,short_label,;,奇偶为,0,则转移,JPO,short_label,;,奇转移,测试标志:,PF=0,JB,short_label,;,有借位转移,JNAE,short_label,;,不大于等于转移,JC,short_label,;,有进位转移,测试条件:,CF=1,JNB,short_label,;,无借位转移,JAE,short_label,;,大于等于转移,JNC,short_label,;,无进位转移,测试条件:,CF=0,条件转移指令,2,、两个无符号数比较转移,JB/JNAE/JC;CF=1,JNB/JAE/JC;CF=0,JBE,short_label,;,小于等于转移,JNA,short_label,;,不大于转移,测试条件:,CF|ZF=1,JNBE,short_label,;,不小于等于,;,转移,JA,short_label,;,大于转移,测试条件:,CF|ZF=0,3,、两个有符号数比较转移,JL,short_label,;,小于转移,JNGE,short_label,;,不大于等于转移,测试条件:,SFOF=1,JNL,short_label,;,不,小于转移,JGE,short_label,;,大于等于转移,测试条件:,SFOF=0,JNLE,short_label,;,不,小于,等于,转移,JG,short_label,;,大于转移,测试条件:(,SFOF)|ZF=0,JLE,short_label,;,小于,等于,转移,JNG,short_label,;,不大于转移,测试条件:(,SFOF)|ZF=1,条件转移指令,(三)循环指令,1,、,LOOP,short_label,;(CX)(CX)-1,(CX)0,则转移,2,、,LOOPZ,short_label,LOOPE,short_label,;(CX)(CX)-1,(CX)0,且,ZF=1,(为,0,)则转移,3,、,LOOPNZ,short_label,LOOPNE,short_label,;(CX)(CX)-1,(CX)0,且,ZF=0,(,非,0,)则转移,4,、测试,CX,值,为,0,则转移,JCXZ,short_label,;,(CX)=0,则转移,测试条件:,(CX)=0,(三)循环指令,(四)子程序调用与返回,1,、子程序调用指令,CALL TARGET,具体指令,CALL,near_proc,;,段内调用,CALL,far_proc,;,段间调用,CALL mem16;,CALL regp16;,CALL mem32;,2,、返回指令,RET ;,返回指令,9A,00,01,00,20,1000:0020,CS:IP,M,2000:0100,指令,1,指令,2,RET,CALL 2000:0100,2FFE,10,00,00,25,1000:0025,M,2FFA,SP,SP,堆栈,RET IMM16,带立即数返回,说明:在,RET,指令的基础上,当从堆栈中弹出,IP,和,CS,后,再将,SP,加上一个字的立即数,使得返回后,(SP),(,SP,),+,IMM,16,(,五)中断调用与返回,中断调用,INT n,操作:依次将,FLAG,,当前,CS,和,IP,(即断点地址)放,入堆栈,清除,IF,和,TF,。执行中断类型码为,n,的,中断服务程序。,注:,INT n,的机器码为,CDH n,INT 3,的机器码特殊,为,CCH,(五)中断调用与返回,INTO,说明:在有符号数运算结束以后,可以使用,INTO,,若,OF=1,,则执行中断指令,INT 4,,否则无操作。,IRET,中断返回指令,从中断程序返回主程序,恢复断点和,FLAG,(六)控制类指令,标志处理指令,CLC/STC/CMC,对,CF,清,0/,置位,/,取反,CLD/STD,对,DF,清,0/,置位,CLI/STI,对,IF,清,0/,置位,(六)控制类指令,处理器控制指令,NOP,空操作指令,占用一个字节的机器码,不执行任何操作,HLT (Halt),停机指令,该指令使处理器处于停机状态,以便等待一次外部中断到来。,WAIT,等待指令,该指令使处理器处于空转状态,也可用来等待外部中断的到来,ESC (Escape),换码指令 用作前缀,格式:,ESC MEM,,其中,MEM,指出一个存储单元,,ESC,指令把该存储单元的内容送到数据总线去。,LOCK,封锁指令 用作前缀,该指令与其他指令联合,用来维持总线的封锁信号直到与其联合的指令执行完为止。,处理器控制指令,
展开阅读全文