1、第3章 MCS-51单片机指令系统和汇编语言程序示例第第3 3章章 MCS-51MCS-51单片机指令系统单片机指令系统 和汇编语言程序示例和汇编语言程序示例3.1 MCS-51单片机指令系统概述单片机指令系统概述3.2 寻址方式寻址方式3.3 数据传送类指令数据传送类指令3.4 算术运算类指令算术运算类指令3.5 逻辑运算及移位指令逻辑运算及移位指令3.6 控制转移类指令控制转移类指令3.7 子程序调用与返回指令子程序调用与返回指令3.8 位操作类指令位操作类指令第3章 MCS-51单片机指令系统和汇编语言程序示例3.1 MCS-51单片机指令系统概述单片机指令系统概述3.1.1 指令、指令
2、系统的概念指令、指令系统的概念 指令指令-是是CPU按照人们的意图来完成某种操作的命令,它以按照人们的意图来完成某种操作的命令,它以英文名称或缩写形式作为英文名称或缩写形式作为助记符助记符。 汇编语言指令汇编语言指令-用助记符、符号地址、标号等表示的书写程用助记符、符号地址、标号等表示的书写程序的语言。序的语言。 掌握汇编语言指令是程序设计的掌握汇编语言指令是程序设计的基础基础。第3章 MCS-51单片机指令系统和汇编语言程序示例 指令系统概述指令系统概述简明、易掌握、效率较高的指令系统简明、易掌握、效率较高的指令系统,复杂指令集复杂指令集。按按所占字节分所占字节分,分,分三种三种:(1 1)
3、单字节指令)单字节指令4949条;条;(2 2)双字节指令)双字节指令4545条;条;(3 3)三字节指令)三字节指令1717条。条。按按执行时间来分执行时间来分,分三种:,分三种:(1 1)1 1个个机器周期(机器周期(1212个时钟振荡周期)的指令个时钟振荡周期)的指令6464条条;(2 2)2 2个个机器周期指令机器周期指令4545条条;(3 3)4 4个个机器周期机器周期乘、除指令乘、除指令。第3章 MCS-51单片机指令系统和汇编语言程序示例3.1.2 MCS-51单片机指令系统及其指令格式单片机指令系统及其指令格式 指令系统中的指令描述了不同的操作,不同操作对应不同指令系统中的指令
4、描述了不同的操作,不同操作对应不同的指令。的指令。 每条指令通常由每条指令通常由操作码操作码和和操作数操作数两部分组成。两部分组成。 操作码操作码表示计算机执行该指令将进行何种操作,表示计算机执行该指令将进行何种操作,操作数操作数表示表示参加操作的数的本身或操作数所在的地址。参加操作的数的本身或操作数所在的地址。MCS-51MCS-51单片机的指令有单片机的指令有无操作数、单操作数、双操作数无操作数、单操作数、双操作数三种情三种情况。汇编语言指令有如下的格式:况。汇编语言指令有如下的格式: 标号:标号: 操作码助记符操作码助记符 目的操作数目的操作数,源操作数,源操作数 ;注释;注释 第3章
5、MCS-51单片机指令系统和汇编语言程序示例一些符号的约定意义说明:一些符号的约定意义说明: (1) Ri和和Rn:表示当前工作寄存器区中的工作寄存器,:表示当前工作寄存器区中的工作寄存器,i取取0或或1,表示,表示R0或或R1。n取取07,表示,表示R0R7。 (2) #data:表示包含在指令中的:表示包含在指令中的8位立即数。位立即数。 (3) #data16:表示包含在指令中的:表示包含在指令中的16位立即数。位立即数。 (4) rel:以补码形式表示的:以补码形式表示的8位相对偏移量,范围为位相对偏移量,范围为-128127,主要用在相对寻址的指令中。,主要用在相对寻址的指令中。第3
6、章 MCS-51单片机指令系统和汇编语言程序示例 (5) addr16和和addr11:分别表示:分别表示16位直接地址和位直接地址和11位直接地位直接地址。址。 (6) direct:表示直接寻址的地址。:表示直接寻址的地址。 (7) bit:表示可位寻址的直接位地址。:表示可位寻址的直接位地址。 (8) (X):表示:表示X单元中的内容。单元中的内容。 (9) (X):表示以:表示以X单元的内容为地址的存储器单元内容,单元的内容为地址的存储器单元内容,即即(X)作地址,该地址单元的内容用作地址,该地址单元的内容用(X)表示。表示。 (10) / 和和符号:符号:“/”表示对该位操作数取反,
7、但不影响该表示对该位操作数取反,但不影响该位的原值。位的原值。“”表示操作流程,将箭尾一方的内容送入箭头所表示操作流程,将箭尾一方的内容送入箭头所指另一方的单元中去。指另一方的单元中去。 第3章 MCS-51单片机指令系统和汇编语言程序示例3.2.1 寄存器寻址寻址方式:寻找(源)操作数或指令转移地址的方式80C51单片机有7种寻址方式3.2 80C51的寻址方式操作数在寄存器中寻址空间:R0R7、A、B(AB形式)和DPTR特点:传送和执行速度快【例】若(例】若(R0)=30H, 执行MOV A,R0后,(A)=30H 第3章 MCS-51单片机指令系统和汇编语言程序示例3.2.2 直接寻址
8、操作码后字节存放的是操作数的地址寻址空间:片内RAM低128字节SFR(符号形式)另一类直接寻址是转移目标地址的寻址。如 : L J M P ADDR16【例】若(例】若(50H50H)=3AH =3AH , 执行MOV A,50H后,(A)=3AH 第3章 MCS-51单片机指令系统和汇编语言程序示例3.2.3 寄存器间接寻址寄存器中的内容是操作数的地址寻址空间:片内RAM(Ri、SP)片外RAM(Ri、DPTR)【例】若(例】若(R0)=30H,(30H)=5AH 执行MOV A,R0后,(A)=5AH 片内:MOV片外:MOVX第3章 MCS-51单片机指令系统和汇编语言程序示例3.2.
9、4 立即寻址操作数在指令编码中寻址空间:ROM对于MOV DPTR,#2100H指令,立即数高8位“21H”装入DPH 【例】执行例】执行MOV AMOV A,#50H #50H 结果:(结果:(A A)=50H =50H 第3章 MCS-51单片机指令系统和汇编语言程序示例3.2.5 变址寻址操作数地址:基地址+偏移量寻址空间:ROM变址寻址还用于跳转指令,如JMP A+DPTR 【例】(例】(A A)0FH 0FH (DPTRDPTR)=2400H =2400H 执行执行MOVC A,A+DPTR”MOVC A,A+DPTR”后后结果:(结果:(A A)=88H =88H 第3章 MCS-
10、51单片机指令系统和汇编语言程序示例3.2.6 相对寻址用于跳转指令,实现程序分支Rel常用符号地址表示,离源地址不要超过(128127 ) 【例】若例】若rel为75H,PSW.7为1,JC rel存于1000H开始的单元。 执行JC rel指令后,程序将跳转到1077H单元取指令并执行。 第3章 MCS-51单片机指令系统和汇编语言程序示例3.2.7 位寻址寻址位数据寻址空间片内RAM位空间SFR位空间【例】位地址【例】位地址00H00H内容为内容为1 1,MOV CMOV C,00H00H执行后,位地址执行后,位地址PSW.7PSW.7的内容为的内容为1 1。位寻址方式实位寻址方式实质属
11、于质属于位的直位的直接寻址接寻址。 第3章 MCS-51单片机指令系统和汇编语言程序示例7 7种寻址方式种寻址方式已介绍完毕。已介绍完毕。问题:问题:当一条指令给定后,如何来确定该指令的寻址方式?当一条指令给定后,如何来确定该指令的寻址方式?例如例如: : MOV AMOV A,#40H#40H,属于立即数寻址还是寄存器寻址?,属于立即数寻址还是寄存器寻址?要看以哪个操作数要看以哪个操作数作为参照系作为参照系。操作数分为操作数分为源操作数源操作数和和目的操作数目的操作数。对于。对于源操作数源操作数“#40H”#40H”来说,是来说,是“立即数寻址立即数寻址”方式,但对方式,但对目的操作数目的操
12、作数“A”A”来来说,是属于说,是属于“寄存器寻址寄存器寻址”方式。方式。一般而言,一般而言,寻址方式指的是寻址方式指的是源操作数源操作数,所以此例为立即数寻,所以此例为立即数寻址方式。址方式。对指令系统对指令系统7 7种寻址方式种寻址方式总结,概括总结,概括见见表表3-13-1。14第3章 MCS-51单片机指令系统和汇编语言程序示例15序号序号寻址方式寻址方式寻址空间寻址空间1 1寄存器寻址寄存器寻址R0R0R7R7、A A、B B、C(C(位位) )、DPTRDPTR等等2 2直接寻址直接寻址内部内部128128字节字节RAMRAM、特殊功能寄存器、特殊功能寄存器3 3寄存器间接寻址寄存
13、器间接寻址片内数据存储器、片外数据存储器片内数据存储器、片外数据存储器4 4立即数寻址立即数寻址程序存储器中的立即数程序存储器中的立即数5 5基址寄存器加变址寄存器间基址寄存器加变址寄存器间接寻址接寻址读程序存储器固定数据和程序散转读程序存储器固定数据和程序散转6 6相对寻址相对寻址程序存储器相对转移程序存储器相对转移7 7位寻址位寻址内部内部RAMRAM中的可寻址位、中的可寻址位、SFRSFR中的可中的可寻址位寻址位表表3-1 3-1 7 7种寻址方式及其寻址空间种寻址方式及其寻址空间第3章 MCS-51单片机指令系统和汇编语言程序示例3.3 数据传送类指令(29条)一般不影响标志寄存器PS
14、W的状态。 传送类指令有两大类 一般传送( MOV ) 特殊传送,如: MOVC MOVX PUSH、POP XCH、XCHD SWAP 第3章 MCS-51单片机指令系统和汇编语言程序示例3.3.1 一般传送指令16位传送(仅1条)MOV DPTR,#data16; DPTR data16例:执行指令 MOV DPTR,#1234H 后 (DPH)=12H,(DPL)=34H。8位传送通用格式:通用格式: MOV MOV , ; 第3章 MCS-51单片机指令系统和汇编语言程序示例 以A为目的dataA data#RiA RidirectA direct RnA Rn A MOV;)(;)(
15、;)(;,【例】若例】若(R1)= 20H,(20H)= 55H。执行指令 MOV A,R1 后,(A)= 55H。第3章 MCS-51单片机指令系统和汇编语言程序示例 以Rn为目的dataRn data#directRn direct A)Rn A Rn MOV;)(;(;,【例】执行指令 MOV R6,#50H 后,(R6)= 50H 第3章 MCS-51单片机指令系统和汇编语言程序示例 以direct为目的datadirect data# Ri direct Ridirect1direct direct1 )Rndirect Rn )Adirect A direct MOV;)(;)(;
16、(;(;,【例】若(R1)=50H,(50H)=18H,执行指令 MOV 40H,R1 后,(40H)=18H 第3章 MCS-51单片机指令系统和汇编语言程序示例 以Ri为目的dataRi data#directRi direct )ARi A Ri MOV);()();();(,【例】若(R1)=30H,(A)=20H,执行指令 MOV R1,A 后,(30H)=20H。 第3章 MCS-51单片机指令系统和汇编语言程序示例3.3.2 特殊传送指令 以DPTR内容为基址读ROM中常数表项指令MOVCROM中可以存放程序代码,还经常存放常数表 MOVC AMOVC A,A+DPTRA+DPT
17、R;A A (A A)+ +(DPTRDPTR) 以PC内容为基址MOVC AMOVC A,A+PC A+PC ;A A (A A)+ +(PCPC)常数表存放约束小,称为远程查表指令。占用DPTR 常数表存放约束大,称为近程查表指令。不占用DPTR 第3章 MCS-51单片机指令系统和汇编语言程序示例 读片外RAM读片外RAM及接口单元数据的指令MOVX片外RAM中经常存放数据采集与处理的中间数据 MOVX AMOVX A,DPTR DPTR ;A A (DPTRDPTR)MOVX AMOVX A,RiRi ;A A (RiRi) 写片外RAMMOVX DPTRMOVX DPTR,A A ;
18、(;(DPTRDPTR)AAMOVX RiMOVX Ri,A A ;(;(RiRi)AA注意:用Ri寻址时,高8位地址由P2口提供 第3章 MCS-51单片机指令系统和汇编语言程序示例 入栈指令PUSH堆栈操作指令PUSH和POP堆栈是一片存储区,遵循“后进先出”原则,栈顶由SP指示。80C51的堆栈设在片内RAM低端的128个单元,向上生长。 PUSH direct PUSH direct ;SPSP(SPSP)1 1,(,(SPSP)(directdirect) 出栈指令POPPOP direct POP direct ;(;(directdirect)(SPSP),),SP SP (SP
19、SP)1 1 注:堆栈用于子程序调用时保护返回地址,或者用于保护子程序调用之前的某些重要数据(即保护现场),还可以用于数据交换。 第3章 MCS-51单片机指令系统和汇编语言程序示例利用堆栈完成40H与50H单元内容的交换的示例 MOV SP,#6FH;将堆栈设在70H以上RAM空间PUSH 40H ;将40H单元的“23H”入栈,之后(SP)=70H PUSH 50H ;将50H单元的“45H”入栈,之后(SP)=71HPOP 40H ;将SP指向的71H单元的内容弹到40H单元,之后(SP)=70HPOP 50H ;将SP指向的70H单元的内容弹到50H单元,之后(SP)=6FH(a)初始
20、状态 (b)2条PUSH指令执行后 (c)2条POP指令执行后第3章 MCS-51单片机指令系统和汇编语言程序示例 字节交换指令XCH数据交换指令XCH、XCHD和SWAP数据交换属于同时进行的双向传送 )(;)(;)(;,RiA RidirectA direct RnA Rn A XCH【例】若(例】若(R0)=80H,(A)=20H。 执行指令 XCH A,R0 后,(A)=80H,(R0)=20H。 第3章 MCS-51单片机指令系统和汇编语言程序示例 半字节交换指令XCHD【例】若(例】若(R0R0)30H30H,(,(30H30H)67H67H, (A A)20H20H。执行指令。执
21、行指令 XCHD AXCHD A,R0 R0 指令后,(指令后,(A A)27H27H,(,(30H30H)60H60H。 )();()()();(,ACC.0ACC.3ACC.4ACC.7 A SWAPACC.0ACC.30 .Ri3 .Ri Ri A XCHDXCHDXCHD是间址操作数的低半字节与是间址操作数的低半字节与A A的低半字节互换。的低半字节互换。SWAPSWAP是累加器的高低是累加器的高低4 4位互换位互换【例】若(例】若(A A)30H30H,执行指令,执行指令SWAP ASWAP A后,(后,(A A)03H 03H 。 第3章 MCS-51单片机指令系统和汇编语言程序示
22、例3.4 算术运算类指令算术运算类指令3.4.1 加、减法指令加、减法指令图3.4 加减法指令形式结构图(a) 加减法指令关系图;(b) 加1、减1指令关系图 第3章 MCS-51单片机指令系统和汇编语言程序示例表表3.2 加减法指令表加减法指令表第3章 MCS-51单片机指令系统和汇编语言程序示例 例例6 设(A) = 49H,(R0)=6BH,分析执行指令ADD A,R0后的结果。 结果为:(A)=B4H,OV=1,CY=0,AC=1,P=0。 例例7 设(A)=C3H,数据指针低位(DPL)=ABH,CY=1,分析执行指令ADDC A,DPL后的结果。 结果为:(A)=6FH,CY=1,
23、AC=0,P=0。 例例8 设 (A) = 52H,(R0)=B4H,分析执行如下指令后的结果 CLR C ;是位操作指令,是进位位清零 SUBB A,R0 结果为:(A)=9EH,CY=1,AC=1,OV=1,P=1。第3章 MCS-51单片机指令系统和汇编语言程序示例 例例9 设 (R0) = 7EH,(7EH)=FFH,(7FH)=38H,(DPTR)=10FEH,分析逐条执行下列指令后各单元的内容。INC R0 ;使7EH单元内容由FFH变为00HINC R0 ;使R0的内容由7EH变为7FHINC R0 ;使7FH单元内容由38H变为39HINC DPTR ;使DPL为FFH,DPH
24、不变INC DPTR ;使DPL为00H,DPH为11HINC DPTR ;使DPL为01H,DPH不变第3章 MCS-51单片机指令系统和汇编语言程序示例3.4.2 十进制调整指令十进制调整指令若(A)309或(AC)=1,则(A)30(A)30+06H若(A)749或(CY)=1,则(A)74(A)74+06HDA A ; 若AC=1,CY=1同时发生,或者高4位虽等于9但低4位修正后有进位,则A应加66H修正。 十进制调整指令是一条对二-十进制的加法进行调整的指令。它是一条单字节指令,机器码为D4H。两个压缩BCD码按二进制相加,必须在加法指令ADD、ADDC后,经过本指令调整后才能得到
25、正确的压缩BCD码和数,实现十进制的加法运算。第3章 MCS-51单片机指令系统和汇编语言程序示例 例例10 对BCD码加法65 + 58BDH,进行十进制调整。 参考程序如下:MOV A,#65H ;(A)65ADD A,#58H ;(A)(A)+58DA A ;十进制调整第3章 MCS-51单片机指令系统和汇编语言程序示例 使用时应注意:DA指令不能对减法进行十进制调整。做减法运算时,可采用十进制补码相加,然后用 DA A指令进行调整。例如 70 - 20 = 70 + 20补 = 70 +(100 - 20)= 70 + 80 = 1 50 机内十进制补码可采用:x补 = 9AH - x
26、 。第3章 MCS-51单片机指令系统和汇编语言程序示例 例例11 设片内RAM 30H,31H单元中分别存放着两位BCD码表示的被减数和减数,两数相减的差仍以BCD码的形式存放在32H单元中。可用下面的程序实现:CLR CMOV A,#9AHSUBB A,31H ;求减数的十进制补码ADD A,30H ;作十进制补码加法DA A ;进行BCD调整MOV 32H,A ;将BCD码的差送存32H单元第3章 MCS-51单片机指令系统和汇编语言程序示例3.4.3 乘、除法指令乘、除法指令MUL AB;(B)(A)(B)158(A)(A)(B)70CY0机器码:A4H 乘法指令的功能是把累加器A和寄
27、存器B中的两个8位无符号数相乘,将乘积16位数中的低8位存放在A中,高8位存放在B中。若乘积大于FFH(255),则溢出标志OV置1,否则OV清零。乘法指令执行后进位标志CY总是零,即CY=0。第3章 MCS-51单片机指令系统和汇编语言程序示例2除法指令除法指令DIV AB;(A)(A)(B)之商,(B)(A)(B)之余数(CY)0,(OV)0机器码:84H 除法指令的功能是把累加器A中的8位无符号整数除以寄存器B中的8位无符号整数,所得商存于累加器A中,余数存于寄存器B中,进位标志位CY和溢出标志位OV均被清零。若B中的内容为0时,溢出标志OV被置1,即OV=1,而CY仍为0。第3章 MC
28、S-51单片机指令系统和汇编语言程序示例3.5 逻辑运算及移位指令逻辑运算及移位指令图3.5 逻辑指令形式结构图 (a) 与加、减法指令寻址方式相同的逻辑指令;(b) 与加、减法指令寻址方式不同的逻辑指令第3章 MCS-51单片机指令系统和汇编语言程序示例表表3.3 逻辑操作指令表逻辑操作指令表第3章 MCS-51单片机指令系统和汇编语言程序示例表表3.3 逻辑操作指令表逻辑操作指令表第3章 MCS-51单片机指令系统和汇编语言程序示例 例例12 (P1)=C5H=11000101B,屏蔽P1口高4位而保留低4位。 执行指令:ANL P1,#0FH 结果为:(P1)=05H=00000101B
29、。 逻辑“或”指令常用来使字节中某些位置“1”,其它位保持不变。则欲置位的位用1与该位相或,保留不变的位用0 与该位相或。第3章 MCS-51单片机指令系统和汇编语言程序示例 例例13 若(A)=C0H,(R0)=3FH,(3FH)=0FH, 执行指令:XRL A,R0 结果为:(A)=CFH=11001111B。 逻辑异或指令常用来使字节中某些位进行取反操作,其它位保持不变。欲某位取反该位与1相异或;欲某位保留则该位与0 相异或。还可利用异或指令对某单元自身异或,以实现清零操作。第3章 MCS-51单片机指令系统和汇编语言程序示例 例例14 若(A)=B5H=10110101B,执行下列操作
30、: XRL A,#0F0H ; A的高4位取反,低4位保留, (A)=01000101B=45H MOV 30H,A ;(30H)=45H XRL A,30H ;自身异或使A清零 用移位指令还可以实现算术运算,左移一位相当于原内容乘以2,右移一位相当于原内容除以2,但这种运算关系只对某些数成立(请读者自行思考)。第3章 MCS-51单片机指令系统和汇编语言程序示例例例15 设(A)=5AH=90,且CY=0,则执行指令RL A后,(A)=B4H=180。执行指令 RR A后,(A)=2DH=45。执行指令 RLC A后,(A)=B4H=180。执行指令 RRC A后,(A)=2DH=45。第3
31、章 MCS-51单片机指令系统和汇编语言程序示例3.6 控制转移类指令控制转移类指令3.6.1 无条件转移指令无条件转移指令表3.4 无条件转移指令第3章 MCS-51单片机指令系统和汇编语言程序示例 1LJMP(长转指令长转指令) LJMP指令执行后,程序无条件地转向16位目标地址(addr16)处执行,不影响标志位。由于指令中提供16位目标地址,所以执行这条指令可以使程序从当前地址转移到64 KB程序存储器地址空间的任意地址,故得名为长转移。该指令的缺点是执行时间长,字节多。第3章 MCS-51单片机指令系统和汇编语言程序示例 2AJMP(绝对转移指令绝对转移指令) AJMP的机器码是由1
32、1位直接地址addr11和指令操作码00001,按下列分布组成的: a10 a9 a8 0 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 该指令执行后,程序转移的目的地址是由AJMP指令所在位置的地址PC值加上该指令字节数2,构成当前PC值。取当前PC值的高5位与指令中提供的11位直接地址形成转移的目的地址,即 PC15 PC14 PC13 PC12 PC11a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0转移目的地址(PC) 第3章 MCS-51单片机指令系统和汇编语言程序示例 由于11位地址的范围是0000000000011111111111,即2 KB
33、范围,而目的地址的高5位是由PC当前值,所以程序可转移的位置只能是和PC当前值在同一2 KB范围内。本指令转移可以向前也可以向后,指令执行后不影响状态标志位。 例如:若AJMP指令地址(PC)=2300H。执行指令AJMP 0FFH后,结果为:转移目的地址(PC)=20FFH,程序向前转到20FFH单元开始执行。 又如:若AJMP指令地址(PC)=2FFFH。执行指令AJMP 0FFH后,结果为:转移目的地址(PC)=30FFH,程序向后转到30FFH单元开始执行。 由上可见:若addr11相同,则AJMP指令的机器码相同,但转移的目的地址却可能不同,这是因为转移的目的地址是由PC当前值的高5
34、位与addr11共同决定的。第3章 MCS-51单片机指令系统和汇编语言程序示例 3SJMP(相对短转指令相对短转指令) 指令的操作数rel用8位带符号数补码表示,占指令的一个字节。因为8位补码的取值范围为-128+127,所以该指令的转移范围是:相对PC当前值向前转128字节,向后转127字节。即转移目的地址= SJMP指令所在地址+2+rel 如在2100H单元有SJMP指令,若rel = 5AH(正数),则转移目的地址为215CH(向后转);若rel = F0H(负数),则转移目的地址为20F2H(向前转)。第3章 MCS-51单片机指令系统和汇编语言程序示例 用汇编语言编程时,指令中的
35、相对地址rel往往用欲转移至的地址的标号(符号地址)表示。机器汇编时,能自动算出相对地址值;但手工汇编时,需自己计算相对地址值rel。rel的计算公式如下: 向前转移:rel = FEH - (SJMP指令地址与目的地址差的绝对值) 向后转移:rel = FEH - (SJMP指令地址与目的地址差的绝对值) -2 若rel = FEH,即目的地址就是SJMP指令的地址,在汇编指令中的偏移地址可用 $ 符号表示。若在程序的末尾加上SJMP $(机器码为80 FEH),则程序就不会再向后执行,造成单指令的无限循环,进入等待状态。第3章 MCS-51单片机指令系统和汇编语言程序示例 4JMP A+D
36、PTR(相对长转移指令相对长转移指令) 它是以数据指针DPTR的内容为基址,以累加器A的内容为相对偏移量,在64 KB范围内无条件转移。该指令的特点是转移地址可以在程序运行中加以改变。例如,当DPTR为确定值,根据A的不同值就可以实现多分支的转移。该指令在执行后不会改变DPTR及A中原来的内容。第3章 MCS-51单片机指令系统和汇编语言程序示例例例16 根据累加器A的值,转不同处理程序的入口。 MOV DPTR,#TABLE ;表首地址送DPTR JMP A+DPTR ;根据A值转移 TABLE:AJMP TAB1 ;当(A)=0时转TAB1执行 AJMP TAB2 ;当(A)=2时转TAB
37、2执行 AJMP TAB3 ;当(A)=4时转TAB3执行第3章 MCS-51单片机指令系统和汇编语言程序示例3.6.2 条件转移指令条件转移指令 条件转移指令是当某种条件满足时,程序转移执行;条件不满足时,程序仍按原来顺序执行。转移的条件可以是上一条指令或更前一条指令的执行结果(常体现在标志位上),也可以是条件转移指令本身包含的某种运算结果。由于该类指令采用相对寻址,因此程序可在以当前PC值为中心的-128+127范围内转移。该类指令共有8条,可以分为累加器判零条件转移指令、比较条件转移指令和减1条件转移指令三类。表3.5中列出了这些指令。第3章 MCS-51单片机指令系统和汇编语言程序示例
38、表表3.5 条件转移指令条件转移指令第3章 MCS-51单片机指令系统和汇编语言程序示例 1判零条件转移指令判零条件转移指令 判零条件转移指令以累加器A的内容是否为0作为转移的条件。JZ指令是为0转移,不为0则顺序执行;JNZ指令是不为0转移,为0则顺序执行。累加器A的内容是否为0,是由这条指令以前的其它指令执行的结果决定的,执行这条指令不作任何运算,也不影响标志位。第3章 MCS-51单片机指令系统和汇编语言程序示例 例17 将片外RAM首地址为DATA1的一个数据块转送到片内RAM首地址为DATA2的存储区中。 外部RAM向内部RAM的数据转送一定要经过累加器A,利用判零条件转移正好可以判
39、别是否要继续传送或者终止。完成数据传送的参考程序如下: MOV R0,#DATA1 ;R0作为外部数据块的地址指针 MOV R1,#DATA2 ;R1作为内部数据块的地址指针LOOP: MOVX A,R0 ;取外部RAM数据送入AHERE: JZ HERE ;数据为零则终止传送 MOV R1,A ;数据传送至内部RAM 单元 INC R0 ;修改指针,指向下一数据地址 INC R1 SJMP LOOP ;循环取数第3章 MCS-51单片机指令系统和汇编语言程序示例 2比较转移指令比较转移指令 比较转移指令共有4条。这组指令是先对两个规定的操作数进行比较,根据比较的结果来决定是否转移。若两个操作
40、数相等,则不转移,程序顺序执行;若两个操作数不等,则转移。比较是进行一次减法运算,但其差值不保存,两个数的原值不受影响,而标志位要受到影响。利用标志位CY作进一步的判断,可实现三分支转移。 例例18 当从P1口输入数据为01H 时,程序继续执行,否则等待,直到P1口出现01H。参考程序如下: MOV A,#01H ;立即数01H送AWAIT: CJNE A,P1,WAIT ;(P1)01H,则等待第3章 MCS-51单片机指令系统和汇编语言程序示例 3减减1条件转移指令条件转移指令 减1条件转移指令有两条。每执行一次这种指令,就把第一操作数减1,并把结果仍保存在第一操作数中,然后判断是否为零。
41、若不为零,则转移到指定的地址单元,否则顺序执行。这组指令对于构成循环程序是十分有用的,可以指定任何一个工作寄存器或者内部RAM单元作为循环计数器。每循环一次,这种指令被执行一次,计数器就减1。预定的循环次数不到,计数器不会为0,转移执行循环操作;到达预定的循环次数,计数器就被减为0,顺序执行下一条指令,也就结束了循环。第3章 MCS-51单片机指令系统和汇编语言程序示例 例例19 将内部RAM从DATA单元开始的10个无符号数相加,相加结果送SUM单元保存。 设相加结果不超过8位二进制数,则相应的程序如下: MOV R0,#0AH ;设置循环次数 MOV R1,#DATA ;R1作地址指针,指
42、向数据块首地址 CLR A ;A清零LOOP: ADD A,R1 ;加一个数 INC R1 ;修改指针,指向下一个数 DJNZ R0,LOOP ;R0减1,不为0循环 MOV SUM,A ;存10个数相加的和第3章 MCS-51单片机指令系统和汇编语言程序示例3.7 子程序调用与返回指令子程序调用与返回指令3.7.1 子程序调用指令子程序调用指令子程序调用指令有长调用和绝对调用两条,它们都是双周期指令。第3章 MCS-51单片机指令系统和汇编语言程序示例第3章 MCS-51单片机指令系统和汇编语言程序示例 LCALL和ACALL指令类似于转移指令LJMP和AJMP,不同之处在于它们在转移前要把
43、执行完该指令的PC内容自动压入堆栈后,才将子程序入口地址addr16(或addr11)送PC,实现转移。 LCALL与LJMP一样提供16位地址,可调用64 KB范围内的子程序。由于该指令为3字节,所以执行该指令时首先应执行(PC)(PC)+3,以获得下一条指令地址,并把此时的PC内容压入堆栈(先压入低字节,后压入高字节)作为返回地址,堆栈指针SP加2指向栈顶,然后把目的地址addr16送入PC。该指令执行不影响标志位。第3章 MCS-51单片机指令系统和汇编语言程序示例 ACALL与AJMP一样提供11位地址,只能调用与PC在同一2 KB范围内的子程序。由于该指令为2字节指令,所以执行该指令
44、时应执行(PC)(PC)+2以获得下一条指令地址,并把该地址压入堆栈作为返回地址。该指令机器码的构成也与AJMP类似,只不过操作码第一字节其高半字节的最后一位是1,机器码的组成如下:a10 a9 a8 1 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0 被调用子程序的目的地址也是由执行 ACALL指令的当前PC值的高5位与指令中提供的11位直接地址形成。第3章 MCS-51单片机指令系统和汇编语言程序示例3.7.2 返回指令返回指令 返回指令共两条:一条是对应两条调用指令的子程序返回指令RET,另一条是对应从中断服务程序的返回指令RETI。第3章 MCS-51单片机指令系统和汇
45、编语言程序示例 从上述两条指令的功能操作看,都是从堆栈中弹出返回地址送PC,堆栈指针减2,但它们是两条不同的指令。其有下面两点不同: (1) 从使用上,RET指令必须作子程序的最后一条指令;RETI必须作中断服务程序的最后一条指令。 (2) RETI指令除恢复断点地址外,还恢复CPU响应中断时硬件自动保护的现场信息。执行RETI指令后,将清除中断响应时所置位的优先级状态触发器,使得已申请的同级或低级中断申请可以响应;而RET指令只能恢复返回地址。第3章 MCS-51单片机指令系统和汇编语言程序示例3.7.3 空操作指令空操作指令 NOP ;(PC)(PC)+1 空操作指令是一条单字节单周期指令
46、。它控制 CPU不做任何操作,仅仅是消耗这条指令执行所需要的一个机器周期的时间,不影响任何标志位,故称为空操作指令。NOP指令在设计延时程序、拼凑精确延时时间及在程序等待或修改程序等场合是很有用的。第3章 MCS-51单片机指令系统和汇编语言程序示例3.8 位操作类指令位操作类指令 位操作类指令在单片机指令系统中占有重要地位,这是因为单片机在控制系统中主要用于控制线路通、断,继电器的吸合与释放等。 位操作也称布尔变量操作,它是以位(bit)作为单位来进行运算和操作的。MCS-51单片机内部有一个功能相对独立的布尔处理机,它有借用进位标志CY作为位累加器,有位存储器(即位寻址区中的各位),指令系
47、统中有17条专门进行位处理的指令集。位处理指令可以完成以位为对象的数据转送、运算、控制转移等操作。第3章 MCS-51单片机指令系统和汇编语言程序示例 在位操作指令中,位地址的表示有以下不同的方法(以下均以程序状态字寄存器PSW的第5位F0标志为例说明): (1) 直接位地址表示,如D5H。 (2) 点表示(说明是什么寄存器的什么位),如PSW.5,说明是PSW的第5位。 (3) 位名称表示,如直接用F0表示。 (4) 用户定义名称表示,如用户定义用FLG这一名称来代替F0,则在指令中允许用FLG表示F0标志位。第3章 MCS-51单片机指令系统和汇编语言程序示例表3.6 条件转移指令 第3章
48、 MCS-51单片机指令系统和汇编语言程序示例 例20 利用位操作指令,模拟图3.6所示硬件逻辑电路的功能。参考程序如下: PR2: MOV C,P1.1 ;(CY) (P1.1) ORL C, P1.2 ;(CY) (P1.1) (P1.2)=AANL C,P1.0 ;(CY)(P1.0)A CPL C ;(CY)(P1.0)A=B MOV F0,C ;F0内暂存B MOV C,P1.3 ;(CY)(P1.3) ANL C,/P1.4 ;(CY)(P1.3)(P1.4)=D ORL C,F0 ;(CY)BD MOV P1.5,C ;运算结果送入P1.5 RET第3章 MCS-51单片机指令系统和汇编语言程序示例图3.6 硬件逻辑电路图