第4章51汇编指令详解1.指令的定义指令是规定计算机进行某种操作的指令。一条指令只能完成有限的功能,为了使计算机完成一定的或者复杂的功能,就需要一系列指令。计算机能够执行各种指令的集合称为“指令系统”。计算机的主要功能也是由指令系统来体现的。80C51使用了7种寻址方式,共有111条指令。如果按照字节分:49条单字节,46条双字节,16条3字节。如果按照运算速度分:单周期指令64条,双周期45条,4周期2条。用助记符形式来表示的机器指令称为“汇编语言指令”。计算机的指令一般用汇编语言指令来表示。80C51系列单片机的指令共有111条指令,按照其功能特点分为5大类,即是:数据传送指令类、算术运算类、逻辑运算类、控制转移类和位操作类。符号定义表符号含义RnR0~R7寄存器n=0~7Direct直接地址,内部数据区的地址RAM(00H~7FH)SFR(80H~FFH)B,ACC,PSW,IP,P3,IE,P2,SCON,P1,TCON,P0@Ri间接地址Ri=R0或R18051/31RAM地址(00H~7FH)8052/32RAM地址(00H~FFH)#data8位常数#data1616位常数Addr1616位的目标地址Addr1111位的目标地址Rel相关地址bit内部数据RAM(20H~2FH),特殊功能寄存器的直接地址的位指令介绍指令字节周期动作说明一、算数运算指令2.指令的详解(字节周期)1.ADDA,Rn11将累加8器与寄存器的内容相加,结果存回累加器2.ADDA,direct21将累加器与直接地址的内容相加,结果存回累加器3.ADDA,@Ri11将累加器与间接地址的内容相加,结果存回累加器4.ADDA,#data21将累加器与常数相加,结果存回累加器5.ADDCA,Rn11将累加器与寄存器的内容及进位C相加,结果存回累加器6.ADDCA,direct21将累加器与直接地址的内容及进位C相加,结果存回累加器7.ADDCA,@Ri11将累加器与间接地址的内容及进位C相加,结果存回累加器8.ADDCA,#data21将累加器与常数及进位C相加,结果存回累加器//减法指令,如下,都是带借位减法,其中A为被减数,即A-Rn-CY=A9.SUBBA,Rn11将累加器的值减去寄存器的值减借位C,结果存回累加器10.SUBBA,direct21将累加器的值减直接地址的值减借位C,结果存回累加器11.SUBBA,@Ri11将累加器的值减间接地址的值减借位C,结果存回累加器12.SUBBA,#data21将累加器的值减常数值减借位C,结果存回累加器//INC将操作数所在指定单元内容加一,其中操作除了第一条13指令影响就标志为外,其余指令操作均不影响PSW13.INCA11将累加器的值加1;14.INCRn11将寄存器的值加l15.INCdirect21将直接地址的内容加116.INC@Ri11将间接地址的内容加117.INCDPTR11数据指针寄存器值加1说明:将16位的DPTR加1,当DPTR的低字节(DPL)从FFH溢出至00H时,会使高字节(DPH)加1,不影响任何标志位,此是唯一一条16位加一指令,如果低8位有进位,可以直接向高位进位。//假发指令与假发指令类似,是将其操作数所指定的调用内容减一。18.DECA11将累加器的值减119.DECRn11将寄存器的值减120.DECdirect21将直接地址的内容减121.DEC@Ri11将间接地址的内容减1//乘除法指令都是1个字节,4个周期22.MULAB14将累加器的值与B寄存器的值相乘,乘积的低位字节存回累加器,高位字节存回,注意AB中间没有空格。B寄存器说明:将累加器A和寄存器B内的无符号整数相乘,产生16位的积,低位字节存入A,高位字节存入B寄存器。如果积大于FFH,则溢出标志位(OV)被设定为1,而进位标志位为023.DIVAB14将累加器的值除以B寄存器的值,结果的商存回累加器,余数存回B寄存器说明:无符号的除法运算,将累加器A除以B寄存器的值,商存入A,余数存入B。执行本指令后,进位位(C)及溢出位(OV)被清除为024.DAA11将累加器A作十进制调整,若(A)3-09或(AC)=1,则(A)3-0←(A)3-0+6若(A)7-49或(C)=1,则(A)7-4←(A)7-4+6二、逻辑运算指令//汇编指令中的十进制调整指令://这条指令在进行BCD码加减法运算时,跟在ADD和ADDC指令之后,用来对压缩BCD码就行结果自动修正,使其仍然为压缩BCD码。在80C51单片机中,DAA不能对减法指令结果进行修正。//该指令是针对十进制的运算结果进行调整的,其实现的功能如下*当低4位A0~A39或者半进位位AC==1时,自动执行(A)+6-A*当结果的高四位A4-A79或者进位位CY==1时,自动执行(A)+60H-A*当结果的高四位A4-A79,低4位A0~A39时,自动执行(A)+66H-A//这种操作主要用于两个数安位进行逻辑操作,操作结果送至累加器A或者直接寻址单元。主要逻辑操作有“与”,“或”,“非”,以及位移、取反、清除等。25.ANLA,Rn11将累加器的值与寄存器的值做AND的逻辑判断,结果存回累加器26.ANLA,direct21将累加器的值与直接地址的内容做AND的逻辑判断,结果存回累加器27.ANLA,@Ri11将累加器的值与间接地址的内容做AND的逻辑判断,结果存回累加器28.ANLA,#data21将累加器的值与常数做AND的逻辑判断,结果存回累加器29.ANLdirect,A21将直接地址的内容与累加器的值做AND的逻辑判断,结果存回该直接地址30.ANLdirect,#data32将直接地址的内容与常数值做AND的逻辑判断,结果存回该直接地址//29,30两条指令,如果direct为I/O口,则进行“读-改-写”操作。//逻辑或操作,31.ORLA,Rn11将累加器的值与寄存器的值做OR的逻辑判断,结果存回累加器32.ORLA,direct21将累加器的值与直接地址的内容做OR的逻辑判断,结果存回累加器33.ORLA,@Ri11将累加器的值与间接地址的内容做OR的逻辑判断,结果存回累加器34.ORLA,#data21将累加器的值与常数做OR的逻辑判断,结果存回累加器35.ORLdirect,A21将直接地址的内容与累加器的值做OR的逻辑判断,结果存回该直接地址36.ORLdirect,#data32将直接地址的内容与常数值做OR的逻辑判断,结果存回该直接地址//逻辑异或操作37.XRLA,Rn11将累加器的值与寄存器的值做XOR的逻辑判断,结果存回累加器38.XRLA,direct21将累加器的值与直接地址的内容做XOR的逻辑判断,结果存回累加器39.XRLA,@Ri11将累加器的值与间接地扯的内容做XOR的逻辑判断,结果存回累加器40.XRLA,#data21将累加器的值与常数作XOR的逻辑判断,结果存回累加器41.XRLdirect,A21将直接地址的内容与累加器的值做XOR的逻辑判断,结果存回该直接地址42.XRLdirect,#data32将直接地址的内容与常数的值做XOR的逻辑判断,结果存回该直接地址43.CLRA11清除累加器的值为044.CPLA11将累加器的值反相//RL,RR循环移位指令,RRC,RLC带进位循环以移位指令45.RLA11将累加器的值左移一位46.RLCA11将累加器含进位C左移一位47.RRA11将累加器的值右移一位48.RRCA11将累加器含进位C右移一位49.SWAPA11将累加器的高4位与低4位的内容交换。(A)3-0←(A)7-4数据转移指令//内部数据传送指令50.MOVA,Rn11将寄存器的内容载入累加器51.MOVA,direct21将直接地址的内容载入累加器52.MOVA,@Ri11将间接地址的内容载入累加器53.MOVA,#data21将常数载入累加器54.MOVRn,A11将累加器的内容载入寄存器55.MOVRn,direct22将直接地址的内容载入寄存器56.MOVRn,gdata21将常数载入寄存器57.MOVdirect,A21将累加器的内容存入直接地址58.MOVdirect,Rn22将寄存器的内容存入直接地址59.MOVdirect1,direct232将直接地址2的内容存入直接地址160.MOVdirect,@Ri22将间接地址的内容存入直接地址61.MOVdirect,#data32将常数存入直接地址62.MOV@Ri,A11将累加器的内容存入某间接地址63.MOV@Ri,direct22将直接地址的内容存入某间接地址64.MOV@Ri,#data21将常数存入某间接地址65.MOVDPTR,#data1632将16位的常数存入数据指针寄存器//查表指令,注意是在程序存储区查表。66.MOVCA,@A+DPTR12(A)←((A)+(DPTR))累加器的值再加数据指针寄存器的值为其所指定地址,将该地址的内容读入累加器67.MOVCA,@A+PC12(PC)←(PC)+1;(A)←((A)+(PC))累加器的值加程序计数器的值作为其所指定地址,将该地址的内容读入累加器。修正值是从下一条语句开始算起。//CPU对片外RAM访问(既是外部数据传送指令)68.MOVXA,@Ri12将间接地址所指定外部存储器的内容读入累加器(8位地址)69.MOVXA,@DPTR12将数据指针所指定外部存储器的内容读入累加器(16位地址)70.MOVX@Ri,A12将累加器的内容写入间接地址所指定的外部存储器(8位地址)71.MOVX@DPTR,A12将累加器的内容写入数据指针所指定的外部存储器(16位地址)72.PUSHdirect22将直接地址的内容压入堆栈区73.POPdirect22从堆栈弹出该直接地址的内容//调用时有自动入栈出栈操作,而且是PC低位先入栈,高位后入栈。出栈时PC高位先出栈,低位后出栈。//PC入栈时,低位先入栈,高位后入栈。74.XCHA,Rn11将累加器的内容与寄存器的内容互换75.XCHA,direct21将累加器的值与直接地址的内容互换76.XCHA,@Ri11将累加器的值与间接地址的内容互换77.XCHDA,@Ri11将累加器的低4位与间接地址的低4位互换布尔代数运算78.CLRC11清除进位C为079.CLRbit21清除直接地址的某位为080.SETBC11设定进位C为181.SETBbit21设定直接地址的某位为182.CPLC11将进位C的值反相83.CPLbit21将直接地址的某位值反相//注意:在位与与位或运算中,目标操作数只能是C84.ANLC,bit22将进位C与直接地址的某位做AND的逻辑判断,结果存回进位C85.ANLC,/bit22将进位C与直接地址的某位的反相值做AND的逻辑判断,结果存回进位C86.ORLC,bit22将进位C与直接地址的某位做OR的逻辑判断,结果存回进位C87.ORLC,/bit22将进位C与直接地址的某位的反相值做OR的逻辑判断,结果存回进位C88.MOVC,bit21将直接地址的某位值存入进位C89.MOVbit,C22将进位C的值存入直接地址的某位90.JCrel22若进位C=1则跳至rel的相关地址91.JNCrel22若进位C=0则跳至rel的相关地址92.JBbit,rel32若直接地址的某位为1,则跳至rel的相关地址93.JNBbit,rel32若直接地址的某位为0,则跳至rel的相关地址94.JBCbit,rel32若直接地址的某位为1,则跳至rel的相关地址,并将该位值清除为0程序跳跃95.ACALLaddr1122调用2K程序存储器范围内的子程序(2字节)96.LCALLaddr1632调用64K程序存储器范围内的子程序(3字节)97.RET12从子程序返回98.RETI12从中断子程序返回99.AJMPaddr1122绝对跳跃(2K内)100.LJMPaddr163