MCS-51单片机指令系统及程序设计_第1页
MCS-51单片机指令系统及程序设计_第2页
MCS-51单片机指令系统及程序设计_第3页
MCS-51单片机指令系统及程序设计_第4页
MCS-51单片机指令系统及程序设计_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第10章 MCS-51单片机指令系统 及程序设计,内容安排,一. MCS-51指令寻址方式 二. MCS-51单片机指令系统 三. 汇编语言及程序设计,10.1 MCS-51指令寻址方式,指令:是计算机用于控制某个功能部件完成某一指定动作的指示和命令 指令系统:所有指令的集合,操作数的形式:,指令中直接携带着参加操作的数据,该类数据前面加“#”号,表示立即数。例如,#35H、#25、#1001B等 寄存器中存放着操作数,指令中给出被访问寄存器的名字,如寄存器A和寄存器B 操作数在内部RAM的某个单元中存放着 操作数在外部RAM的某个单元中存放着 寄存器中存放着操作数的地址,能做该类操作数形式的

2、寄存器只能是各工作区中的R0和R1,以及DPTR,该类寄存器前应加“”符号 操作数在外设中存放着 操作数在四个接口的锁存器中存放着,寻址方式:指CPU寻找操作数或操作数地址的方法,1. 立即寻址,操作数直接由指令给出,通常紧跟指令操作码之后的字节是操作数,该操作数被称为立即数 立即数:8/16位二进制数,如:MOV A,#7AH MOV DPTR, #1234H,注意: 立即数前加“#”号,以区别直接地址 如:MOV A,#30H; (A)30H MOV A, 30H; (A)(30H) 立即寻址方式的指令是双字节的(第1个字节 为操作码,第2个字节是操作数) 操作数是放在ROM内的常数,2.

3、 直接寻址指令中直接给出操作数所在的单元地址或位地址,直接寻址可访问的存储空间:,(1)内部RAM低128个单元 在指令中直接以单元地址形式给出,地址范围00H7FH (2)特殊功能寄存器SFR 直接寻址是SFR惟一的寻址方式,SFR可以用单元地址给出,也可用寄存器符号形式给出(但A、AB、DPTR除外) (3)211个位地址空间 内部RAM中可位寻址的20H2FH单元对应的128个位地址空间 11个SFR中83个可用的位地址空间,注意:, 适当选择SFR。寻址SFR时,可以用直接地址,也可以用寄存器名,但后者更容易理解和阅读 如: MOV A,0D0H; (A)(D0H) MOV A,PSW

4、; (A)(PSW), 适当选择累加器的表达式, 寄存器寻址, 注意地址的区别(位地址与字节地址) 如: MOV A,30H; (A)(30H) 字节操作 MOV C,30H;(C)(30H) 位操作,操作数在寄存器中,3. 寄存器寻址,可用寄存器有: (1)四组工作寄存器R0R7共32个工作寄存器,由PSW中的RS1、RS2两位状态来选择当前寄存器组 (2)SFR中有A、AB、DPTR及CY 如:MOV R3,#12H MOV A,R3 ; (A)(R3),注:寄存器B只有在执行乘除法指令时,才是寄存器寻址方式 如:MUL AB ;B寄存器寻址 MOV A,B ;B直接寻址,4. 寄存器间接

5、寻址,指令给出的寄存器中存放的不是操作数本身,而是操作数的单元地址,用来存放所寻操作数地址的寄存器称为指针 (1)用于间接寻址的寄存器有:R0、R1、 DPTR及SP (2)寄存器间接寻址也需要以寄存器符号的形式表示,但需在寄存器名前加“”,以区别寄存器寻址方式 如: MOV A,R1 (3)寄存器间接寻址可寻址范围如下: 内部RAM低128单元,地址范围00H7FH,用R0、R1和SP作为间接寄存器(堆栈 SP),与P2口配合使用,用Ri指示低8位地址,可寻址片外RAM或I/O口的64KB区域 如:MOVR1,#18H MOVP2,#20H MOVX A,R1;将片外RAM单元(2018)(

6、A ) DPTR间接寻址寄存器,可寻址片外ROM或片外RAM及I/O口的各自64kB 如: MOV DPTR,#2018H MOVX A, DPTR ;将片外RAM单元(2018)(A),注意: 寄存器间接寻址,拓宽单片机寻址范围 寄存器间接寻址方式不能用于对SFR寻址 如: MOV R0,#0F0H MOV A, R0,B地址,5. 基址加变址寄存器间接寻址,方式:以DPTR或PC作为基址寄存器,以A作为变址寄存器,并以两者内容相加形成新的16位地址作为操作数地址,寻找该地址,读取数据 功能:用于读出ROM中的数据到累加器A中,如:MOV A,#50H;机器码7450H MOVC A,A+P

7、C;机器码83H, 变址寻址指令有:(单字节两周期指令),PC值变, A中的数是无符号数,范围00HFFH,注意: 变址寻址方式只能对ROM(包括片外、片内)寻址,因此只能用于读取数据,而不能用于存放数据,主要用于查表性质的访问,6. 相对寻址,如: JC rel 假设:rel = 85H,CY=1 85H是负数,其16位二进制补码 FF85H,常用符号表示,用于访问ROM,只出现在转移指令中 “寻址”不是寻找操作数的地址,而是要得到程序跳转地址PC值 以PC的当前值加上指令中给出的相对偏移量(rel)形成转移地址 相对偏移量(rel)是一个带符号的8位二进制数,以补码形式出现,因此程序的转移

