《单片机学习第三章指令系统.PPT》由会员分享,可在线阅读,更多相关《单片机学习第三章指令系统.PPT(100页珍藏版)》请在三一办公上搜索。
1、第三章 80C51单片机指令系统,内容提要:,3-1 汇编语言与指令系统简介,3-2 数据传送类指令,3-3 算术运算类指令,3-4 逻辑运算类指令,3-5 控制转移类指令,3-6 位操作类指令,高级语言:,3.1 指令的格式及寻址方式,一、汇编语言程序设计的意义什么是程序?完成某项特定任务的指令的集合。计算机按程序一条一条地依次执行指令,从而完成指定任务。要让计算机完成各项任务,就应设计各种程序。,汇编语言:,机器语言:,程序设计语言:,用二进制代码表示指令和数据。,用助记符表示指令操作功能,用标号表示操作对象。,独立于机器,面向过程,接近自然语言和数学表达式.,汇编语言程序的每一条语句都与
2、计算机的某一条指令对应,所以必需熟悉指令系统。指令=操作码+操作数操作码表示了该指令所能执行的操作功能。操作数表示参加操作的数的本身或操作数所在的地址。二、MCS-51指令格式:,标号:,操作码助记符,操作数,;注释,标号是程序员根据编程需要给指令设定的符号地址,可有可无;标号由18个字符组成,第一个字符必须是英文字,不能是数字或其它符号;标号后必须用冒号。,操作码表示指令的操作种类,如MOV表示数据传送操作,ADD表示加法操作等。操作数或操作数地址表示参加运算的数据或数据的有效地址。操作数一般有以下几种形式:没有操作数项,操作数隐含在操作码中,如RET指令;只有一个操作数,如CPL A指令;
3、有两个操作数,如MOV A,#00H指令,操作数之间以逗号相隔;有三个操作数,如CJNE A,#00H,NEXT指令,操作数之间也以逗号相隔。注释是对指令的解释说明,用以提高程序的可读性;注释前必须加分号。,MCS-51系列单片机的指令系统简介111条指令,共分五大类:数据传送类;(29条)算术运算类;(24条)逻辑运算类;(24条)控制转移类;(17条)位操作类。(17条),指令中操作数的描述符号:Rn 工作寄存器R0 R7 Ri 间接寻址寄存器R0、R1 Direct 直接地址,包括内部128B RAM单元地址、26个SFR地址。#data 8位常数#data 16 16位常数 addr
4、16 16位目的地址 addr 11 11位目的地址 rel 8位带符号的偏移地址 DPTR 16位外部数据指针寄存器 bit 可直接位寻址的位,A 累加器 B 寄存器B C 进、借位标志位,或位累加器 间接寄存器或基址寄存器的前缀/指定位求反(x)x中的内容(x)x中的地址中的内容(间接寻址中的内容)当前指令存放的地址,三、寻址方式寻找操作数存放单元的地址的方式,共7种方式。1、立即数寻址所要找的操作数是一二进制数或十进制数,出现在指令中,用“#”作前缀 MOV A,#3AH2、寄存器寻址操作数存放在工作寄存器R0 R7中,或寄存器B中。MOV R1,A3、直接寻址指令中直接给出操作数的地址
5、。MOV A,3AH MOV 30H,DPH,图3.1 立即数寻址示意图,Mov A,#3AH,图3.2 寄存器寻址示意图,Mov R1,A,图3.3 直接寻址示意图,Mov A,3AH,MOV 3AH,#65H,MOV R0,#3AH,MOV A,R0,4、寄存器间接寻址指令中寄存器的内容作为操作数存放的地址,该地址里面的内容才是操作数,在工作上间接寻址寄存器前用“”表示前缀。例如:,5、变址寻址 操作数地址=变地址+基地址 基地址寄存器 DPTR 或 PC 变址寄存器 A 该寻址方式常用于访问程序存储器,查表。如 MOVC A,A+DPTR MOVC A,A+PC,图3.5 变址寻址示意图
6、,MOVC A,A+DPTR,6、相对寻址 把指令中给定的地址偏移量与本指令所在单元地址(PC内容)相加得到真正有效的操作数所存放的地址。例如“李同学20岁,张同学比李同学大3岁,问张同学多少岁?”这就是一个相对寻年龄的问题,而相对寻址与此类似。如 JC 60H;设(PC)=2000H为基址,相对偏移量为60H;则当C=1时,转移的目的地址=2000H+2+60H,7.位寻址 位寻址是指按位进行的寻址操作,而上述介绍的指令都是按字节进行的寻址操作。MCS-51单片机中,操作数不仅可以按字节为单位进行操作,也可以按位进行操作。当我们把某一位作为操作数时,这个操作数的地址称为位地址。位寻址区包括专
7、门安排在内部RAM中的两个区域:一是内部RAM的位寻址区,地址范围是20H2FH,共16个RAM单元,位地址为00H7FH;二是特殊功能寄存器SFR中有11个寄存器可以位寻址,参见有关章节中位地址定义。,图3.6 位寻址示意图,SETB 3DH,设内部RAM 27H单元的内容是00H,执行SETB 3DH后,由于3DH对应内部RAM 27H的第5位,因此该位变为1,也就是27H单元的内容变为20H。该指令的执行过程如图3.6所示。,3.2.1 数据传送类指令 数据传送指令是MCS-51单片机汇编语言程序设计中使用最频繁的指令,包括内部 RAM、寄存器、外部RAM以及程序存储器之间的数据传送。数
8、据传送操作是指把数据从源地址传送到目的地址,源地址内容不变。,数 据,目的地址 源地址,3-2 数据传送类指令,一、内部RAM与SFR数据传送类1、一般数据传送指令,回忆前述操作数描述符:A,direct,Rn,Ri,#data,DPTR等。经排列组合可写出下列指令:MOV A,Rn;(A)(Rn)以下类似。,MOV A,directMOV A,RiMOV A,#dataMOV Rn,AMOV Rn,directMOV Rn,#data,以累加器A为目标操作数的指令;,以寄存器Rn为目标操作数的指令;,MOV direct,RnMOV direct,directMOV direct,RiMOV
9、 direct,#dataMOV Ri,AMOV Ri,directMOV Ri,#dataMOV DPTR,#data16;唯一的16位数据传送指令。上述指令不影响任何标志位,但PSW的P位除外。,(direct),(A),MOV direct,A;,以Direct为目标操作数的指令;,以间接地址为目标操作数的指令;,上述指令不影响任何标志位,但PSW的P位除外。注意:MOV Rn,Rn MOV Ri,Ri MOV Rn,Ri MOV#data,A 等等指令是非法指令。,哇!好容易出错啊!,教材例题,【例3.9】若(R1)21H,(21H)55H,执行指令MOV A,R1后的结果为:(A)=
10、55H,而R1的内容和21H单元的内容均不变(keil软件上运行),【例3.12】若(R1)30H,(30H)22H,(A)34H,执行指令MOV R1,A后的结果为:(30H)34H,R1和A当中的内容不变。,课堂练习题,1、若(R1)=30H,(A)=40H,(30H)=60H,(40H)=08H,试分析执行下列程序段后上述各单元内容的变化。MOV A,R1MOV R1,40HMOV 40H,AMOV R1,#7FH,2、若(50H)=40H,问执行以下程序段后各个寄存器和内部RAM40H、41H、42H单元中的内容各为多少?ORG 00H MOV A,50HMOV R0,AMOV A,#
11、00HMOV R0,AMOV A,#3BHMOV 41H,AMOV 42H,41H,用keil进行调试时,起始地址为00h,二、累加器A与外部RAM数据传送MOVX A,RiMOVX A,DPTRMOVX Ri,AMOVX DPTR,A执行过程中会使/WR、/RD有效。,【例3.15】把外部数据存储器2040H单元的内容送入内部寄存器R2中。,MOV DPTR,#2040HMOVX A,DPTRMOV R2,A,例1:将内部RAM50H的内容传送到外部RAM40H中。解:MOV A,50H MOV R0,#40H MOVX R0,A,例2、试编写一程序段,实现将外RAM 0FAH单元中的内容传
12、送到外RAM 14FFH单元中。,解:MOV R0,#0FAH MOVX A,R0 MOV DPTR,#14FFH MOVX DPTR,A,三 查表指令(累加器A与ROM之间的数据传送)MOVC A,A+DPTRMOVC A,A+PC,【例3.16】设A=35H,执行1000H:MOVC A,A+PC指令后的结果:首先把累加器A中的内容加上本条指令执行后的PC值1001H,然后将程序存储器1036H单元的内容送入累加器A中,即,A(1036H)ROM。,【例3.19】把程序存储器0150H单元的内容取出送到外部RAM1070H单元中。MOV DPTR,#0150HMOV A,#00HMOVC
13、A,ADPTRMOV DPTR,#1070HMOVX DPTR,A,例3、设(A)=一个十进制常数(09),试用查表法获得其相应的ASCII码。,解法I:MOV DPTR,#1000H MOVC A,A+DPTR(1000H)TAB:DB 30H DB 31H DB 32H,33H,34H,35H,解法II:MOVC A,A+PC TAB:DB 30H,31H,32H,33H DB 34H,35H,36H,37H,四 字节交换指令XCH A,RnXCH A,direct;整字节交换XCH A,Ri低半字节交换XCHD A,Ri;SWAP A;半字节交换,注意:只能是累加器A中内容和其他源操作数
14、内容交换。不影响任何标志位。,【例3.20】若(A)7AH,(R1)45H,(45H)39H,执行指令XCH A,R1后的结果:(A)45H,(R1)7AH;若(A)7AH,(R1)45H(45H)39H执行指令XCH A,R1后的结果:(A)39H,(45H)7AH,(R1)45H,【例3.21】设A=59H,R0=45H,(45H)=7AH,执行指令XCHD A,R0结果:,A=5AH,R0=45H(不变),(45H)=79H,五 堆栈操作指令PUSH directPOP direct不影响任何标志位。,例5、设(SP)=36H,(DPTR)=0123H,分析:执行 PUSH DPL PU
15、SH DPH 后,各单元中的内容。,内RAM,36H,37H,38H,SP,加1,再加1,H,23H,01H,POP direct 指令执行中,机器也自动进行两步操作:(1)(direct)(SP)(2)(SP)(SP)1例6、设(SP)=4BH,(4BH)=01H,(4AH)=23H 执行 POP DPH POP DPL 后,各单元中的内容。,内RAM,49H,4AH,4BH,SP,H,23H,01H,SP减1,SP再减1,DPH,DPL,DPTR,结论:1)PUSH 与 POP 操作过程刚好相反;2)进、出栈规则:先进后出,后进先出。应注意指令书写先后顺序;3)可用于“保护现场,恢复现场”
16、。,【例3.23】设(30H)=51H,(40H)=6AH,将内部RAM的这两个单元的内容交换。PUSH 30H;30H单元的内容进栈PUSH 40H;40H单元的内容进栈POP 30H;将栈顶元素弹出,送入30H单元POP 40H;再将下一个元素出栈,送入40H单元执行结果:(30H)=6AH,(40H)=51H。,3.2.2 算术运算类指令,包括:加、减、乘、除;加一、减一。一、加法指令1、不带进位的加法:ADD A,Rn;(A)(A)+(Rn)ADD A,directADD A,RiADD A,#data;带符号数相加时:若OV=D7c或D6c=1,说明有溢出。无符号数相加时:若C=1,
17、说明有进位(其值 255)。,【例3.24】设A=46H,R1=5AH,试分析执行指令ADD A,R1;AA+R1,结果:A=A0H,R1=5AH(不变)。,2、带进位的加法:ADDC A,Rn;(A)(A)+(Rn)+(C)ADDC A,directADDC A,RiADDC A,#data 上述四条指令多用于多字节数相加。,【例3.25】设A=85H,(20H)=FFH,Cy=1,执行指令:ADDC A,20H;AA+(20H)+Cy,执行情况见图3-13所示。,结果:A=85H,(20H)=FFH(不变)。,3、加1指令:INC A;(A)(A)+1,以下类同。INC RnINC dir
18、ectINC RiINC DPTR,例2、设(R0)=7EH;(7EH)=40H,(7FH)0FFH 执行:INC R0;INC R0;INC R0;(R0)=7FH;(7FH)=00H;(7EH)=41H,DA A;二 十进制调整指令。执行过程中,CPU能根据加法运算后,累加器中的值和PSW中的AC及C标志位的状况自动选择一个修正值(00H、06H、60H、66H)与原运算结果相加,进行二十进制调整。,本条指令必须紧跟在ADD指令的后面才能完成指令功能。比如,刚才运算的是09H01H,计算机是按照16进制运算,答案是0AH,可是有时候我们需要得到10进制的结果,用这条DA A就能使结果变成1
19、0H。,二、减法指令1、带借位的减法:SUBB A,Rn;(A)(A)-(Rn)-(C)SUBB A,directSUBB A,RiSUBB A,#data,例3、(A)=0C9H,(R2)=54H,C=1,执行指令SUBB A,R2的结果 1100 1001-(R2)0101 0100-C 1 0111 0100,执行该指令后(A)=74H,AC=0,C=0,OV=1,P=0,注意:如果需要不带借位的减法之前先清零C。(CLR C),2、减1指令:DEC A;(A)(A)1,以下类同。DEC RnDEC RiDEC direct,例4、设(R0)=7FH,在内RAM中,(7EH)=00H,(
20、7FH)=40H 执行:DEC R0 DEC R0;DEC R0;结果为:(R0)=7EH,(7EH)=0FFH,(7FH)=3FH。,三、乘法和除法指令1、乘法:MUL AB;(A)(B)积的低8位在A中,积的高8位在B中;若乘积大于255,则OV=1,C总为0。2、除法:DIV AB;(A)(B),商在A中,余数在B中。若(B)=0,则结果不定,(OV)=1,(C)=0。,【例3.29】设A=32H(即50),B=60H(即96),执行指令MUL AB;BAAB 后的结果:乘积为12C0H(即4800)。A=C0H,B=12H。各标志位:Cy=0,OV=1,P=0。,【例3.30】设A=F
21、FH(255),B=12H(18),执行指令DIV AB;A BAB后的结果:商A=0EH(14),余数B=03H(3)。标志位:Cy=0,OV=0,P=1。,3.2.3 逻辑运算类指令,共分两大类:单字节逻辑操作,双字节逻辑操作,共24条。一、单字节逻辑操作指令CLR A;(A)0;MOV A,#00HCPL A;A中8位按位求反。,循环左移、右移指令:,RL ARLC ARR ARRC A注:左移一位相当于乘2;右移一位相当于除2。,二、双字节逻辑操作指令“与操作”:ANL A,Rn;(A)(A)(Rn),以下类同。ANL A,directANL A,RiANL A,#dataANL di
22、rect,AANL direct,#data,例1、(P1)=35H,使其高4位输出0,低4位不变。,解;ANL P1,#0FH 此做法称为“屏蔽”位。,“或操作”:ORL A,Rn;(A)(A)(Rn),以下类同。ORL A,directORL A,RiORL A,#dataORL direct,AORL direct,#data,例2、将A中的低3位送入P1中,并且保持P1中高5位不变。,ANL A,#07HANL P1,#0F8HORL P1,A;(P1)=P17P16P15P14P13A2A1A0这称为“数位组合”。,“异或操作”:XRL A,Rn;(A)(A)(Rn),以下类同。XR
23、L A,directXRL A,RiXRL A,#dataXRL direct,AXRL direct,#data,例3、设(P1)=0B4H=10110100B,执行:,XRL P1,#00110001B 10110100B:(P1)=10000101B=85H 这称为“指定位取反”。,在上述ANL、ORL、XRL操作中,用于端口操作时,无论P0 P3是第一,还是第二操作数,都遵循“读修改写”端口锁存器的操作。,3.2.4 控制转移类指令,非法,;转移有效,比较LJMP、AJMP、SJMP、JMP转移的起点和范围:,2K,LCALL addr16;长调用 ACALL addr11;短调用,L
24、CALL addr16;转移范围64KB,不影响标志位。执行中自动完成如下过程:(PC)(PC)+3(SP)(SP)+1(SP)(PC7 0),保护断点地址低字节;(SP)(SP)+2(SP)(PC15 8),保存断点地址高字节;(PC)addr16,目的地址送PC,转子程序。,二、调用指令,执行结果:(SP)=09H,(09H)=21H,(08H)=03H,(PC)=3456H,转移范围与(PC)+2在同一个2KB内。不影响任何标志位,执行中机器自动完成下列过程:(PC)(PC)+2(SP)(SP)+1(SP)(PC7 0)(SP)(SP)+2(SP)(PC15 8)(PC10 0)addr
25、10 0,ACALL addr11:,三、返回指令从子程序返回主程序。RET;调用子程序返回;RETI;中断子程序返回。,(PC15 8)(SP)(SP)1(PC7 0)(SP)(SP)(SP)2,其机器自动操作过程如下:,比较两种返回指令含义上的异同点结论:RET返回地址事先已知,而RETI的返回地址在程序执行中产生的,不固定。不影响标志位,但PSW不能恢复到中断前的状态。,(SP),空操作指令NOP;空操作不执行任何操作,仅仅使(PC)+1,继续执行下条指令,不影响标志位,在ROM中占一个字节,用于延时调整。,二、条件转移指令实现按照一定条件决定转移的方向,分三类:累加器A判零转移指令 比
26、较不相等转移指令 减一不为零转移指令,JZ rel:若(A)=0,则转移,否则顺序执行。JNZ rel:若(A)0,则转移,否则顺序执行。转移目的地址=(PC)+2+rel 不影响任何标志位。,1、判零转移 JZ rel JNZ rel,例1、将外RAM的一个数据块(首地址为DATA1)传送到内部数据RAM(首地址为DATA2),遇到传送的数据为零时停止传送,试编程。,解:MOV R0,#DATA2 MOV DPTR,#DATA1 LOOP1:MOVX A,DPTR JZ LOOP2 MOV R0,A INC R0 INC DPTR SJMP LOOP1 LOOP2:SJMP LOOP2,2、
27、比较转移指令功能:比较二个字节中的值,若不等,则转移。CJNE A,direct,relCJNE A,#data,relCJNE Ri,#data,relCJNE Rn,#data,rel,该类指令具有比较和判断双重功能,比较的本质是做减法运算,用第一操作数内容减去第二操作数内容,但差值不回存。转移目的地址=(PC)+3+rel若第一操作数内容小于第二操作数内容,则(C)=1,否则(C)=0。,3、循环转移指令DJNZ Rn,rel;(二字节指令)DJNZ direct,rel;(三字节指令)本指令也为双功能指令,即减1操作和判断转移操作。第一操作数内容减1后,若差值不为零,则转移;否则顺序执
28、行。转移目的地址=(PC)+2或3+rel,例3、将8031内部RAM的40H 4FH单元置初值#A0H#AFH。,解:MOV R0,#40H MOV R2,#10H MOV A,#0A0H LOOP:MOV R0,A INC R0 INC A DJNZ R2,LOOP,3.2.5 位操作类指令,包括:位传送指令、条件转移指令、位运算指令。位操作由单片机内布尔处理器来完成。位地址的四种表示:1)使用直接位地址表示;如20H、30H、33H等;2)使用位寄存器名来表示;如C、OV、F0等;3)用字节寄存器名后加位数来表示;如PSW.4、P0.5ACC.3等;4)字节地址加位数来表示;如20.0、
29、30.4、50.7等。,一、位传送指令MOV C,bit;(C)(bit)MOV bit,C;(bit)(C),二、位状态控制指令CLR bit;(bit)0SETB bit;(bit)1 CPL bit;(bit)(/bit)CLR C;(C)0SETB C;(C)1 CPL C;(C)(/C),例1、编程通过P1.0线连续输出256个宽度为5个机器周期长的方波。,解:MOV R0,#00H CLR P1.0 LOOP:CPL P1.0 NOP NOP DJNZ R0,LOOP,ANL C,bit;(C)(C)(bit)ANL C,/bit;(C)(C)(/bit),ORL C,bit;(C
30、)(C)(bit)ORL C,/bit;(C)(C)(/bit),三、位逻辑操作指令,例2、用软件实现下图所示的P1.0 P1.3间的逻辑运算。,解:MOV C,P1.1 ORL C,P1.2 ANL C,P1.0 MOV P1.3,C,P1.1,P1.2,P1.0,P1.3,四、布尔条件转移指令有5条,分别对C和直接位地址进行测试,并根据其状态执行转移。1、判布尔累加器转移JC rel;(C)=1,转移,否则顺序执行。JNC rel;(C)=0,转移,否则顺序执行。不影响标志。转移地址:(PC)(PC)+2+rel,解:MOV A,30H CJNE A,40H,LOOP SETB 7FH S
31、JMP$LOOP1:JC LOOP2 MOV 20H,A MOV 21H,40H SJMP$LOOP2:MOV 20H,40H MOV 21H,A SJMP$,例3、比较内部RAM的30H和40H单元中的二个无符号数的大小,将大数存入20H单元,小数存入21H单元,若二数相等,则使内RAM的第127位置1。,2、判位变量转移JB bit,rel;(bit)=1,则转移,否则顺序执行。JBC bit,rel;(bit)=1,则转移,否则顺序执行,;且无论(bit)是否等于1,均使该位清零。JNB bit,rel;(bit)=0,则转移,否则顺序执行。;不影响标志。,例4、试判断A中的正负,若为正数,存入20H单元;若为负数则存入21H单元。,解:JB ACC.7,LOOP MOV 20H,A SJMP$LOOP:MOV 21H,A SJMP$,