第3章单片机指令系统3.1汇编语言与指令格式3.2寻址方式3.3指令系统3.1汇编语言与指令格式一、机器语言、汇编语言和高级语言程序设计语言有3种:1.机器语言:2.汇编语言3.高级语言如:PASCAL、C、FORTRAN、BASIC等二、指令格式标准格式如下[标号:]操作码[目的操作数][,源操作数][;注释]阶段指令以8位二进制的字节为单位,分为1.单字节指令例如:CLRA→E4H2.双字节指令例如:MOVA,#10H→74H10H3.三字节指令例如:MOV40H,#30H→75H40H30H三、伪指令1、汇编起始/定位指令ORG指令格式为:ORGnn2、等值/赋值指令EQU指令格式:字符名称EQU数字或汇编符号功能:使指令中的字符名称等价于给定的数字或汇编符号。例:PA8155EQU8001H3、定义字节指令DB(DefineByte)[标号:]DB8位二进制数表功能:把8位二进制数表依次存入从标号开始的连续的存储单元中。例:ORG1000HBUF1:DB38H,7FH,80HBUF2:DB45H,66H4、定义字指令DW(DefineWord)指令格式:[标号:]DW16例:ORG1500HSTART:MOVA,#20H….ORG1520HTAB:DW1234H,8AH,105、汇编结束指令END指令格式:[标号:]END[地址或标号]格式中标号以及END后面的地址或标号可有可无。功能:提供汇编结束标志。汇编程序遇到END后就停止汇编,对END以后的语句不予处理,故END应放在程序的结束处。3.2寻址方式在MCS-51单片机指令系统中,有以下7种寻址方式(一般针对源操作数):(1)立即寻址;(2)直接寻址;(3)寄存器寻址;(4)寄存器间接寻址;(5)基址寄存器加变址寄存器间接寻址;(6)相对寻址;(7)位寻址。1.立即寻址例如指令:MOVA,#3AHMOVDPTR,#0DFFFH2.(1)内部数据存储器的低128个字节单元(00H~7FH)。(2)特殊功能寄存器。特殊功能寄存器只能用直接寻址方式进行访问。(3)位地址空间。如:MOVA,3AHMOVA,P1MOVC,20H与MOVA,20H比较3.寄存器寻址在该寻址方式中,参加操作的数存放在寄存器里。寄存器包括8个工作寄存器R0~R7,累加器A,寄存器B、数据指针DPTR和布尔处理器的位累加器C。4.寄存器间接寻址在这种寻址方式中,寄存器的内容为操作数的地址。寄存器间接寻址只能使用寄存器R0、R1作为地址指针,寻址内部RAM区的数据;当访问外部RAM时,可使用R0、R1及DPTR作为地址指针。寄存器间接寻址符号为“@”,5、变址寻址(基址寄存器加变址寄存器寻址)这种寻址方式用于访问程序存储器中的数据表格,以DPTR或PC为基址寄存器,以A为变址寄存器,以两者相加形成的16位地址为操作数的地址。例1:MOVCA,@A+PC;PC(PC)+10100MOVA,#02H0102MOVCA,@A+PCPC0103NOP0104NOP0105DB32H结果把0105H单元的内容32H送到A中。只能存放在以PC为当前值为起始地址的256B范围内例2:MOVCA,@A+DPTR可以给DPTR赋任意值,可达整个64KB的ROM空间MOVA,#01HMOVDPTR,#TABLEMOVCA,@A+DPTR….TABLE:DB41HDB42H结果将数据42H送到A中。这两条变址寻址,特别适用于固定在程序存储器中的常数表格进行查表操作,也称查表指令.6.相对寻址例:指令JZ08H和JZ0F4H表示累加器A为零条件满足后,从源地址(2050H)分别向下、向上转移10个单元。(a)、(b)所示。这两条指令均为双字节指令,机器代码分别为:60H08H和60HF4H。图相对寻址示意图(a)指令JZ08H寻址示意图;(b)指令JZF4H寻址示意图7.位寻址:可直接对存储单元内部RAM的某位进行操作.操作对象为位寻址区20H~2FH、可位操作的SFR例:MOVC,30H;位地址为30H位(26H.0)中的数送CY.3.3指令系统按指令的功能,指令系统可分为下列5类:(1)数据传送;(2)算术运算;(3)逻辑和移位运算;(4)(5)位操作;一、数据传送类指令1.以累加器AMOVA,Rn;n=0~7,A←(Rn)MOVA,direct;A←direct为内部RAM或SFR地址MOVA,@Ri;i=0,1,A←((Ri)MOVA,#data;A←#data这组指令的功能是:把源操作数的内容送入累加器A。例如:MOVA,#10H,该指令执行时将立即数10H送入累加器A中。例:已知累加器A=30H,寄存器R0=30H,内部RAM20H=87H,内部RAM30H=65H,请指出执行以下每条指令后,累加器A内容的变化。(1)MOVA,#20H(2)MOVA,20H(3)MOVA,R0(4)MOVA,@R02.以Rn为目的操作数的指令MOVRn,A;Rn←(A),n=0~7MOVRn,direct;Rn←(direct)MOVRn,#data;Rn←#data例:已知A=30H,(30H)=40H,判断执行下列指令后,R2寄存器中的内容。(1)MOVR2,A(2)MOVR2,30H(3)MOVR2,#50H3.以直接地址为目的操作数的指令MOVdirect,A;direct←(A)MOVdirect,Rn;direct←(Rn),n=0~7MOVdirect,@Ri;direct←((Ri)),i=0,1MOVdirect1,direct2;direct1←(direct2)MOVdirect,#data;direct←#data例:设A=30H,R2=40H,R0=70H,(70H)=78H,(78H)=50H,判断执行下列各指令后结果。(1)MOVP1,A(2)MOV70H,R2(3)MOV20H,78H(4)MOV40H,@R0(5)MOV01H,#80H4.以寄存器间接地址为目的操作数指令MOV@Ri,A;((Ri))←(A),i=0,1MOV@Ri,direct;((Ri))←(direct)MOV@Ri,#data;((Ri))←#data例:书P38设A=50H,(40H)=32H,R0=20H,判执行下列指令后的结果。(1)MOV@R0,A(2)MOV@R0,40H(3)MOV@R0,#33H5.十六位数据传送MOVDPTR,#data16;DPTR←#data16DPTR----数据指针,为SFR中(DPH)、(DPL)MOVDPTR,#2010H相当于:MOVDPH,#20HMOVDPL,#10H例:设(20H)=60H,(60H)=50H,(50H)=20H,P1口的内容为B7H,执行下面的程序结果。MOVR0,#20HMOVA,@R0MOVR1,AMOVB,@R1MOV@R0,P16.查表指令MOVCA,@A+DPTRMOVCA,@A+PC;A((A)+(PC))指向下一条指令的地址。MOVCA,@A+DPTR;A←((A)+(DPTR))例:(DPTR)=0300H,(A)=02HROM中(0302H)=55H执行:MOVCA,@A+DPTR结果:(A)=55H7.A与片外RAM或I/O传送指令MOVXA,@DPTR;A←((DPTR))地址范围64KMOVXA,@Ri;A←((Ri))地址范围0~256MOVX@DPTR,A;(DPTR)←(A)MOVX@Ri,A;(Ri)←(A)8.堆栈操作指令堆栈操作有进栈和出栈操作,即压入和弹出数据,常用于保存或恢复现场,直接寻址。该类指令共有如下两条指令:(1)压栈PUSHdirect(SP)←(SP)+1((SP))←(direct)(2)出栈POPdirect(direct)←((SP))(SP)←(SP)-1例如:进入中断服务子程序时,把程序状态寄存器PSW、累加器A、数据指针DPTR进栈保护。设当前SP为60H。PUSHPSWPUSHACCPUSHDPLPUSHDPH执行后,SP内容修改为64H,而61H、62H、63H、64H单元中依次栈入PSW、A、DPL、DPH的内容。当中断服务程序结束之前,如下程序段(SP保持64H不变)POPDPHPOPDPLPOPACCPOPPSW执行之后,SP内容修改为60H,而64H、63H、62H、61H单元中的内容依次弹出到DPH、DPL、A、PSW中。SP设置初值时要充分考虑堆栈的深度,要留出适当的单元空间,满足堆栈的使用。9.交换指令(1)字节交换指令XCHA,Rn;(A)←→(Ri)XCHA,direct;(A)←→(direct)XCHA,@Ri;(A)←→(Ri)例:(A)=80H,(R7)=97H执行:XCHA,R7结果:(A)=97H,(R7)=80H(2)半字节交换指令XCHDA,@Ri;(A)0-3←→((Ri))0-3例:(R0)=60H,(60H)=3EH,(A)=59H执行:XCHDA,@R0结果:(A)=5EH(60H)=39H例:设(R0)=30H,(30H)=4AH,(A)=28H,则:执行XCHA,@R0;结果为:(A)=4AH,(30H)=28H执行XCHDA,@R0;结果为:(A)=2AH,(30H)=48H执行SWAPA;结果为:(A)=82H(3)A中半字节交换指令SWAPA;(A)0-3←→((A))4-7二、算术操作类指令1.加法指令(Addtion)2.带进位加法指令3.加1指令(Increase)4.十进制调整指令5.带借位减法指令(Subtraction)6.减1指令(Decrease)7.乘法指令(Multiplication)8.除法指令(Division)影响CY、AC、OV标志,加1和减1指令不影响标志1.加法指令ADDADDA,Rn;A←(A)+(Rn)ADDA,@Ri;A←(A)+((Ri))ADDA,direct;A←(A)+(direct)ADDA,#data;A←(A)+#data2.带进位加法指令(用在多于8位的二进制数的加法)ADDCA,Rn;A←(A)+(Rn)+(Cy)ADDCA,@Ri;A←(A)+((Ri))+(Cy)ADDCA,direct;A←(A)+(direct)+(Cy)ADDCA,#data;A←(A)+#data+(Cy)对标志位的影响与ADD相同,Cy是上一次进位标志,而不是这条相加指令产生的进位例1:书P443-16例2:双字节无符号数加法(R0R1)+(R2R3)→(R4R5)R0、R2、R4存放16位数的高字节,R1、R3、R5存放低字节。由于不存在16位数加法指令,所以只能先加低8位,后加高8位,而在加高8位时要连低8位相加时产生的进位一起相加。假设其和不超过16位,其编程如下:MOVA,R1;取被加数低字节ADDA,R3;低字节相加MOVR5,A;保存和低字节MOVA,R0;取高字节被加数ADDCA,R2;两高字节之和加低位进位MOVR4,A;保存和高字节3.加1指令INCA;A←(A)+1INCRn;Rn←(Rn)+1INCdirect;direct←(direct)+1INC@Ri;((Ri))←((Ri))+1INCDPTR;DPTR←(DPTR)+1对标志位不产生影响若:(A)=0FFH,(Cy)=0执行:INCA结果:(A)=00H,(Cy)=04.十进制调整指令(对压缩的BCD码调整)DAA若(A)3~09或(AC)=1,则(A)3~0←(A)3~0+06H若(A)7~49或(CY)=1,则(A)7~4←(A)7~4+06H十进制调整指令是一条对二—十进制的加法进行调整的指令。两个压缩BCD码按二进制相加,必须经过本条指令调整后才能得到正确的压缩BCD码和数,实现十进制的加法运算。由于指令要利用AC、CY等标志才能起到正确的调整作用,因此它必须跟在加法ADD、ADDC指令后面方可使用。5.带借位减法指令(Subtraction)(1)SUBBA,Rn;A←(A)-(R