8、范围是以PC当前值为中心 -128 +127字节之间,7. 位寻址,MCS-51设有独立的位处理器,又称为布尔处理器,可对位地址空间的211个位地址进行运算和传送操作,(1) 位寻址范围 片内RAM低128字节中的位寻址区,单元地址为20H2FH,共16个单元的128位,位地址为00H7FH. 片内RAM高128字节中的11个字节地址能被8整除的特殊功能寄存器,实有位地址83位,(2)位地址位在指令中的4种表达方式 以PSW中AC位进行操作为例,直接使用位地址形式 MOV C,0D6H ;(0D6H)(C),D6H是PSW的第6位 单元地址加位序号的表示形式 MOV C,0D0H.6;(0D0

9、H.6)(C), D0H.6是PSW的第6位 位的符号地址(位名称)的形式 MOV C,AC;(AC)(C), P是PSW的第6位 注:对于部分特殊功能寄存器,其各个位均有一个特定的名字,所以可以用它们的位名称来访问该位 专用寄存器符号加位序号的形式 MOV C,PSW.6 ; (PSW.6)(C),PSW.6表示PSW的第6位,总结:, 寻址方式针对的对象是源操作数和目的操作数,对于MCS-51: 源操作数寻址方式:立即、直接、寄存器、间接、变址、位寻址 目的操作数寻址方式:直接、寄存器、间接、位寻址 MCS-51单片机编址方式特点:一是内部RAM与内部I/O端口统一编址;二是外部RAM与外

10、部I/O端口也是统一编址,这说明对I/O口的操作与同RAM操作一样,即对内部RAM的直接寻址方式的一切操作,内部I/O口同样适用。对于ROM来说,与RAM严格分开,操作不同,20H2FH,1. 数据传送类指令:29条,用途:主要用于数据的保存及交换等场合 操作:是把源操作数传送到目的操作数,指令执行完成后,源操作数不变,目的操作数等于源操作数 标志位影响:不影响任何标志位,但目标地址为A时,只会对奇偶标志P有影响,10.2 MCS-51指令系统,(1)内部数据传送指令(MOV),格式:MOV 目的操作数,源操作数 功能:把源操作数指定的字节变量复制到目的操作数所规定的单元或寄存器中,源字节不变

11、,注意:该指令的源操作数和目的操作数都在单片机内部(可以是片内RAM地址,也可以是SFR地址),源操作数也可以是立即数, 立即数传送指令(5条) 源操作数是立即数 功能:是把立即数送到指定单元或寄存器,8位立即数传送指令(4条) MOV A, #data ;data(A) MOV Rn,#data ;data(Rn) MOV Ri, #data ;data(Ri) MOV direct,#data ;data(direct),3个字节,例10-1:已知(R0)=30H,问8051执行如下指令后,累加器A、R4、30H和31H单元中的内容是什么? MOV A , #10H MOV R4, #36

12、H MOV R0, #7AH MOV 31H , #01H,解:8051执行上述指令后的结果为: (A)=10H,(R4)=36H,(30H)=7AH,(31H)=01H,16位立即数传送指令(1条) MOV DPTR,#data16 ;data16 (DPTR ),3个字节,如:MOV DPTR,#2009H MOVX A, DPTR,功能:是将立即数的高8位送到DPH,立即数的低8位送到DPL,注意:惟一的一条16位数传送指令;16位立即数一般看作片外RAM/ROM的地址,是专门配合外部数据传送指令使用, 内部RAM(Rn、片内RAM、SFR)与累加器A之间数据传送(6条),MOV A,R

13、n ;(Rn)(A) MOV Rn,A ;(A)(Rn) MOV A,Ri ;(Ri)(A) MOV Ri,A ;(A)(Ri) MOV A,direct ;(direct)(A) MOV direct,A ;(A)(direct),注意:Ri是寄存器间接寻址Direct是8位直接地址(片内RAM低128个单元及SFR地址),属于直接寻址方式,例10-2:读下面程序,写出41H、42H单元内容 MOV R0, #40H MOV R1, #41H MOV A, #11H MOV 40H, #32H MOV R1, A MOV 42H , R0,解:(41H)=11H, (42H)=32H, 内部

14、RAM中Rn、 SFR与片内RAM之间数据传送(5条),MOV direct,Rn ;(Rn)(direct) MOV Rn,direct ;(direct)(Rn) MOV direct,Ri ;(Ri)(direct) MOV Ri,direct ;(direct) (Ri) MOV direct2,direct1 ;(direct1)(direct2),3个字节,如:MOV P2,P1 MOV P1,R1,总结:,内部传送指令MOV相互关系见下图,每条指令格式和功能由厂家规定,用户只能按规定使用,不得任意制造指令,如:MOV R7, R1 MOV R6,R3,要清楚每种寻址方式的寻址范围

