1第3章MCS-51单片机的指令系统本章内容MCS-51单片机指令系统的格式MCS-51单片机寻址方式指令系统的分析本章采用简单例程讲解解汇编语言指令功能23.1指令格式指令:即命令,人们给计算机的命令指令有两种表示方式:机器码——机器语言(机器能直接识别)助记符——汇编语言(供设计人员使用)机器码和助记符一一对应,汇编语言可汇编为机器语言,机器语言可反汇编为汇编语言。指令格式:汇编语言格式[标号:]操作码助记符[操作数];[注释]3START:MOVA,#20H;把数20H送入累加器A中INCA;(A)加一3.1指令格式汇编语言指令的几种形式:(1)没有操作数:RET,RETI,NOP(2)有1个操作数:INCA,DEC20H,CLRC,SJMPNEXT(3)有2个操作数:MOVR7,#DATA,ADDA,R0,DJNZR2,LOOP(4)有3个操作数:CJNEA,#20H,NEQ43.1指令格式机器语言的几种形式:(1)单字节指令:INCDPTR指令机器代码:A3ADDA,R7指令机器代码:2F(2)双字节指令:SUBBA,2BH指令机器代码:952BORLC,/27H指令机器代码:A027(3)三字节指令:MOV20H,#00H指令机器代码:752000LJMP2000H指令机器代码:02200053.2MCS-51单片机的寻址方式寻址方式:CPU执行指令时获取操作数的方式MCS-51单片机有7种不同的寻址方式:(1)立即寻址方式(2)直接寻址方式(3)寄存器寻址方式(4)寄存器间接寻址方式(5)变址寻址方式(6)位寻址方式(7)相对寻址方式63.2MCS-51单片机的寻址方式(1)立即寻址方式在指令中直接给出了参与运算的操作数。MOVA,#20H(2)直接寻址方式指令中给出了参与运算的操作数所在单元的地址或所在位的位地址MOVA,20HMOV27H.1,C直接寻址方式的使用范围:1)单元地址:00~7FH、21个SFR2)对SFR的访问只能采用直接寻址方式73.2MCS-51单片机的寻址方式(3)寄存器寻址方式指令指出了参与运算的操作数所在的寄存器。MOVA,R0寄存器寻址方式中的寄存器:1)工作(通用)寄存器R0~R7、DPTR2)累加器A、寄存器B(仅在乘除法时)和布尔累加器C8(4)寄存器间接寻址方式在指令中,指出了存放参与运算的操作数所在单元地址的寄存器。MOVA,@R03.2MCS-51单片机的寻址方式地址寄存器CPU?!!操作数在哪儿?它的地址在R0中RAM得到地址了!找数!AROMMOVA,@R093.2MCS-51单片机的寻址方式可以作为地址寄存器的寄存器:把存放操作数地址的寄存器称为地址寄存器。地址寄存器可以是:R0、R1、DPTR、SP(隐含)。在指令中表示为@R0、@R1、@DPTR寄存器间接寻址方式寻址范围:1)片内RAM:00~7FH地址寄存器:@R0、@R12)片外RAM:0000~FFFFH地址寄存器:@R0、@R1、@DPTR10(5)变址寻址方式(基址寄存器+变址寄存器间接寻址)操作数的地址由基址寄存器+变址寄存器间接寻址指出。1)MCS-51单片机中可以作基址寄存器:2个十六位寄存器,DPTR和PC2)MCS-51单片机中变址寄存器:8位寄存器:累加器A3)操作数存放在一个由[(PC)+(A)]或[(DPTR)+(A)]指出的十六位地址所指的单元中(在ROM中),有以下3种指令:MOVCA,@A+PCMOVCA,@A+DPTRJMP@A+DPTR3.2MCS-51单片机的寻址方式11(6)位寻址方式在指令中,指出了参与运算的操作数(一位)所在的位地址或寄存器(仅有位累加器C)指令中位地址:1)20~2FH的16个单元的128位;00~7FH2)专用寄存器(SFR)中的某些寄存器中的位(80~FFH)CLRCMOV00H,CMOV20H.0,C3.2MCS-51单片机的寻址方式12(7)相对寻址方式与程序的执行顺序有关,在指令执行时改变了程序计数器PC的内容,从而改变了程序转移的目标地址。当前的PC值加上指令中给出的地址偏移量rel而形成的目的(标)地址。相对寻址只出现在相对转移指令中。目的地址=源地址+rel+指令的字节数rel=目的地址—源地址—指令的字节数rel:指令中给出的地址偏移量。-128~+127,用补码表示,大于0正向跳转(向后),小于0则反向跳转(向前)。JCrelSJMPNEXT1JZFIRSTDJNZR1,LOOP23.2MCS-51单片机的寻址方式133.3指令系统分析MCS-51单片机共有111条指令(1)按指令代码的字节数单字节指令(49条)双字节指令(45条)三字节指令(17条)(2)按指令执行的时间单机器周期指令(64条)双机器周期指令(45条)四机器周期指令(2条)3.3.1指令的分类143.3.1指令的分类(3)按照指令功能可分成五类:数据传送类指令(29条)算术运算类指令(24条)逻辑运算类指令(24条)控制转移类指令(17条)位操作类指令(17条)153.3.2指令系统分析一、数据传送类指令数据传送(DataTransfers)类指令共有29条,分为以下5种类型:(1)通用传送指令(2)堆栈操作指令(3)交换指令(4)访问程序存储器的指令(5)访问外部RAM的指令163.3.2指令系统分析(一)通用传送指令通用传送指令的一般形式为:MOV目的操作数,源操作数(1)以A为目的操作数的传送指令(4条)MOVA,源操作数MOVA,Rn;(Rn)(A),n=0~7MOVA,direct;(direct)(A)MOVA,@Ri;[(Ri)](A),i=0,1MOVA,#data;data(A)MOVA,R2MOVA,30HMOVA,@R0MOVA,#36H173.3.2指令系统分析(2)以Rn为目的操作数的传送指令(3条)一般形式:MOVRn,源操作数MOVRn,A;(A)(Rn)MOVRn,direct;(direct)(Rn)MOVRn,#data;data(Rn)如:MOVR0,AMOVR3,30HMOVR7,#36HMOVR1,#30MOVR6,#01101100B18(3)以直接地址为目的操作数的指令(5条)一般形式:MOVdirect,源操作数MOVdirect,A;(A)(direct)MOVdirect,Rn;(Rn)(direct)MOVdirect1,direct2;(direct2)(direct1)MOVdirect,@Ri;[(Ri)](direct)MOVdirect,#data;data(direct)如:MOV30H,AMOVP1,R2MOV38H,60HMOVTL0,@R1MOV58H,#36H3.3.2指令系统分析193.3.2指令系统分析(4)以间接地址为目的操作数的指令(3条)一般形式:MOV@Ri,源操作数MOV@Ri,A;(A)[(Ri)]MOV@Ri,direct;(direct)[(Ri)]MOV@Ri,#data;data[(Ri)]如:MOV@R0,AMOV@R1,36HMOV@R0,SBUFMOV@R1,#48MOV@R0,#0D6H203.3.2指令系统分析例1:已知(PSW)=00H,(A)=11H,(20H)=22H,分析下列程序的执行结果MOVR0,A(A)(R0)MOVR1,20H(20H)(R1)MOVR2,#33H33H(R2)分析结果如下:(R0)=(00H)=11H(R1)=(01H)=22H(R2)=(02H)=33H213.3.2指令系统分析例2:已知(PSW)=00H,(A)=11H,(00H)=22H,(01H)=36H,(36H)=33H,(33H)=44H,分析下列程序的执行结果。MOV30H,A;(A)(30H)MOV31H,R0;(R0)(31H)MOV32H,33H;(33H)(32H)MOV34H,@R1;[(R1)](34H)MOV35H,#55H(35H)=55H分析结果如下:(30H)=11H,(31H)=22H,(32H)=44H,(34H)=33H,(35H)=55H。223.3.2指令系统分析(5)十六位数据传送指令(1条)MOVDPTR,#data16;data8~15(DPH),data0~7(DPL)如:MOVDPTR,#2368HMOVDPTR,#35326上述操作同:MOVDPH,#23HMOVDPL,#68H233.3.2指令系统分析在使用通用数据传送指令时,应注意以下几点:(1)MCS-51单片机不支持工作寄存器R0~R7内容直接传送给由地址寄存器内容指定的单元,或由地址寄存器内容指定单元的内容送给工作寄存器R0~R7,如果需要传送,如果在程序中需要这样的数据传送,可以采用其他方式间接实现。例如:希望把地址寄存器R1内容指定的单元内容传送给工作寄存器R5,可以采用MOVA,@R1MOVR5,A243.3.2指令系统分析(2)在通用数据传送指令中,地址寄存器只能由工作寄存器R0和R1担当,其他工作寄存器没有这个功能。(3)虽然MCS-51单片机由2个16位的寄存器:PC和DPTR,但只有DPTR用户可以用指令方式直接设置其内容。MOVDPTR,#5678H253.3.2指令系统分析(二)堆栈操作指令堆栈是在内部RAM中开辟的一个先进后出(后进先出)的区域,用来保护CPU执行程序的现场1.入栈指令PUSHdirect;CPU操作:(SP)+1(SP),修改堆栈指针;(direct)[(SP)],入栈:例如:MOVSP,#70HPUSH60H6061707172A869FEC6CA片内RAM(SP)(SP)A8263.3.2指令系统分析2.出栈指令POPdirectCPU操作:[(SP)](direct),出栈,把堆栈中由(SP)所指单元的内容传送到指定单元direct。(SP)-1(SP),修改堆栈指针例如:MOVSP,#71HPOP60H6061707172A869FEC6CA片内RAM(SP)(SP)C6273.3.2指令系统分析在使用堆栈时,应注意以下几点:(1)PUSH和POP指令的操作数必须是单元地址。PUSH指令中指定的单元地址是被保护单元的地址(源操作数),指令隐含了目的操作数;而POP指令中指定的单元地址是内容要恢复的单元地址(目的操作数),指令隐含了源操作数。(2)MCS-51单片机的堆栈建在内部RAM中,单片机复位后,(SP)=07H,从08H单元开始的区域均为栈区。在应用系统中,一般把栈区开辟在内部RAM的30~7FH这一区域,栈区最好靠近内部RAM的末端,以避免堆栈加1向上增长时覆盖有效数据。283.3.2指令系统分析(3)在使用堆栈操作指令时,入栈指令PUSH和出栈指令POP应成对出现,保护指定单元内容时,必须遵循先进后出的步骤,否则,单元内容在出栈恢复时会发生改变。(4)MCS-51单片机不支持对工作寄存器R0~R7直接使用堆栈操作指令。如果要用堆栈操作保护某一寄存器Rn(n=0~7)的状态,可用该工作寄存器对应单元进行操作。如当(PSW.4)=1、(PSW.3)=0时,把R5的内容入栈,可用PUSH15H;出栈时,PUSH15H,即可恢复R5原来的内容。293.3.2指令系统分析例:已知(30H)=11H,(31H)=22H,则下列程序段的操作过程为:MOVSP,#60H;开辟栈区PUSH30H;(SP)+1(SP),30H单元内容进栈61H单元PUSH31H;(SP)+1(SP),31H单元内容进栈62H单元,(SP)=62HPOPACC;[(SP)](ACC),栈顶62H单元内容弹出到累加器ACC,(SP)-1(SP),(SP)=61H。POPB;[(SP)](B),栈顶61H单元内容弹出寄存器B,(SP)-1(SP),(SP)=60H。30(三)交换指令(1)字节交换指令将源操作数的内容与A累加器的内容互换。XCHA,源源—