常用指令系统80x86汇编语言指令的一般格式为:[标号:]指令助记符[操作数][;注释][]中的内容为可选项。例如:START:MOVAX,DATA;DATA送AX标号:符号地址,表示指令在内存中的位置。标号后应加冒号:。指令助记符:指令名称,是指令功能的英文缩写。操作数:指令要操作的数据或数据所在的地址。寄存器,常量,变量,表达式。注释:每行以分号“;”开头,汇编程序不处理。8086指令系统可以分为5组:(1)数据传送指令(2)算术运算指令(3)逻辑指令与移位指令(4)串操作指令(5)程序转移指令5.1数据传送指令通用数据传送指令累加器专用传送指令地址传送指令标志寄存器传送5.1.1通用数据传送指令MOV传送PUSH进栈POP出栈XCHG交换(1)MOV传送指令格式:MOVDST,SRC操作:(DST)←(SRC)DST表示目的操作数,SRC表示源操作数。功能:将源操作数传送到目的操作数。双操作数指令的规定源操作数与目的操作数的长度必须一致。源操作数与目的操作数不能同时为存储器。目的操作数不能为CS和IP,因为CS:IP是程序当前地址。目的操作数不可以是立即数。例5.1立即数与寄存器的传送MOVAH,89;十进制数MOVAX,2016H;十六进制数,后面加HMOVAX,0ABCDH;十六进制数,因非数字(0~9)开头,前面加0MOVAL,10001011B;二进制数,后面加BMOVAL,‘A’;字符‘A’的ASCII码是41H,相当于立即数以下指令是错误的:MOVAH,258;258超出8位(二进制)MOVAX,DH;两个操作数长度不一致例5.2在指令中说明内存单元的类型,以便操作数长度匹配。MOV[BX],AX以下指令是错误的:MOV[BX],0指令改写为:MOVBYTEPTR[BX],0MOVWORDPTR[BX],0例5.3段地址寄存器的传送MOVAX,DATA_SEGMOVDS,AX段地址寄存器须通过寄存器得到段地址,不能直接由符号地址、段寄存器、立即数得到。以下指令是错误的:MOVDS,DATA_SEG;段寄存器不接受符号地址MOVDS,ES;段寄存器之间不能直接传送MOVDS,1234;段寄存器不接受立即数MOVCS,AX;指令合法,但代码段寄存器不能赋值例5.4传送变量MOVBX,TABLE;假定TABLE是16位的变量把变量TABLE的值送给BX。以下指令是错误的:MOVBL,TABLE;TABLE是16位的变量,操作数长度不一致MOV[BX],TABLE;两个操作数不能同为内存单元例5.5传送地址MOVBX,OFFSETTABLEOFFSET为偏移地址属性操作符,通常是把变量TABLE的偏移地址送给BX。以下指令是错误的:MOVBL,OFFSETTABLE不管变量类型如何,其有效地址总是16位。(2)PUSH进栈指令格式:PUSHSRC操作:(SP)←(SP)-2((SP)+1,(SP))←(SRC)堆栈:后进先出内存区,以字为单位传送,SS:SP总是指向栈顶。(3)POP出栈指令格式:POPDST操作:(DST)←((SP)+1,(SP))(SP)←(SP)+2例5.6进栈和出栈MOVBX,1234HPUSHBXPOPAX例5.7在DEBUG下如下指令也是合法的:PUSH[2016];把地址为DS:[2016]的字送往栈顶(SS:SP所指内存)POP[2016];把栈顶(SS:SP所指内存)的字送往DS:[2016]的内存(4)XCHG交换指令格式:XCHGOPR1,OPR2操作:(OPR1)(OPR2)功能:把两个操作数互换位置。遵循双操作数指令的规定,但操作数不能为立即数。例5.8XCHGAX,BX;两个寄存器长度相等XCHGAX,[BX];AX要求[BX]也取字单元XCHGAX,VAR;VAR必须是字变量以下指令是错误的:XCHGAX,5;显然操作数不能为立即数XCHG[BX],VAR;操作数不能同为内存单元XCHGAX,BH;操作数长度要一致5.1.2累加器专用传送指令IN;从I/O端口输入OUT;向I/O端口输出XLAT;换码其中I/O端口是CPU与外设传送数据的接口,单独编址,不属于内存,端口地址范围0000~FFFFH.这组指令只限于AX,AL累加器。(1)IN输入指令长格式:INAL,PORT(字节);00~FFHINAX,PORT(字)操作:AL←(PORT)AX←(PORT)功能:把端口PORT的数据输入到累加器。短格式:INAL,DX(字节);PORT放入DXINAX,DX(字)操作:AL←((DX))AX←((DX))功能:把DX指向的端口的数据输入到累加器。例5.9读端口INAX,61HMOVBX,AX把端口61H的16位数据输入到累加器AX,再转送BX。例5.10MOVDX,2F8HINAL,DX把端口2F8H的8位数据输入到累加器AL。INAX,2F8H;错,端口号超出8位,不能用长格式INAX,[DX];错,端口地址不能用[](2)OUT输出指令长格式:OUTPORT,AL(字节);00-FFHOUTPORT,AX(字)操作:PORT←ALPORT←AX功能:把累加器的数据输出到端口PORT。短格式:OUTDX,AL(字节);0000-FFFFHOUTDX,AX(字)操作:(DX)←AL(DX)←AX功能:把累加器的数据输出到DX指向的端口。例5.11写端口OUT61H,ALOUTDX,AL(3)XLAT换码指令格式:XLAT操作:AL←(BX+AL)功能:把BX+AL的值作为有效地址,取出其中的一个字节送AL。例5.12换码MOVAX,DATAMOVDS,AXMOVBX,100HMOVAL,4XLATINT21H•XLAT执行前•XLAT执行后5.1.3地址传送指令LEA有效地址送寄存器LDS指针送寄存器和DSLES指针送寄存器和ES(1)LEA有效地址送寄存器指令格式:LEAREG,SRC操作:REG←SRC功能:把源操作数的有效地址EA送到指定的寄存器。例5.13取变量的有效地址LEABX,TABLEMOVBX,OFFSETTABLE上面2条指令等效。TABLE无论是何类型的变量,其有效地址总是16位。例5.14LEABX,[2016H]MOVBX,OFFSET[2016H]指令执行后,BX=2000H。(2)LDS指针送寄存器和DS指令格式:LDSREG,SRC操作:REG←(SRC)DS←(SRC+2)功能:把源操作数SRC所指向的内存单元中的两个字送到指定的寄存器REG和DS。例5.15LDSSI,[BX]指令执行前,如DS=2000H,BX=0400H,(2000:0400)=1234H,(2000:0402)=5678H,指令执行后,SI=1234H,DS=5678H。(3)LES指针送寄存器和ES指令格式:LESREG,SRC操作:REG←(SRC)ES←(SRC+2)功能:把源操作数SRC所指向的内存单元中的两个字送到指定的寄存器REG和ES。例如LESDI,[10H]DS=C000H,(C0010H)=0180H,(C0012H)=2000H结果DI=0180H,ES=2000H5.1.4标志寄存器传送指令LAHF标志寄存器FLAGS的低字节送AHSAHFAH送FLAGS的低字节PUSHF标志进栈POPF标志出栈以上传送类指令均不影响标志位,除SAHF,POPF外.例5.16LAHF;标志寄存器低字节送AH寄存器SAHF;AH送标志寄存器PUSHF;标志入栈POPF;标志出栈5.2算术运算指令加减乘除四则运算是计算机经常进行的基本操作。算术运算指令主要实现二进制(和十进制)数据的四则运算。5.2.1类型扩展指令CBW:AL扩展为AXCWD:AX扩展为DX,AX扩展方法为符号扩展。例5.17正数的扩展MOVAL,52H;AL中的52H是正数CBW;指令执行后,AX=0052HCWD;指令执行后,DX=0000HAX=0052H例5.18负数的扩展MOVAL,88H;AL中的88H是负数CBW;指令执行后,AX=FF88HCWD;指令执行后,DX=FFFFHAX=FF88H5.2.2加法指令ADD加法ADC带进位加法INC加1(1)ADD加法指令格式:ADDDST,SRC操作:(DST)←(DST)+(SRC)例5.19无符号数的溢出标志位CFMOVAL,72HADDAL,93H例5.20有符号数的溢出标志位OFMOVAL,92HADDAL,93H溢出判断,以8位二进制数为例综上所述,CF=1为无符号数的溢出,OF=1为有符号数的溢出.OF位:若两个操作数的符号相同,而结果的符号与之相反时OF=1,否则OF=0。CF位:有进位/借位时CF=1,否则CF=0。(2)ADC带进位加法指令格式:ADCDST,SRC操作:(DST)←(DST)+(SRC)+CF例5.21用16位指令实现32位的双精度数的加法运算。设数A存放在目的操作数寄存器DX和AX,其中DX存放高位字。数B存放在寄存器BX和CX,其中BX存放高位字。如:DX=2000H,AX=8000HBX=4000H,CX=9000H指令序列为:ADDAX,CX;低位字加ADCDX,BX;高位字加第一条指令执行后,AX=1000H,CF=1,OF=1,此处OF=1不必在意。第二条指令执行后,DX=6001H,CF=0,OF=0,表示结果正常,无溢出。(3)INC加1指令格式:INCOPR操作:(OPR)←(OPR)+1除INC不影响CF,它们都影响条件标志位.条件标志位(条件码)最主要有:进位CF,零ZF,符号SF,溢出OF5.2.3减法指令SUB减法SBB带借位减法DEC减1NEG求补CMP比较(1)SUB减法指令格式:SUBDST,SRC操作:(DST)←(DST)-(SRC)(2)SBB带借位减法指令格式:SBBDST,SRC操作:(DST)←(DST)-(SRC)-CF(3)DEC减1指令格式:DECOPR操作:(OPR)←(OPR)-1(4)NEG求补指令格式:NEGOPR操作:(OPR)←-(OPR)功能:对OPR求补,求-OPR,即反码+1.只有OPR为0时,CF=0。(5)CMP比较指令格式:CMPOPR1,OPR2操作:(OPR1)-(OPR2)不回送结果,只产生标志位。CF=1为无符号数溢出,OF=1为有符号数溢出.例5.22考察减法中的标志位CF、OFMOVAL,72HSUBAL,93H例5.23用16位指令实现32位的双精度数的减法运算。设数A存放在目的操作数寄存器DX和AX,其中DX存放高位字。数B存放在寄存器BX和CX,其中BX存放高位字。如:DX=2001H,AX=8000HBX=2000H,CX=9000H指令序列为:SUBAX,CX;低位字减法SBBDX,BX;高位字减法第一条指令执行后,AX=F000H,CF=1,而对OF=0,ZF=0,SF=1,不必在意。第二条指令执行后,DX=0000H,CF=0,OF=0,表示结果正确。ZF=1,SF=0。例5.24考察NEG指令MOVAX,3NEGAXMOVDX,0NEGDX指令序列执行后,AX=FFFDH=-3(补码),DX=0H。可以看出,NEG指令实际上就是求数X的相反数,即求0-X,只有当X=0时,CF=0,其它情况CF=1。例5.25考察CMP指令MOVAX,5DECAXCMPAX,5指令序列执行后,AX=4,ZF=0,SF=1,CF=1,OF=0。CMP指令虽作减法,但不回送结果,只是产生标志位,为程序员比较两个数的大小提供判断依据。5.2.4乘法指令MUL无符号数乘法IMUL有符号数乘法(1)M