15、 如:MOV R0,#90H MOV A,R0,因为90H是P1口的物理地址,而P1为SFR,只能直接寻址,如:MOV 20H,0A1H,0A1H在内部RAM中无意义,以累加器A为目的寄存器的传送指令会影响PSW中的奇偶标志位,其余传送指令对所有标志位均无影响,(2)外部数据传送指令(MOVX):4条,功能:实现外部RAM(或I/O接口)和累加器A之间的数据传送, 用DPTR进行间接寻址的指令,DPTR为16位数据指针,该指令可访问外部RAM的64KB字节区,地址范围是0000HFFFFH ,地址低8位由P0口输出,地址高8位由P2口输出,数据通过P0口读入/写出, 用Ri进行间接寻址的指令,

16、MOVX A,Ri ;(Ri)(A) MOVX Ri,A ;(A) (Ri),如:MOVP2,#20H MOVR0,#0FEH INCR0 MOVXA,R0,MOVDPTR,#20FEH INCDPTR MOVXA,DPTR,寻址范围: 若外部RAM地址范围0000H00FFH,可用Ri间接寻址进行数据传送,8位地址足够使用 若外部RAM地址(0100HFFFFH)单元数据传送,须用P2口输出高8位地址,用Ri表示低8位地址,P0口分时作低8位地址线和数据线,P2口应事先预置,例10-3:将内部50H单元中的数X送到外部2500H单元中,再送入内部40H单元,最后通过间接寻址的方式再送入内部3

17、0H单元中,程序: MOV A,50H ;(50H)(A) MOV DPTR,#2500H ;#2500H(DPTR)建立外部数据存储器指针 MOVX DPTR,A ;(A)(2500H) ;把A中的数送到了外部2500H单元中 MOVX A,DPTR ;(DPTR)(A)把DPTR所指向的外部 ;2500H单元中的数送到累加器A中 MOV 40H,A ;(A)(40H)通过累加器A把X送到内部 ; 40H单元中 MOV R0,#30H ;#30H(R0),R0做内部RAM的数据指针 MOV R0,40H ;(40H)(R0)把内部40H中的数通过 ;间接寻址方式送入R0指针所指向的30H单元

18、中,(3)ROM与累加器A传送数据指令(MOVC):2条,MOVC A, A+DPTR ; (A)+(DPTR)(A) MOVC A, A+PC ;(PC)+1(PC),( (A)+(PC)(A),功能:是把累加器A作为变址寄存器,DPTR、PC作为基址寄存器,二者内容相加得到ROM某单元地址,再把该地址单元内容送到A中,指令执行后,不改变基址寄存器(DPTR、PC)内容。主要用于查表,即完成从ROM中读取数据的功能,注意: 这两条指令使用基址寄存器不同,相应地适用范围也不同, 第一条指令以DPTR为基址寄存器,查表时用于存放表格的起始地址,通过指令MOV DPTR,#data16,对其赋值,

19、因此该指令适用范围较广,表格常数可以设置为64KBROM中的任何位置 第二条指令以PC作为基址寄存器,由于A中为8位无符号数,使该指令查表范围以PC当前值开始向后256个地址范围 查表时PC的当前值不一定恰好是表的起始地址,因此常常需要在这条指令前安排一条加法指令,以便把PC中当前值修正为表的起始地址 A的值包含两部分:对表的始址的偏移量和修正量,此修正量是查表指令的下一条指令到表首地址的距离,即修正量=表首地址-PC当前值,用户不能修改PC值,例10-4:已知累加器 A中有一个09范围内的数,用以上查表指令编出能查出09的平方值的程序。设平方表首地址为2000H,方法二:采用PC作为基址寄存

20、器,程序: 1FF9H MOV A,#data 1FFBH ADD A,#02H 1FFDH MOVC A,A+PC 1FFEH SJMP $,2000H DB 0 2001H DB 1 2002H DB 4 2009H DB 81 END,方法一:采用DPTR作为基址寄存器,程序: MOV DPTR,#2000H MOVC A,A+DPTR,(4)堆栈操作指令(PUSH 、POP):2条,功能:分别用于保护现场和恢复现场 进栈指令PUSH用于保护片内某个单元内容 出栈指令POP用于恢复片内某个单元内容,PUSH direct ;(SP)+1(SP),(direct)(SP) POP dire

21、ct ;(SP)(direct),(SP)-1(SP),特点: 堆栈中的数据是“后进先出”方式,由堆栈指针SP自动跟踪栈顶地址 MCS-51 单片机堆栈编址采用向上生长方式,即栈底占用较低地址,栈顶占用较高地址 堆栈操作指令,均为直接地址寻址方式,例10-5:设(30H)=X,(40H)=Y,试利用堆栈区域实现30H和40H单元中的数据交换,注意:使用栈操作指令时,应注意指令操作码后紧跟直接地址,要注意书写格式,PUSH A POP A PUSH R0 POP R0,MOV SP,#60H;设栈底的地址为60H PUSH 40H; Y (61H) PUSH 30H; X (62H) POP 4

22、0H; X (40H) POP 30H; Y(30H),(5)数据交换指令:5条,整字节交换指令(XCH) XCH A, Rn ;(A)(Rn) XCH A,Ri ;(A)(Ri) XCH A,direct ;(A)(direct ),2个字节,功能:将累加器A的内容与内部RAM、SFR中的内容互换,影响标志位,低半字节交换指令(XCHD) XCHD A,Ri ;(A)30 (Ri)30 功能:累加器A的低四位与片内RAM某单元的低四位交换,高四位不变,例10-6:利用数据交换指令,将60H中的低四位BCD码转换成ASC码,并将结果存到外部2500H中,注意:数据传送类指令在程序设计中使用频率

23、最高的一类指令;一般优先选用字节少的指令,提高软件抗干扰能力,MOV R0, #60H ; #60H(R0) MOV A , #30H ; #30H(A) XCHD A , R0 ;(A )30 (R0) 30 MOV DPTR , #2500H ; #2500H(DPTR) MOVX DPTR , A ; (A)(DPTR),2. 算术运算类指令:24条,功能:执行加、减、乘、除法四则运算和加1、减1操作以及十进制的调整 特点: 支持8位无符号数操作,借助溢出标志可对带符号数进行补码运算 算术运算类指令执行结果影响PSW,(1)加法指令:8条, 不带进位的加法指令(4) ADD A,#dat

24、a ;(A)+data(A) ADD A,direct ;(A)+ (direct)(A) ADD A,Rn ;(A)+(Rn)(A) ADD A,Ri ;(A)+(Ri)(A),功能:把源地址所指示的操作数和累加器A中操作数相加,并把两数之和保留在累加器A中,使用时应注意的问题: 参加运算的两个操作数和操作结果都必须是8位二进制数,其中一个操作数必须在A中,且运算结果也在A中,对PSW中所有标志位产生影响 参加运算的两个二进制数可被“看作”无符号数(0255),也可以被“看作”有符号数的补码(-128+127)。计算结果为补码形式 无符号数运算时,判断运算结果是否超出范围(0255),看CY

25、,若CY=1,表示运算结果255,若CY=0,表示运算结果255;带符号数运算时,判断运算结果是否超出范围(-128+127) ,看OV,若OV=C8C7=1 ,表示运算结果溢出,若OV=0,表示运算结果有意义,例10-7:编程求9AH+75H,并分析对PSW相关标志位的影响,若把两个操作数看成无符号数, CY=1,超出无符号数的表示范围(0255),考虑CY位,则操作结果为271 若把两个操作数看成带符号数, OV=0,无溢出,(-102)+117=15,结果正确,解:MOV A ,#9AH ADD A, #75H, 带进位的加法指令(4) ADDC A,#data ;(A)+data+(C

26、Y)(A) ADDC A,direct ;(A)+ (direct)+(CY)(A) ADDC A,Rn ;(A)+ (Rn)+(CY)(A) ADDC A,Ri ;(A)+ (Ri)+(CY)(A),功能:将源操作数、累加器A和CY中的值相加,并把操作结果保留在累加器A中 用途:常用于多字节加法运算,注意: 该类指令执行结果将影响标志位CY、AC、OV、P 使用该类指令前,应对CY清零 CLR C,例10-8:已知:(A)=85H、(R0)=30H、(30H)= 11H、(31H)=0FFH、(CY)=1,试问8051执行如下指令后累加器A和CY中的值是多少? ADDC A ,R0 ADDC

