第3章 MCS-51指令系统 介绍MCS—51系列单片机的寻址方式 介绍MCS—51系列单片机的指令系统 ● 教学目标: 介绍MCS—51系列单片机的寻址方式 介绍MCS—51系列单片机的指令系统 ● 学习要求: 掌握MCS—51系列单片机6种寻址方式的定义与表达方式 掌握MCS—51系列单片机各指令的格式、功能、简单应用
3.1概述 计算机工作的基本原理是存储程序并执行程序,而程序则由能实现某种功能的指令序列构成。编写程序时使用的程序设计语言有三种:机器语言、汇编语言和高级语言。 机器语言是CPU唯一能直接识别的语言,是机器指令的集合,二进制代码书写 。用汇编语言和高级语言编制的程序称之为源程序,都要转换成机器语言程序后才能为计算机直接执行,这种用机器语言描述的程序我们通常称之为目标程序。
高级语言的特点是通用性强,可以在不同的机器上运行。用高级语言编写的程序要用编译程序或解释程序翻译成机器语言程序方能执行。 汇编语言是用助记符来表示机器指令的一种程序设计语言。其每条语句对应相应的机器指令。汇编语言与机器的指令系统密切相关,不同的机型其指令系统不同,汇编语言程序不具备高级语言的通用性,用汇编语言编写的程序要经过汇编程序(也可以手译)翻译成机器语言程序后才能为计算机所识别。 其特点是占用的内存小、执行速度快。
指令系统:一台计算机具有的所有指令的集合称为该计算机的指令系 统。 MCS—51系列单片机的指令系统共有111条指令,在储存空间与执行时 间上都有较高的效率,还含有丰富的位操作指令,成为该指令系统的 一大特色。 按其功能可分为数据传送、算术运算、逻辑运算、程序转移、位操作 等5个大类。 按指令长度:单字节指令49条、双字节指令46条、三字节指令只有16 条。 按指令执行时间:单机器周期指令64条,双机器周期指令45条,乘除2 条指令的执行时间为4个机器周期。
3.2 寻址方式 立即寻址 操作数就在指令中,跟在操作码的后面,该操作数被称为立即数。在指令中,立即数前面加“#”符号作为标志。 计算机的指令通常由操作码和操作数两部分构成。操作码部分指出了指令的功能,通常用代表该功能的英文缩写来表示;而操作数部分则可能是操作数本身或操作数所在的地址。表示指令中操作数所在位置的方法称为寻址方式。对MCS—51系列单片机,操作数可以为0~2个。不同的指令系统,具有的寻址方式也不同,相同功能的指令采用不同的寻址方式,有时可以节约空间,有时可以提高速度,寻址方式的多样化增加了指令的灵活性。MCS—51系列单片机的指令系统有6种基本的寻址方式。 立即寻址 操作数就在指令中,跟在操作码的后面,该操作数被称为立即数。在指令中,立即数前面加“#”符号作为标志。
50H 60H A 寄存器寻址 操作数在寄存器中,指令中给出寄存器名,此种方式称为寄存器寻址方 式。 寄存器间接寻址 在指令中用工作寄存器(R0、R1、DPTR)给出存储单元的地址,而操作数在RAM中(片内RAM或片外RAM),此种方式称 为寄存器间接寻址方式,指令中寄存器名前要加@。 寄存器间接寻址方式可用于访问片内RAM及片外RAM,由于片内RAM与片外RAM地址有重叠现象,故规定用MOV指令访问片 内RAM,用MOVX指令访问片外RAM 注意:访问片内RAM用工作寄存器R0、R1,访问片外RAM时,若片外RAM的地址为8位,用R0、R1间址寄存器,若片外RAM的地址多于8位用DPTR作间址寄存器。 例:MOV A,@R0 40H 若R0=40H,则指令执行后, A=50H 50H 60H A
直接寻址 在指令中直接给出操作数所在的存储单元的地址,这种方式称为直接寻址方式。直接寻址方式可用于访问程序存储器和数据存储器。在汇编语言中,直接地址也可用标号表示。 注意:1、直接寻址方式是访问专用寄存器的唯一方法 2、规定直接寻址方式只能访问片内RAM的低128个单元 3、在进行位寻址时也采用直接寻址的方式 例如:MOV A,30H 30H 指令执行后,A=56H 直接寻址方式还用于在转移及子程序调用指令中给出程序寄存器的16位或11位地址,执行这些指令后,用指令中给出的直接地址代替PC的整16位或低11位地址,然后从PC值处开始执行指令。 例:LJMP addr16; PC←addr16 ACALL addr11; PC←addr11 56H 0AH A
基址寄存器加变址寄存器间接寻址 这种寻址方式用于访问程序存储器,它以DPTR或PC计数器作为基址寄存器,以累加器A作为变址寄存器,两者之和为操作数在程序存储器中的地址。此种方式常用于查表操作。 相对寻址 相对寻址也用于访问程序存储器,常用于转移指令中,执行指令时将程序计数器PC的当前值与指令中给出的相对偏移量(rel)之和作为转移的目的地址,从此地址处开始执行指令。PC的当前值称为基地址,偏移量为1个字节的带符号数,用补码表示,转移范围为-128~+127。必须注意,基地址为PC的当前值,在转移指令进行地址计算时,PC的当前值已指向下一条指令的第一个字节。 例如:若在程序存储器2000H单元有一条双字节的无条件相对短转移指令: 2000H SJMP 05H 则在执行该指令时(PC)当前=2000H+02H=2002H,故转移目的地址为PC=2002H+05H=2007H
表3-1 操作数寻址方式及有关空间
3.3 MCS—51单片机的指令系统 MCS—51单片机的指令系统可分为5个大类: 数据传送类 算术运算类 逻辑运算类 程序转移类 位操作类
数据传送指令 数据传送类指令共有29条,可分为片内数据传送指令、片外数据传送指令、用于程序存储器传送的指令、交换指令、堆栈操作指令等 几类。 数据传送类指令 的功能: 数据传送类指令为双操作数指令,功能是将源操作数传送到目的操作数。除交换类指令外,指令执行后源操作数不变。 传送类指令一般不影响状态标志位
一、片内数据传送指令(MOV) 用立即数置数的指令 MOV A,#data; 立即数data送累加器A,A←data MOV Ri,#data; i=0、1、2、……、7, Ri←DATA MOV @Rj, #data; j=0、1, (Rj) ←data MOV direct, #data; (direct)←data ,direct为 存储器单元的地址 MOV DPTR,#data16 注意:对于MCS—51系列单片机,工作寄存器分四组,每组的工作寄存器名均为R0、R1、……、R7,执行指令时由程序状态字寄存器PSW中第四、三位(RS1、RS0)的值指定使用那一组工作寄存器,凡用到工作寄存器的指令均如此,今后不在一一说明。
MOV A, Ri; i=0、1、2、……、7, A←Ri MOV Ri, A; i=0、1、2、……、7, Ri←A MOV A,@Rj; j=0、1 , A←(Rj) MOV @Rj,A; j=0、1 , (Rj)←A。 MOV A, direct; A←(direct) MOV direct,A; (direct)←A
注意:在使用片内传送指令时,一定要注意各种寻址方式适用的存储空间,即表3-1,还应注意不同的寻址方式下传送的数据: 不以累加器A为一方的传送指令 MOV direct,Ri; (direct)←Ri MOV Ri, direct; Ri←(direct) MOV direct,@Rj ; j=0、1,(direct)←(Rj) MOV @Rj, direct, j=0、1,(Rj)←(direct) MOV direct, direct; (direct)←(direct) 注意:在使用片内传送指令时,一定要注意各种寻址方式适用的存储空间,即表3-1,还应注意不同的寻址方式下传送的数据: 例:若R0=30H,片内RAM(30H)=57H,片内RAM(40H)=7FH, 比较:MOV A,R0 和 MOV A,@R0 MOV A, #40H 和 MOV A,40H A=30H A=57H A=40H A=7FH
二、访问片外RAM的传送指令(MOVX) 1、片外RAM单元(8位地址)与累加器A之间的传送指令 MOVX A, @Rj; j=0、1,A←片外(Rj), 读 片外RAM MOVX @Rj,A ; j=0、1,片外(Rj)←A, 写 2、片外RAM(16位地址)与累加器A之间的传送指令 MOVX A,@DPTR; 读片外RAM MOVX @DPTR, A; 写片外RAM
注意:1、指令中寄存器Rj、DPTR的内容为片外RAM单元的地址,传送的是该片外RAM单元的内容。 2、MCS—51系列单片机其I/O端口是与片外RAM统一编址的,没有专门的输入输出指令,用MOV X指令可实现对I/O端口的访问,变成输入/输出指令
三、访问程序存储器的传送指令 MOVC A,@DPTR+A; A←(A+DPTR) MOVC A,@PC+A; A←(PC+A) 注意:1、以上两条指令中,DPTR+A和PC+A均为程序存储器某单元的地址,传送的是该单元的内容 2、在用PC+A计算程序存储器地址时,PC取当前值, MOVC A, @PC+A为单字节指令,在执行指令时(PC)当前=PC+1。
交换指令实现两操作数之间数据的双向传送,两操作数互为源地址与目的地址,指令执行后,两操作数的内容互换,交换指令共有5条,均以累加器为一方。 四、交换指令 交换指令实现两操作数之间数据的双向传送,两操作数互为源地址与目的地址,指令执行后,两操作数的内容互换,交换指令共有5条,均以累加器为一方。 1、某工作寄存器内容与累加器A交换指令 XCH A, Ri;i=0、1、……、7 2、某RAM单元内容与累加器交换指令 XCH A,@Rj;j=0、1 3、某片内RAM (低128字节)或专用寄存器内容与累加器交换指令 XCH A,direct 4、某片内RAM单元内容的低半字节与累加器的低半字节交换指令。 XCHD A,@Rj; j=0、1 5、累加器的高低半字节互换指令 SWAP A
五、堆栈操作指令 片内RAM的某一区域可作为堆栈使用,以保存与恢复现场。用栈顶指针寄存器SP指出堆栈的目前操作位置,堆栈操作指令有2条,进栈指令与出栈指令,堆栈遵守先进后出的原则。 进栈指令 PUSH direct; 将direct指定的片内RAM(低128字节)单元或专 用寄存器内容压栈 指令执行的过程为:SP←SP+1 (SP)←(direct) 出栈指令 POP direct; 将栈顶处内容弹到direct指定的RAM(低128字 节)某单元或某专用寄存器 指令执行的操作为:(direct)←(SP) SP←SP-1
算术运算类指令 算术运算类指令共有24条,包括4种基本的算术运算加、减、乘、除指令及1条BCD数运算调整指令,算术运算类指令会影响PSW的标志位,使用时要注意。
一、加法指令 加法指令共有8条,均以累加器A为一方,运算结果都送回累加器A,加法指令又分为不带进位加法指令与带进位位加法指令两类。 ADD A, Ri; A←A+Ri, i=0、1、2、……、7 ADD A, @Rj; A←A+(Rj), j=0、1 ADD A, direct; A←A+(direct) ADD A, #data;; A←A+data ADDC A, Ri; A←A+Ri+C, i=0、1、2、……、7 ADDC A, @Rj; A←A+(Rj)+C, j=0、1 ADDC A, direct; A←A+(direct)+C ADDC A, #data; A←A+data+C
例如:设A=78H、R1=64H ,分析执行指令ADD A,R1后对PSW中标志位的影响。 78H 01111000 注意:1、加法类指令执行后会影响程序状态字中的标志位C、AC、OV及P。其中常用的是进位标志C,当C=1时,表示相加时产生了进位,C也是无符号相加的溢出标志。带符号数溢出的标志是OV,当最高位与次高位不同时进位时,OV=1,表示带符号数的相加发生了溢出。辅助进位标志AC在进行BCD码相加调整时有用。 例如:设A=78H、R1=64H ,分析执行指令ADD A,R1后对PSW中标志位的影响。 78H 01111000 +64H 01100100 —————————— 11011100 执行后,C=0、AC=0,次高位有进位但最高位无进位,故OV=0⊕1=1
从C与OV来看,由于C=0,因此当把78H与64H为无符号数时,此两数相加没有发生溢出;但若78H与64H 为带符号数,此时OV=1,说明发生了溢出,结果是错误的(两正数相加,和是负数)。从上述例子可以看出,判断无符号数相加溢出与判断带 符号数相加溢出要用不同的标志位。 2、带进位位加法指令主要用于多字节数相加时,加法指令只能直接进行8位数的运算,在进行多字节数相加时,从低字节开始,依次相加,最低字节的相加用ADD指令,而其它高位字节的相加要用ADDC指令
例:设2个16位无符号数分别存在从30H及40H开始的RAM单元中,低字节在低地址,高字节在高地址,编程将其相加,结果存入从40H开始的单元中。 CLR C; 清进位位 MOV A,30H; A←(30H) MOV R0,#40H ADD A, @R0; 计算低字节之和, A←A+(40H) MOV @R0, A; 存低字节之和 MOV A,31H; A←(31H) INC R0 ADDC A, @R0; 计算高字节之和,A←A+(41H) MOV @R0,A; 存高字节之和
二、减法指令 与加法指令相同,减法指令亦以累加器A为一方(被减数),相减的结果均送回累加器A,但减法指令只有4条,均为带进(借)位相减指令,因此,在进行减法运算时应先将进位位清零。 减法指令也会影响标志位: 两操作数够减时,C=0,不够减时产生借位,C=1;低半字节够减时AC=0,不够减时 AC=1;当最高位与次高位不同时有借位时,OV=1,表示带符号数相减发生了溢出 带进位位减法指令主要用于多字节数相减 SUBB A,@Rj; A←A–(Rj)–C,j=0、1 SUBB A,direct; A←A–(direct)–C, SUBB A,#data; A←A–data–C
三、加1指令 MCS—51系列单片机共有5条加1指令,加1指令执行后不影响标志位。 在第4条指令中,若直接地址为I/0端口地址:80H、90H、AOH、BOH,则对该端口进行读—修改—写操作,后面的DEC(减1)ANL(与)、OR(或)、XRL(异或)、DJNZ(减1不加转移指令)及位操作指令均具有对I/O端口进行读—修改—写的功能,今后不再一一作特别说明。 INC A; A←A+1 INC Ri; Ri← Ri+1 ,i=0、1、2、……、7 INC @Ri; (Ri)←(Ri)+1,j=0、1 INC direct; (direct)←(direct)+1 INC DPTR; DPTR←DPRT+1
四、减1指令 减1指令有4条,与加1指令中的前4条相对应,减1指令执行后也不影响标志位。 DEC A; A←A-1 DEC Ri; Ri←Ri-1,i=0,1,2,…,7 DEC @Rj; (Rj)←(Rj)-1,j=0,1 DEC direct; (direct)←(direct)-1
五、乘法指令与除法指令 乘法指令 MUL AB 该指令实现放在累加器A与寄存器B中的两个无符号数相乘,乘积为16位,高8位积在A中,低8位积在B中。若积大于255,则OV=1,否则OV=0,而C始终为0。 除法指令 DIV AB 除法指令实现两个8位的无符号数相除,其中被除数在累加器A中,除数在寄存器B中,结果商在A中,余数在B中。指令执行后,进位标志C、溢出标志OV均为0,但除数为0时,OV=1。
六、十进制调整指令DA A DA A 的功能:对BCD码加法运算结果进行调整 调整的方法:当累加器A的低半字节的值>9或AC=1,时低半字节加6;当高半字节>9或C=1时,高半字节加6,进行加6调整后可得到BCD数的加法运算的正确结果。 例:若A=(25)BCD 而Ri=(39)BCD 则:ADD A, Ri; A=5EH DA A; A=(64)BCD 执行的过程为: 2 5 H + 3 9 H 5 E H ……加法运算的结果 + 0 6 H ……调整 6 4 H ……调整后的结果
逻辑运算类指令 逻辑运算类指令共有24条,包括与、或、异或、清零、求反及移位指令。当目的操作数为累加器A时会影响奇偶标志位P,带进位的移位指令会影响C,除此之外,逻辑运算类指令不影响程序状态PSW。
一、与(ANL)、或(ORL)、异或(XRL)指令 与指令、或指令、异或指令各有相对应的6条。 1、 与指令 与指令常用于使操作数的某些位(与0相与)清零而使另外的一些位(与1相与)保持不变。 ANL A,Ri; A←A∧Ri, i=0,1,……,7 ANL A,@Rj; A←A∧(Rj), j=0,1。 ANL A,direct; A←A∧(direct) ANL direct, A; (direct)←(direct)∧A ANL A,#data; A←A∧tata ANL direct, #data; (direct)←(direct)∧A
2、或指令 或指令用于使操作数的某些位置1(与1相或)而另一些位保持不变(与0相或)。 ORL A,Ri; A←AVRi,i=0,1,2, ……,7 ORL A,@Rj; A←AV(Rj), j=0,1 ORL A,direct; A←AV(direct) ORL direct,A; (direct)←(direct)VA ORL A,#data; A←AV data ORL direct, #data; (direct) ← (direct)∨data
3、异或指令 异或指令可使操作数的某些位按位取反(与1异或)而使其它位保持不变(与0异或)。 XRL A,Ri; A ←A⊕Ri,i=0,1,2, ……,7 XRL A,@Rj; A←A⊕(Rj),j=0,1 XRL A,direct; A← A⊕(direct) XRL direct,A;(direct) ←(direct) ⊕A XRL A,#data; A←A⊕data XRL direct,#data; (direct) ←(direct) ⊕data
二、累加器A清零与取反指令 MCS-51系列单片机的指令系统中专门对累加器A设置了清零和取反指令: CPL A; 累加器内容取反后→A CLR A; 将累加器清零。
三、移位指令 移位指令共有4条,均以累加器A的内容为操作数,可实现累加器A的内容向左或向右环移1位,带进位位向左或向右环移1位。 1、累加器内容向左环移1位 RL A 2、累加器A内容向右环移1位 RR A 3、累加器A内容带进位位向左环移1位 RLC A 4、累加器A内容带进位向右环移1位 RRC A c c
程序转移类指令 控制程序转移指令又有绝对转移与相对转移指令之分,所谓绝对转移,是指指令中给出的是直接地址(addre16或addr11),转移指令执行后,程序转移到指令中给出的直接地址处开始执行;而相对转移指的是指令中给出的相对地址是1个带符号的用补码表示的8位的偏移量(rel),其转移的范围为当前地址-128 ~ +127,转移指令执行时,首先要根据当前的PC值和位移量计算转移的目的地址,然后从目的地址处开始执行,位移量为负时向小地址端转移,位移量为正时向大地址端转移。条件转移类指令均属于相对转移指令。
一、无条件转移指令 长转移指令 LJMP addr16 指令执行的操作为 PC←PC+3 PC←addr16 转移的范围为216,即64KB地址空间 绝对转移指令 AJMP addr11 指令执行的操作为 PC←PC+2 PC10~0←addr11 指令执行后用指令中的11位地址取代PC计数器的低11位,PC的高5位不变,从新的PC处开始执行指令 转移的范围为211,即2KB地址空间
PC+2为执行此指令时PC的当前值,rel是用8位的补码表示的位 移量 相对转移指令 SJMP rel 指令执行的操作为: PC←PC+2+rel PC+2为执行此指令时PC的当前值,rel是用8位的补码表示的位 移量 转移的范围为当前地址-128 ~ +127 相对长转移指令 JMP A+@DPTR 指令执行的操作为: PC← A+@DPTR 相对长转移指令又称散转指令,用相对长转移指令实现散转的方法见下例:
例:设计一散转程序,可实现当DATA=0、2、4时分别转移到100H,200H、300H处。 指令序列如下: MOV A,#data MOV DPTR,#TABLE JMP @A+DPTR TABLE: AJMP 100H AJMP 200H AJMP 300H 当DATA=0时,A+DPTR=TABLE,故执行指令AJMP 100H,转移到100H处开始执行指令; 当DATA=2时,A+DPTR=TABLE+2,故执行指令AJMP 200H,转移到200H处开始执行指令; 同理可实现其他的转移。 注意:相对长转移指令为双字节指令,故A必须为偶数。
二、条件转移指令 条件转移指令均属于相对转移指令,在机器码中给出的是转移的8位位移量。在转移指令中均包含有转移条件,当条件满足时,则程序发生转移,当条件不满足时,继续顺序执行程序。条件转移指令共有8条。 1、累加器内容到零转移指令 JZ rel; A=0转移 JNZ rel; A≠0转移 转移目的地址PC=PC+2+rel
2、 比较转移指令 CJNE A,#data, rel CJNE Ri,#data, rel CJNE @Rj,#data, rel CJNE A,direct,rel 以上4条指令均为比较转移指令,指令执行时首先将两操作数比较: 若目的操作数=源操作数,不转移,向下顺序执行; 若目的操作数>源操作数,则C=0,转移; 若目的操作数<源操作数,则C=1,转移。 转移的目的地址PC=PC+3+rel 例如:编写指令序列:当P1口内容为80H时程序才向下执行,否则处于等待状态。程序如下: MOV A,#80H LOOP:CJNE A,P1,LOOP ┆
3、减1条件转移指令 DJNZ Ri,rel; Ri ←Ri-1,Ri≠0时转移 目的地址PC=PC+2+rel DJNZ direct,rel; (direct)←(direct)-1,(direct)≠0时转移 目的地址PC==PC+3+rel 以上两条指令可用于控制循环操作; 例:从P1.7引脚输出5个周期的方波的指令序列如下: MOV R2,#10; 设定输出方波数 LOOP;CPL P1.7; P1.7引脚信号取反 DJNZ R2,LOOP; 若R2-1≠0则继续输出 CONT: ┆ P1.7引脚上的输出波形如下图: 问:该方波的周期为多少?如何修改?
三、子程序调用指令 SP←SP+1 (SP) ←PC7~0 (SP) ←PC15~8 PC←addr16 在进行程序设计时,比较好的方法是采用模块化的设计,将某些功能程序编成子程序的形式供主程序调用,这样可使复杂的程序结构清晰,修改方便,子程序的调用与返回指令共有4条: 1、长调用指令 LCALL addr16 该条指令实际执行的操作为: PC←PC+3 SP←SP+1 (SP) ←PC7~0 (SP) ←PC15~8 PC←addr16 指令中的addr16为子程序的入口地址,执行指令后,PC=addr16,开始执行子程序, 为了在子程序执行完毕后能正确返回主程序,用堆栈保护返回主程序 返回地址。
2、绝对调用指令 ACALL addr11 指令执行的操作类似于绝对转移指令,即: PC←PC+2 SP←SP+1 (SP) ←PC7~0 (SP) ←PC15~8 PC10~0←addr11 这是一条双字节的指令,当前PC的高5位加上addr11(低11位)为子程序的入口地址,其寻址范围为2KB的地址空间,
3、返回指令 RET RET为每个子程序的最后一条指令RET,在执行返回指令时,将原先压栈的断点出栈,从而实现返回主程序,并从原断点处重新执行主程序。 指令执行的操作为: PC15~8←(SP) SP←SP-1 PC7~0←(SP)
4、中断返回指令 RETI CPU响应中断后执行的中断服务程序也存在返回主程序的问题,在中断服务程序中用RETI返回主程序。RETI也具有恢复断点的功能,与RET类似,除此之外,它还会清除“优先级激活”触发器,以重新开放同级或低级的中断申请。 注意:在调用子程序和执行中断服务程序时都需要用到堆栈,单片机上电复位后,SP=07H,堆栈区域与工作寄存器区重叠,应注意修改堆栈指针。
四、空操作指令 NOP 该指令不执行任何操作,主要用于设计延时程序,为便于程序的修改,我们也会在程序的某些位置插入一些NOP指令,以便于将来添加指令
布尔操作类指令 MCS---51系列单片机的硬件结构中有1个位处理机(又称布尔处理机),并设有一个执行位操作的指令集,包括位传送、位逻辑运算、位转移等几类指令,使单片机很适宜于位处理任务重、逻辑运算多的场合。 位操作指令是以位地址与进位位C为操作数。MCS—51系列单片机中可进行寻址的有片内RAM20H~2FH中连续的128位及专用寄存器中的可寻址位。 汇编语言中位地址的表示方法有多种形式, (1)、直接位地址方式:如20H单元的D7位可表示07H (2)、点操作符号方式: 如P1口的第0位可表示为P1.0 (3)、位名称方式: 如直接使用RS1、RS0作位地址 (4)、用户自定义名方式:如用伪指令进行定义 VS bit F0;可用VS 代替F0寻址。
一、位传送与位逻辑运算指令 MOV bit,C; bit←C CLR C; C←0 CLR bit; bit←0 CPL C; 取反 CC MOV C,bit; C←bit MOV bit,C; bit←C CLR C; C←0 CLR bit; bit←0 CPL C; 取反 CC CPL bit; 取反 bit←bit SETB C; C←1 SETB bit ; bit←1 ANL C, bit ; C←C∧bit ANL C,/bit; C←C∧bit ORL C,bit; C←C∨bit ORL C,/bit; C←C∨bit 指令中斜线表示在运算时对bit取反,但不修改 bit的值。
二、位转移指令 JC rel; C=1 转移,否则继续执行 JNC rel; C=0 转移,否则继续执行 JB bit,rel; bit=1 转移,否则继续执行 JNB bit,rel; bit=0 转移,否则继续 JBC bit,rel ; bit=1 转移,且bit←0,否则继续向 下执行 例:若P1.7的信号为0转移到key-scan子程序,若P1.7为1,则继续等待的指令程序如下: wait:JNB P1.7,key-scan SJMP wait
编程统计片内RAM30H开始的20个带符号数中负数的个数,结果存入 50H单元。 程序如下: MOV R2,#20 ; 置循环次数放R2 MOV R3, #0 MOV R0, #30H; 首单元地址放R0 LOOP:MOV A,@R0; 取数至A RLC A; 带进位向左环移1位 JNC L1; C=0 时(非负数)转L1,修改R0 取下一个数 INC R3; C=1,负数,统计,R3←R3+1 L1:INC R0 DJNZ R2,LOOP; R2←R2-1 若R2≠0继续循环 MOV 50H,R3 RET
小 结 本章介绍MCS—51系列单片机的指令系统,是汇编语言程序设计的基础,对每一条指令应掌握其功能、格式及适用的寻址方式。 小 结 本章介绍MCS—51系列单片机的指令系统,是汇编语言程序设计的基础,对每一条指令应掌握其功能、格式及适用的寻址方式。 MCS—51系列单片机的指令系统的指令按长度可分为单字节指令、双字节指令、三字节指令;按指令周期可分为单机器周期指令、双机器周期指令、4个周期指令,含有立即寻址、寄存器寻址、直接寻址、寄存器间接寻址、基址加变址寻址、相对寻址六种基本的寻址方式,具有丰富的位操作指令,对位的寻址均采用直接寻址方式。 学习指令系统时,对于传送类指令,要注意访问程序存储器、片内数据存储器(RAM区和专用寄存器区)、片外数据存储器时指令与寻址方式的区别。对运算类指令注意指令执行后对程序状态字的影响。对控制转移类指令,要注意转移的条件、转移的目的地址、转移的范围。
思考题与习题三 1 MCS—51系列单片机有几种寻址方式?各举一例。 2 对51子系列与52子系列,分别说明片内RAM与专用寄存器的寻址方式。 3 分析下列各组指令的不同功能: ⑴MOV A, #30H 与MOV A, 30H ⑵MOV A, R0与MOV A, @R0 ⑶MOV A, DIRECT 与MOV A, @R0 ⑷MOV A, @R0与MOVX A, @R0 ⑸MOVX A, @DPTR 与MOVC A, @A+DPTR 4 试编写指令序列将片内数据存储器30H单元中的内容送片外RAM3000H单元。 5 编程将片内数据存储器30H单元中的内容与片外RAM30H单元的内容交换。
6 设A=76H,R0=30H,片内(30H)=48H,(P1)=C7H,SP=50H,分析独立执行下列指令后的结果: ⑴MOV A, R0 ⑵MOV A,@R0 ⑶MOV A, #30H ⑷MOV A, 30H ⑸MOVX @R0, A ⑹MOV 80H, #22H ⑺PUSH A ⑻XCH A, R0 ⑼SWAP A ⑽XCHD A, @R0 7 已知:A=38H,R1=37H,B=04H,C=1,片内RAM(37H)=C5H,(P1)=49H,分别写出下列指令执行后的结果(包括状态位): ⑴ADD A, @R1 ⑵ADDC A, 37H
⑶SUBB A, #20H ⑷INC R1 ⑸DEC 37H ⑹MUL AB ⑺DIV AB ⑻ADD A, #30H DA A ⑼ANL A, #0FH ⑽ORL A, #0FH ⑾XRL A, #OFH 8 编程将片外RAM30H、31H和32H、33H中的2个16位的无符号数相减(高字节在高地址单元),结果存入片外RAM30H、31H单元。 9 请用3种方法将累加器A中的无符号数乘2。 10 用逻辑运算指令实现如下操作,但不得改变其他位: ⑴将累加器A的最高位置1 ⑵将累加器A的高4位清0 ⑶清除累加器A的A.6、A.5、A.4、A.3 ⑷将累加器A的A.5、A.4取反
12 条件转移指令的转移范围是多少?举例说明怎样计算转移的目的地址 13 比较RET 与 RETI 的异同。 14 NOP指令有何用途? 11 简述LJMP AA 与 AJMP AA的区别。 12 条件转移指令的转移范围是多少?举例说明怎样计算转移的目的地址 13 比较RET 与 RETI 的异同。 14 NOP指令有何用途? 15 MCS—51系列单片机的直接寻址位有几种表示方法?各举一例。 16 用位操作指令实现如下逻辑表达式: ⑴P1.0=P2.0•(P2.1+P2.2)+P2.3 ⑵P1.7=P2.0•P2.1+A.6⊕(P3.1+P3.2) 17 编程将片内RAM30H单元开始的20个数传送到片外RAM3000H开始的单元中。 18 在片内RAM20H开始的单元中存有20个无符号数,编程求出其中的最大值,存入片外RAM50H单元。 19 编程计算存放在片外RAM30H单元开始的64个无符号数的平均值,结果存入片内RAM30H单元。
20 设计一查表程序,将从P0口接收的1位16进制数转化为LED的段选码后从P1口输出。 21 设在片外RAM0000H开始的单元中存有100个有符号数,编程统计其中的正数、负数和零的个数,结果存入片内RAM30H、31H、32H。 22 从片内RAM30H单元开始的存有5个组合BCD数,编程将其转化为ASCII后存入片内RAM40H开始的单元中。