27、 A ,31H ADDC A ,R0 ADDC A , #85H,操作结果: A=B6H,CY=0 A=85H,CY=1 A=97H,CY=0 A=0BH,CY=1,(2)带借位减法指令:4条,SUBB A,#data ;(A)-data-(CY)(A) SUBB A,direct ;(A)-(direct)-(CY)(A) SUBB A,Rn ;(A)-(Rn)-(CY)(A) SUBB A,Ri ;(A)-(Ri)-(CY)(A),功能: 把累加器A中操作数减去源地址所指操作数及指令执行前的CY值,并把结果保留在累加器A中,使用时应注意的问题: 参加运算的两个操作数和操作结果都必须是8位二

28、进制数,其中一个操作数必须在A中,且运算结果也在A中,对PSW中所有标志位产生影响 在加法运算中,CY、AC、C8、C7表示相应的进位 在减法运算中,CY、AC、C8、C7表示相应的借位 无符号数减法运算存在借位问题,无溢出问题;只有带符号数减法运算才有溢出问题,由OV判断,OV=1溢出,否则无溢出 MCS-51指令中,没有不带CY的减法指令(SUB),如果想不考虑借位位,就在该减法指令前加一条CY的清零指令 CLR C,例10-9:已知:(A)=A9H、(20H)= 98H,试问8051执行如下指令后累加器A和CY中的值是多少?,执行结果: (A)= 11H,(PSW)=00H,CLR C

29、MOV A,#0A9H MOV R0,#20H MOV 20H,#98H SUBB A,R0,(3)加1、减1指令:9条, 加1指令(又称增量指令):5条 INC A;(A)+1(A) INC Rn;(Rn)+1(Rn) INC Ri ;(Ri)+1(Ri) INC DPTR ;(DPTR)+1(DPTR) INC direct;(direct)+1(direct),注意: 只有第一条指令影响PSW的P标志位,其余四条都不影响标志位 指令INC DPTR是MCS-51指令中惟一一条16位算术运算指令,2个字节,例10-10:设20H21H单元存放一个16位二进制数X1(高8位存入21H单元),

30、30H31H单元存放另一个16位二进制数X2 (高8位存入31H单元),求X1+X2,和存入20H21H,设两数之和不超过16位, 减1指令:4条 DEC A ;(A)-1(A) DEC Rn ;(Rn)- 1(Rn) DEC Ri ;(Ri)-1(Ri) DEC direct ;(direct)-1(direct),注意: 只有第一条指令影响PSW的P标志位,其余三条都不影响标志位 没有DEC DPTR指令!可用DEC DPH和DEC DPL指令实现,2个字节,(4)乘法和除法指令:2条, 乘法指令:1条 MUL AB ;(A)(B) (B) (A),注意: 乘法指令中,A、B只能是寄存器寻

31、址 执行乘法指令需要4个机器周期,对标志位的影响:CY=0;P为累加器A的奇偶校验位;当积大于255(即B中的内容不为0)时,则OV=1,否则OV=0,1个字节,功能:将累加器A和累加器B中8位无符号数进行乘运算,结果的高八位存入B中,低八位存入A中, 除法指令:1条 DIV AB ;(A) (B) (A) (B) 功能:将累加器A和累加器B中8位无符号数进行除运算,商数存入A中,余数存入B中,应用乘除法指令注意: 操作数只能是8位无符号数; A、B只能是寄存器寻址; 除法指令中,(B)0,否则OV=1; 关注结果的存放位置,对标志位的影响:CY=0;P为累加器A的奇偶校验位;当除数为0时,除

32、法无意义,OV=1,否则OV=0,注意: 除法指令中,A、B只能是寄存器寻址 执行除法指令需要4个机器周期,1个字节,(5)十进制调整指令:1条,DA A 功能:用于BCD码加法运算,调整规则: 若AC=1或(A)309,则(A)+ 06H (A) 若CY=1或(A)749,则(A)+ 60H (A),1个字节,注意: DA指令使用时,应跟在ADD或ADDC指令之后 不能用DA指令对BCD码减法操作进行直接调整 DA指令不影响OV 借助标志位可实现多位BCD码加法结果的调整, BCD码加法 如果两个BCD数相加结果也是BCD数,则该加法为BCD加法 MCS-51没有专门的BCD码加法指令 实现

33、BCD码加法方法:在一条加法指令(ADD、ADDC)后,加上DA指令,例10-11:编写程序完成78+53的加法程序,并对调整过程进行分析, BCD码减法 如果两个BCD数相减结果也是BCD数,则该减法为BCD减法 MCS-51没有专门的BCD码减法指令 实现BCD码减法思想:采用BCD补码运算法则, 被减数 - 减数 被减数 + 减数的补码,然后,对其和用DA指令调整,实现BCD码减法步骤: 求BCD减数的补码:9AH减数 被减数加BCD减数的补码 进行十进制加法调整DA,例10-12:在30H和31H中分别存有被减数91和减数36,试编程求差,结果以BCD码形式存入32H中,3. 逻辑运算

34、及位操作指令:36条,(1)逻辑运算指令:20条 功能:对两8位二进制数进行与、或、非和异或逻辑运算 对标志位的影响:除了以累加器A为目标寄存器指令外,其余指令均不会影响PSW中任何标志位,注意: “与”指令有屏蔽作用 “或”指令有置位作用 “异或”指令有清零作用,例9-13:已知片外RAM 2000H单元中有一个数8FH,编程使它的高4位取反,低4位不变,程序: ORG 2000H MOV DPTR,#2000H MOVX A,DPTR XRL A, #0F0H MOVX DPTR,A SJMP $ END,清零、取反指令:2条 CLR A ;0(A),累加器A清零 CPL A ;(A)(A

35、),累加器A取反,注意: 这两条指令都不影响PSW中的标志位 这两条指令都是单字节,虽然采用数据传送类指令或逻辑异或指令也可以实现上述功能,但它们至少需要两个字节 针对的对象是累加器A中的内容,(2)移位指令:4条,RL A ;累加器A中的内容左环移 RR A ;累加器A中的内容右环移 RLC A ;累加器A中的内容通过CY左环移 RRC A ;累加器A中的内容通过CY右环移,例10-13:执行下面的程序,观察累加器A中内容的变化,MOV A,#02H RL A RL A RL A,注意: 针对的对象是累加器A中的内容,且是无符号数 都是单字节指令 左移相当于乘2,右移相当于除2,;02H(A

36、) ;04H(A) ;08H(A) ;10H(A),(3)位操作指令:12条,位操作指令的操作数是字节中的某一位,每位取值只能是0或1,故又称为布尔变量操作指令 操作对象:片内RAM的位寻址区20H2FH(128个)+ SFR中11个寄存器(83个),共计211个位 布尔处理器的位累加器CY在指令中简写成C,位传送指令:2条 MOV C,bit ;(bit)(CY) MOV bit,C ;(CY)(bit),例10-14:设并行I/O口的P2.0P2.2与译码器输入端连接如图所示,欲使累加器A中的低3位送译码器,试编写程序实现之,设最低位由P2.0输出,功能:将源操作数指定的位变量传送(复制)

37、到目的操作数指定单元,其中一个操作数为位地址,另一个必为位累加器C,位变量修改指令:6条 CLR C ;0(CY) SETB C ;1(CY) CPL C;(CY) (CY) CLR bit ;0(bit) SETB bit ;1(bit) CPL bit; (bit)(bit),功能:分别完成位清0、置位及取反操作,注意:执行结果不影响其它标志位,除C外,位逻辑运算指令:4条 ANL C,bit;(CY)(bit)(CY) ANL C,/bit;(CY)(bit)(CY) ORL C,bit;(CY)(bit)(CY) ORL C,/bit;(CY ) (bit) (CY),功能:将C中的内

38、容与某位内容进行“与”、“或”、“非”操作后送入位累加器C,注意:位指令中没有XRL指令,例10-15:M、N和W都代表位地址,编程完成M、N中内容的异或操作,结果存放在W中,程序: ORG2300H MOV C,N ANL C,/M MOV W,C MOV C,M ANL C,/N ORL C,W MOV W,C SJMP $ END,4. 控制转移指令:22条,功能:用于改变程序计数器PC值,以控制程序的流向 有效区间:ROM 标志位:这些指令的执行一般都不会对标志位有影响,(1)无条件转移指令:4条,注意: addr16通常采用符号地址表示 可以在64KB(0000HFFFFH)范围内转

39、移的指令 三字节双周期指令,功能:将指令中16位目标地址码送入程序计数器PC,使程序执行下条指令时无条件转移到addr16去执行,长转移指令 LJMP addr16 ;addr16(PC),绝对转移指令AJMP addr11 ;(PC)+2(PC)当前值,(addr11)(PC)10-0,功能:指令中提供11位地址,与PC当前值的高5位共同组成16位目标地址 程序无条件转向目标地址,注意: 该指令是一条可以在2K范围内转移的指令 转移的目标地址是通过计算获得,该过程是系统自动完成的 双字节双周期指令,如:2FFFH AJMP 17BH (PC)当前值 = 2FFFH + 2 =3001H (P

40、C)转移 = 317BH,短转移指令SJMP rel ;(PC)+ 2 (PC)当前值, (PC)当前值+ rel (PC),注意: 短转移指令是一条相对转移指令 双字节双周期指令 SJMP $ 停机指令,并非真正的停机指令,如:1000H SJMP 89H (PC)转移 = 1000H + 2 + 89H = 1002H + FF89H = 0F8BH,FE(-2),功能:先使PC加2后的地址和rel相加作为目标转移地址 rel为地址偏移量,为带符号8位二进制,常用补码表示,范围为-128+127,因此,程序转移范围为当前PC前128字节,或后127字节,间接转移指令 JMP A+DPTR

41、;(A)+(DPTR)(PC),功能:将累加器A中的8位无符号数与16位数据指针相加,其和装入程序计数器PC中,控制程序转向目标地址,注意: 用户应预先把目标地址的基地址送入DPTR,目标地址对基地址的偏移量放入累加器A中 这是一条很有用的散转指令,转移地址不是在编程时确定的,而是在程序运行时动态决定的 多用于多分支程序中,DPTR装入多分支程序的首地址,由累加器A的内容动态选择其中的某一分支进行分支转移,例10-16:已知累加器A中放有待处理命令编号03,程序存储器中放有始址为TAB的二字节短转移指令,编程使机器按照累加器A中的命令编号转去执行相应的命令程序,程序: ORG1000H RL

42、A ;2(A)(A) MOV DPTR,#TAB ;转移指令表始址送DPTR JMP A+DPTR TAB:AJMPKL0 AJMP KL1 AJMP KL2 AJMP KL3 ,(2)条件转移指令:8条,特点: 是一种在执行过程中需要判断某种条件是否满足而决定程序流程 如满足条件就转移,否则就不转移,顺序执行原程序 均为相对寻址转移指令,累加器A的判零转移指令:2条 JZ rel; 若A=0,则(PC)+ 2 + rel(PC) ;若A0,则(PC)+ 2(PC) JNZ rel; 若 A0,则(PC)+ 2 + rel(PC) ;若A=0,则(PC)+ 2(PC),注意: 上述两条指令判别

43、规则正好相反 都是双字节指令 rel为8位带符号数,条件转移目标地址是PC当前值为中心(-128+127),例10-17:已知外部RAM中DATA1为起始地址的数据块,该数据块以零为结束标志,试编程将其传送到以DATA2为起始地址的内部RAM区,程序: ORG2400H MOVDPTR,#DATA1 MOVR0,#DATA2 LOOP:MOVXA,DPTR JZDONE MOVR0,A INCDPTR INCR0 SJMPLOOP DONE:SJMP$ END,比较转移指令:4条 CJNE A,direct,rel ;若(A)(direct),则(PC)+3 + rel(PC) ;若(A)=(

44、direct),则(PC)+3(PC) CJNE A,#data,rel;若(A)data,则(PC)+3+ rel(PC) ;若(A)=data,则(PC)+3(PC) CJNE Rn,#data,rel;若(Rn)data,则(PC)+3+ rel(PC) ;若(Rn)=data,则(PC)+3(PC) CJNE Ri,#data,rel;若(A)data,则(PC)+3+ rel(PC) ;若((Ri))=data,则(PC)+3(PC),功能: 对目的操作数与源操作数比较,若它们的值不等则转移,相等则按顺序执行程序,指令操作过程:,注意: 都是三字节指令 指令执行过程中的比较操作实际上

45、是减法操作,不保存两数之差,但要形成CY标志(即对CY有影响) 若参加比较的两个操作数是无符号数,则可以直接根据指令执行后产生的CY 判断两个操作数的大小,若目的操作数小于源操作数,则CY=1 ,否则CY=0 若参加比较的两个操作数是带符号数补码,则仅根据CY是无法判断它们的大小,循环转移指令:2条 DJNZ Rn,rel ;(Rn)-1(Rn) ;若(Rn)0,则(PC)+ 2 + rel(PC) ;若(Rn)= 0,则(PC)+ 2(PC) DJNZ direct, rel;(direct)-1 (direct) ;若(direct)0,则(PC)+ 3 + rel(PC) ;若(dire

46、ct)= 0,则(PC)+ 3(PC),功能:这是减1 与0比较指令,每执行一次该指令,目的操作数减1,结果送回目的操作数中,并判断目的操作数是否为0,不为0则转移,否则顺序执行,注意: 如果目的操作数原值为00H,减1则下溢得FFH,不影响任何标志位,2字节,3字节,例10-18:编程求片内RAM中50H为始址的连续10个无符号数相加,并把结果送到片外的2000H单元中(假设和不产生进位),程序: ORG 1000H MOV DPTR,#2000H ;指针DPTR指向外部2000H单元 MOV R5,#0AH ;数据块长度送到R5 MOV R0,#50H ;数据块始址送到R0 CLRC;位累

47、加器清零 CLR A ;累加器清零 LOOP:ADDC A,R0 ;加一个数,结果放在A中 INC R0 ;修改加数地址指针 DJNZ R5,LOOP ;若R5-10,则转到LOOP MOVX DPTR,A ;把结果送到片外2000H单元 SJMP $ ;停机 END,特别提醒: 条件转移指令均为相对转移指令(rel),因此指令的转移范围十分有限;若要实现64KB范围内的转移,则可以借助于一条长转移指令过渡来实现,(3)位控制转移指令:5条位控制转移指令也属于条件转移指令,功能: 根据位累加器C或某一位地址单元的状态(0或1),控制程序的走向,CY位内容为条件的转移指令:2条,JC rel;若

48、(CY)=1,则(PC)+2+rel(PC) ;若(CY)=0,则(PC)+2(PC) JNC rel;若(CY)=0,则(PC)+2+rel(PC) ;若(CY)=1,则(PC)+2(PC),注意: 都是双字节指令 都是相对转移指令,以CY状态判断程序是否需要转移 通常与比较条件转移指令CJNE连用,位地址内容为条件的转移指令:3条,JB bit,rel; 若(bit)=1,则(PC)+3+rel(PC) ;若(bit)=0,则(PC)+3(PC) JNB bit,rel; 若(bit)=0,则(PC)+3+rel(PC) ;若(bit)= 1,则(PC)+3(PC) JBC bit,rel

49、; 若(bit)=1,则(PC)+3+rel(PC) ;且0(bit) ;若(bit)=0,则(PC)+3(PC),注意: 都是三字节指令 第2条指令与第1条指令判定规则相反 第3条指令与第1条指令判定规则相同,只是第3条指令将0(bit),具有清0功能,例10-19:若片内RAM50H、51H两单元分别存放两个无符号数,比较这两个数的大小,并将较大者存入51H单元,较小者存入52H单元,试编程实现,改为: CJNEA, 51H,LOOP1,流程图:,(4)子程序调用和返回指令:4条,子程序的功能: 减少编程工作量; 减少程序所占ROM存储空间 调用程序(主程序/子程序):调用子程序的程序调用

50、指令 被调用程序(子程序):被调用的程序返回指令,特点: 子程序执行完成,通过返回指令PC自动返回调用指令的下一条指令执行 调用指令与返回指令成对使用 子程序可以嵌套, 调用指令,功能: 断点保护 构造目的地址,特点: 是三字节指令 64KB范围调用,长调用指令 LCALL addr16;(PC)+ 3(PC) ;(SP)+ 1(SP),(PC)7-0(SP) ;(SP)+ 1(SP),(PC)15-8(SP) ; addr16(PC),短调用指令 ACALL addr11;(PC)+ 2(PC) ;(SP)+ 1(SP),(PC)7-0(SP) ;(SP)+ 1(SP),(PC)15-8(S

51、P) ; addr11(PC)100,功能: 断点保护 构造目的地址(子程序入口地址),形成同AJMP指令,特点: 是两字节指令 2KB范围调用, 返回指令,RET; (SP) (PC)15-8 ,(SP)- 1(SP) ; (SP) (PC)7-0 ,(SP)- 1(SP) RETI; (SP) (PC)15-8 ,(SP)- 1(SP) ; (SP) (PC)7-0 ,(SP)- 1(SP),功能:这两条指令的功能相同,都是把堆栈中断点地址恢复到程序计数器PC中,从而使单片机回到断点处执行程序,注意: RET为子程序返回指令,只能位于子程序末尾 RETI为中断返回指令,只能位于中断服务程序

52、末尾 RETI的功能,(5)空操作指令:1条,NOP ;(PC)+ 1(PC),注意:该指令是一条单字节单周期控制指令,例10-20:利用NOP指令产生方波,功能: 使程序计数器PC加1,消耗一个机器周期外,没有执行任何操作 用途:常用于程序的等待或时间延迟及软件陷阱技术,10.3 汇编语言及程序设计,1. 汇编语言,指令:,注意: 立即数前加“#”,后面带“B”、“D”、“H”分别表示“二进制”、 “十进制”、“十六进制” 指令中rel、addr16、addr11常用标号地址表示 指令中操作数可带加、减运算符的表达式 “$”符号表示该转移指令机器码所在ROM的首地址 标号以字母开头、不超过8

53、个字符,不允许使用保留字、寄存器名及伪指令字符,特点:伪指令是由汇编程序识别,并完成相应的功能 功能:在汇编过程中对数据的存储环境或汇编实施一定的控制,如:伪指令给程序分配一定的存储区、定义符号、指定暂存数据的RAM区等,DATA(赋值)伪指令:,格式: 字符名 DATA 表达式,DATA伪指令与EQU伪指令的区别: EQU定义的字符名必须“先定义后使用”,而DATA定义的“字符名”没有这种限制 DATA伪指令可放在程序的任何位置,比EQU伪指令灵活,功能:将右边“表达式”的值赋给左边的“字符名” 注意:这里的表达式允许是一个数据或地址,也可以是包含被定义的“字符名”在内的表达式,但不能是汇编

54、符号,如R0R7等,ORG(起始汇编)伪指令 :,格式:ORG 功能:把以下语句定义的内存数据或程序,从表达式指定的起点(偏移地址)开始连续存放,直至遇到新的ORG指令。表达式值是一个无符号数,格式:END 功能:结束汇编语言源程序的标志 用途:常用于汇编语言源程序末尾,表示汇编结束 注意:一个源程序只能有一个END命令,且置于程序的最后。在END以后所写的指令,汇编程序都不予处理,END(结束汇编)伪指令 :,BIT(位地址赋值)伪指令:,格式:字符名 BIT 位地址 功能:将位地址赋予BIT前面的字符名,经赋值后可用该字符名代替BIT后面的位地址,注意: 被定义后,“字符名”是一个符号位地

55、址 有些汇编程序不允许使用BIT伪指令,用户只能用EQU伪指令定义位地址变量,但是用这种方式定义时,EQU语句右边只能是实际的物理地址,而不能使符号位地址,如:K1 BIT 20H KK BIT K1,X2 EQU 6DH X2 EQU K1,2. 顺序结构程序设计,特点:执行程序的方式是“从头到尾”逐条执行指令语句,直至程序结束,例10-21: 拆字程序。 将30H单元内的两位BCD码拆开并转换成ASCII码,将转换后的ASCII码放在31H和32H单元,并让低位ASCII码放在32H单元,例10-22:将60H单元中的8位无符号数转换成三位BCD码,并存放在BAI(百位)、SHI(十位)和

56、GE(个位)三个单元中,例10-23:将两个三字节无符号数相加,其中一个加数在内部RAM的32H、31H和30H单元;另一个加数在内部RAM的35H、34H和33H单元,要求相加后的和存入32H、31H和30H单元,进位存入位寻址区的20H单元中,例10-24:16位数求补。已知16位二进制数在R1、R0中,将此16位二进制数求补,求补结果存入内部RAM 31H、30H单元,程序: ORG2000H CLRC MOVA,R0;取低位字节送入A CPLA;求反 ADDA,#01H;加1 MOV30H,A;存低位字节补码 MOVA,R1;取高位字节送A CPLA;去反 ADDCA,#00H;加进位

57、 MOV31H,A;存高位字节补码 END,3. 分支结构程序设计,利用条件转移指令,使程序执行到某一指令后,根据条件(即上面运算的情况)是否满足,改变程序执行的次序,特点:先用比较指令或数据操作及位测指令等改变标志寄存器各个标志位,然后用条件转移指令进行分支,设计要点: 先建立可供条件转移指令测试的条件 选用合适的条件转移指令,如: JZ,JNZ,CJNE,DJNZ等/JC,JNC,JB,JNB,JBC等 在转移的目的地址处设定标号,例10-25:求单字节有符号二进制数的补码,程序: ORG 2000H JNB ACC.7,NEG ;(A)0,不需转换 MOV C,ACC.7 ;保存符号位

58、MOV 00H,C ;保存符号位 CPL A ADD A,#1 MOV C,00H MOV ACC.7,C ;恢复符号位 NEG:SJMP $ END,例10-26:已知VAR单元中有一自变量X,请按如下条件编出求函数值Z并将它存入FUN单元的程序,方法一:先分支后赋值,程序: ORG 2000H VAR DATA 40H FUN DATA 41H START:MOV A,VAR JZ SAVE JNB ACC.7,ZHEN MOV A,#0FFH SJMP SAVE ZHEN:MOV A,#01H SAVE:MOV FUN,A SJMP $ END,ORG 2000H VAR DATA 40

59、H FUN DATA 41H START:MOV A,VAR;自变量XA CJNEA,#0,NEQ;若X0,则转NEQ SJMP SAVE NEQ:JNB ACC.7,ZHEN;若X0,则转ZHEN MOVA,#0FFH ;若X0,则A1 SJMP SAVE ZHEN:MOV A,#01H ;A1 SAVE:MOV FUN,A ;存数 SJMP $ END,方法二:先赋值后分支,程序: ORG 2000H VAR DATA 40H FUN DATA 41H START:MOV A,VAR JZ SAVE MOV R1,#0FFH JB ACC.7,NEG MOV R1,#01H SJMP SAVE NE

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论