第3章 MCS-51指令系统 3.1 简 介 3.1.1 指令概述 一台微机所具有的所有指令的集合,就构成了指令系统。指令系统越丰富,说明CPU的功能越强。例如,Z80 CPU中,没有乘法和除法指令,乘法和除法运算必须用软件来实现,因此执行速度相对较慢;而MCS-51单片机提供了乘法和除法指令,实现乘法和除法运算时就要快得多。
一台微机能执行什么样的操作,是在微机设计时确定的。一条指令对应着一种基本操作。由于计算机只能识别二进制数,所以指令也必须用二进制形式来表示,称为指令的机器码或机器指令。 MCS-51单片机指令系统共有33种功能,42种助记符,111条指令。
3.1.2 指令格式 在实训中看到,不同指令翻译成机器码后字节数也不一定相同。按照机器码个数,指令可以分为以下三种:
MCS-51单片机指令系统包括49条单字节指令、46条双字节指令和16条三字节指令。 采用助记符表示的汇编语言指令格式如下: 标号是程序员根据编程需要给指令设定的符号地址,可有可无;标号由1~8个字符组成,第一个字符必须是英文字,不能是数字或其它符号;标号后必须用冒号。
操作码表示指令的操作种类,如MOV表示数据传送操作,ADD表示加法操作等。 操作数或操作数地址表示参加运算的数据或数据的有效地址。操作数一般有以下几种形式:没有操作数项,操作数隐含在操作码中,如RET指令;只有一个操作数,如CPL A指令;有两个操作数,如MOV A,#00H指令,操作数之间以逗号相隔;有三个操作数,如CJNE A,#00H,NEXT指令,操作数之间也以逗号相隔。 注释是对指令的解释说明,用以提高程序的可读性;注释前必须加分号。
3.2 寻 址 方 式 操作数是指令的重要组成部分,指出了参与操作的数据或数据的地址。寻找操作数地址的方式称为寻址方式。一条指令采用什么样的寻址方式,是由指令的功能决定的。寻址方式越多,指令功能就越强。 MCS-51指令系统共使用了7种寻址方式,包括寄存器寻址、直接寻址、立即数寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址等。实训中,我们初步接触了寄存器寻址、立即数寻址、直接寻址和寄存器间接寻址等4种寻址方式。
1. 寄存器寻址 寄存器寻址是指将操作数存放于寄存器中,寄存器包括工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR等。例如,指令MOV R1,A的操作是把累加器A中的数据传送到寄存器R1中,其操作数存放在累加器A中,所以寻址方式为寄存器寻址。 如果程序状态寄存器PSW的RS1RS0=01(选中第二组工作寄存器,对应地址为08H~0FH),设累加器A的内容为20H,则执行MOV R1,A指令后,内部RAM 09H单元的值就变为20H,如图3.1所示。
实训3中,采用寄存器寻址的指令如下: MOV P1,A ;将累加器A的内容送 到P1口 MOV P1,R4 ;将寄存器R4的内容送到P1口 CLR A ;将累加器A清0 CPL A ;将累加器A中的内容取反 RL A ;将累加器A的内容循环左移
图3.1 寄存器寻址示意图
图3.2 直接寻址示意图
2. 直接寻址 直接寻址是指把存放操作数的内存单元的地址直接写在指令中。在MCS-51单片机中,可以直接寻址的存储器主要有内部RAM区和特殊功能寄存器SFR区。 例如,指令MOV A,3AH执行的操作是将内部RAM 中地址为3AH的单元内容传送到累加器A中,其操作数3AH就是存放数据的单元地址,因此该指令是直接寻址。 设内部RAM 3AH单元的内容是88H,那么指令MOV A,3AH的执行过程如图3.2所示。
实训3中,采用直接寻址的指令如下: MOV P1,20H ;将20H单元的内容传送到P1口 3. 立即数寻址 立即数寻址是指将操作数直接写在指令中。 例如,指令MOV A,#3AH执行的操作是将立即数3AH送到累加器A中,该指令就是立即数寻址。注意:立即数前面必须加“#”号,以区别立即数和直接地址。该指令的执行过程如图3.3所示。
图3.3 立即数寻址示意图
实训3中,采用立即数寻址的指令如下: MOV P1,#55H ;将立即数55H送P1口 MOV 20H,#55 ;将立即数55H送20H 单元 MOV A,#0F0H ;将立即数0F0H送累加器A MOV R4,#0FH ;将立即数0FH送寄存器R4中 MOV R0,#20H ;将立即数20H送寄存器R0口
AND A,#0FH ;累加器A的内容与立即数0FH进行逻辑与操作 OR A,#0F0H ;累加器A的内容与立即数0F0H进行逻辑或操作 MOV A,#01H ;将立即数01H送累加器A中 MOV A,#55H ;将立即数55H送累加器A中
4. 寄存器间接寻址 寄存器间接寻址是指将存放操作数的内存单元的地址放在寄存器中,指令中只给出该寄存器。执行指令时,首先根据寄存器的内容,找到所需要的操作数地址,再由该地址找到操作数并完成相应操作。 在MCS-51指令系统中,用于寄存器间接寻址的寄存器有R0、R1和DPTR,称为寄存器间接寻址寄存器。 注意:间接寻址寄存器前面必须加上符号“@”。例如,指令MOV A,@R0执行的操作是将R0的内容作为内部RAM的地址,再将该地址单元中的内容取出来送到累加器A中。
设R0=3AH,内部RAM 3AH中的值是65H,则指令 MOV A,@R0的执行结果是累加器A的值为65H,该指令的执 行过程如图3.4所示。 实训3中,采用寄存器间接寻址的指令如下: MOV P1,@R0 ;将R0所指的存 储 单元的内容送P1口
图3.4 寄存器间接寻址示意图
5. 变址寻址 变址寻址是指将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作。 例如,指令MOVC A,@A+DPTR执行的操作是将累加器A和基址寄存器DPTR的内容相加,相加结果作为操作数存放的地址,再将操作数取出来送到累加器A中。 设累加器A=02H,DPTR=0300H,外部ROM中,0302H单元的内容是55H,则指令MOVC A,@A+DPTR的执行结果是累加器A的内容为55H。该指令的执行过程如图3.5所示。
图3.5 变址寻址示意图
6. 相对寻址 相对寻址是指程序计数器PC的当前内容与指令中的操作数相加,其结果作为跳转指令的转移地址(也称目的地址)。该类寻址方式主要用于跳转指令。 例如,指令SJMP 54H执行的操作是将PC当前的内容与54H相加,结果再送回PC中,成为下一条将要执行指令的地址。 设指令SJMP 54H的机器码80H 54H存放在2000H处,当执行到该指令时,先从2000H和2001H单元取出指令,PC自动变为2002H;再把PC的内容与操作数54H相加,形成目标地址2056H,再送回PC,使得程序跳转到2056H单元继续执行。该指令的执行过程如图3.6所示。
图3.6 相对寻址示意图
7. 位寻址 位寻址是指按位进行的寻址操作,而上述介绍的指令都是按字节进行的寻址操作。MCS-51单片机中,操作数不仅可以按字节为单位进行操作,也可以按位进行操作。当我们把某一位作为操作数时,这个操作数的地址称为位地址。 位寻址区包括专门安排在内部RAM中的两个区域:一是内部RAM的位寻址区,地址范围是20H~2FH,共16个RAM单元,位地址为00H~7FH;二是特殊功能寄存器SFR中有11个寄存器可以位寻址,参见有关章节中位地址定义。
例如,指令SETB 3DH执行的操作是将内部RAM位寻址区中的3DH位置1。 设内部RAM 27H单元的内容是00H,执行SETB 3DH后,由于3DH对应内部RAM 27H的第5位,因此该位变为1,也就是27H单元的内容变为20H。该指令的执行过程如图3.7所示。
图3.7 位寻址示意图
3.3 指 令 系 统 MCS-51单片机指令系统包括111条指令,按功能可以划分为以下5类 数据传送指令(29条) 算术运算指令(24条) 3.3 指 令 系 统 MCS-51单片机指令系统包括111条指令,按功能可以划分为以下5类 数据传送指令(29条) 算术运算指令(24条) 逻辑运算指令(24条) 控制转移指令(17条) 位操作指令(17条)
3.3.1 指令系统中的符号说明 指令的书写必须遵守一定的规则,为了叙述方便,我们采用表3.2的约定。 表3.2 指令描述约定 符 号 3.3.1 指令系统中的符号说明 指令的书写必须遵守一定的规则,为了叙述方便,我们采用表3.2的约定。 表3.2 指令描述约定 符 号 含 义 Rn 表示当前选定寄存器组的工作寄存器R0~R7 Ri 表示作为间接寻址的地址指针R0~R1 #data 表示8位立即数,即00H~FFH #data16 表示16位立即数,即0000H~FFFFH addr16 表示16位地址,用于64K范围内寻址 addr11 表示11位地址,用于2K范围内寻址 direct 8位直接地址,可以是内部RAM区的某一单元或某一专用功能寄存器的地址 Rel 带符号的8位偏移量(-128~+127) Bit 位寻址区的直接寻址位 (X) X地址单元中的内容,或X作为间接寻址寄存器时所指单元的内容 ← 将 ← 后面的内容传送到前面去
3.3.2 数据传送类指令 数据传送指令是MCS-51单片机汇编语言程序设计中使用最频繁的指令,包括内部 RAM、寄存器、外部RAM以及程序存储器之间的数据传送。 数据传送操作是指把数据从源地址传送到目的地址,源地址内容不变。 目的地址 源地址 数 据
内部8位数据传送指令共15条,主要用于MCS-51单片机内部RAM与寄存器之间的数据传送。指令基本格式: 1. 内部8位数据传送指令(15条) 内部8位数据传送指令共15条,主要用于MCS-51单片机内部RAM与寄存器之间的数据传送。指令基本格式: MOV <目的操作数>,<源操作数> 1) 以累加器A为目的地址的传送指令(4条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV A,Rn 11101rrr A(Rn) n=0~7, rrr=000~111 1 MOV A,direct 11100101 direct A (direct) MOV A,@Ri 1110011i A ((Ri)) i=0,1 MOV A,#data 01110100 data A #data
注意:以上传送指令的结果均影响程序状态字寄存器PSW的P标志。 例3.1 已知相应单元的内容如下,请指出每条指令执行后相应单元内容的变化。 例3.1 已知相应单元的内容如下,请指出每条指令执行后相应单元内容的变化。 累加器A 40H 寄存器R0 50H 内部RAM:40H 30H 内部RAM:50H 10H
(1) MOV A,#20H (2) MOV A,40H (3) MOV A,R0 (4) MOV A,@R0 解:(1) MOV A,#20H执行后A=20H。 (2) MOV A,40H执行后A=30H。 (3) MOV A,R0执行后A=50H。 (4) MOV A,@R0执行后A=10H。
2) 以Rn为目的地址的传送指令(3条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV Rn,A 11111rrr n=0~7, rrr=000~111 1 MOV Rn,direct 10101rrr direct Rn (direct) MOV Rn,#data 01111rrr data Rn #data
注意:以上传送指令的结果不影响程序状态字寄存器PSW标志。 3) 以直接地址为目的地址的传送指令(5条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV direct,A 11111010 direct (direct) A 1 MOV direct,Rn 10001rrr direct (direct )Rn n=0~7, rrr=000~111 MOV direct2,direct1 10000101 direct1 direct2 (direct2) direct1 2 MOV direct,@Ri 1000011i direct (direct )(Ri) i=0,1 MOV direct,#data 01110101 direct data (direct)#data
注意:以上传送指令的结果不影响程序状态字寄存器PSW标志。 4) 以寄存器间接地址为目的地址的传送指令(3条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV @Ri,A 1111011i (Ri)A i=0,1 1 MOV @Ri,direct 1110011i direct ((Ri)) (direct) 2 MOV @Ri,#data 0111010i data (Ri)#data
注意:以上传送指令的结果不影响程序状态字寄存器PSW标志。 例3.2 已知相应单元的内容如下,请指出下列指令执行后各单元内容相应的变化。 例3.2 已知相应单元的内容如下,请指出下列指令执行后各单元内容相应的变化。 寄存器R0 50H 寄存器R1 66H 寄存器R6 30H 内部RAM:50H 60H 内部RAM:66H 45H 内部RAM:70H 40H
(1) MOV A,R6 (2) MOV R6,70H (3) MOV 70H,50H (4) MOV 40H,@R0 (5) MOV @R1,#88H 解:(1) MOV A,R6执行后A=30H。 (2) MOV R6,70H执行后R6=40H。 (3) MOV 70H,50H执行后(70H)=60H。 (4) MOV 40H,@R0执行后(40H)=60H。 (5) MOV @R1,#88H执行后(66H)=88H。
2. 16位 数据传送指令(1条) #data16 入数据指针 助记符格式 机器码(B) 相应操作 指令说明 机器周期 2. 16位 数据传送指令(1条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV DPTR,#data16 10010000 data15~8 data7~0 (DPTR) #data16 把16位常数装入数据指针 2 #data16 入数据指针
注意:以上指令结果不影响程序状态字寄存器PSW标志。 3. 外部数据传送指令(4条) 助记符格式 机器码(B) 相应操作 指令说明 机器 周期 MOVX A,@DPTR 11100000 A((DPTR)) 把DPTR所对应的外部RAM地址中的内容传送给累加器A 2 MOVX A,@Ri 1110001i A ((Ri)) i=0,1 MOVX @DPTR,A 11110000 ((DPTR)) A 结果不影响P标志 MOVX @Ri,A ((Ri)) A i=0,1,结果不影响P标志
注意:① 外部RAM只能通过累加器A进行数据传送。 ② 累加器A与外部RAM之间传送数据时只能间接寻址方式,间接寻址寄存器为DPTR,R0,R1。 ③ 以上传送指令结果通常影响程序状态字寄存器PSW的P标志。 例3.3 把外部数据存储器2040H单元中的数据传送到外部数据存储器2560H单元中去。
解:MOV DPTR,#2040H MOVX A,@DPTR ;先将2040H单元的内容传送到累加器A中 MOV DPTR,#2560H MOVX @DPTR,A ;再将累加器A中的内容传送到2560H单元中
4. 交换和查表类指令(9条) 1) 字节交换指令(3条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 XCH A,Rn 11001rrr ARn A与Rn内容互换 1 XCH A,direct 11000101 direct A(direct) XCH A,@Ri 1100011i A((Ri)) i=0,1
注意:以上指令结果影响程序状态字寄存器PSW的P标志。 2) 半字节交换指令(1条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 XCHD A,@Ri 1101011i A3~0(Ri)3~0 低4位交换,高4位不变 1 注意:上面指令结果影响程序状态字寄存器PSW的P标志。
3) 累加器A中高4位和低4位交换(1条) 注意:上面指令结果不影响程序状态字寄存器PSW标志。 助记符格式 机器码(B) 相应操作 指令说明 机器周期 SWAP A 11000100 A 3~0A7~4 高、低4位互相交换 1 注意:上面指令结果不影响程序状态字寄存器PSW标志。 例3.4 设内部数据存储区2AH、2BH单元中连续存放有4个BCD码(1个BCD码占 a3 a2 a1 a0 a0 a1 a2 a3 2AH 2BH 2AH 2BH
解:MOV R0,#2AH ;将立即数2AH传送到寄存器R0中 MOV A,@R0 ;将2AH单元的内容传送到累加器A中 SWAP A ;将累加器A中的高4位与 低4位交换 MOV @R0,A ;将累加器A的内容传送到2AH单元中 MOV R1,#2BH
MOV A,@R1 ;将2BH单元的内容传送到累加器A中 SWAP A ;将累加器A中的高4位与低4位交换 XCH A,@R0 ;将累加器A中的内容与2AH单元的内容交换 MOV @R1,A ;累加器A的内容传送到2BH单元
注意:① 以上指令结果影响程序状态字寄存器PSW的P标志。 ② 查表指令用于查找存放在程序存储器中的表格。 4) 查表指令(2条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOVC A,@A+PC 10000011 A ((A+PC) A+PC所指外部程序存储单元的值送A 2 MOVC A,@A+DPTR 10010011 A((A+DPTR)) A+DPTR所指外部程序存储单元的值送A 注意:① 以上指令结果影响程序状态字寄存器PSW的P标志。 ② 查表指令用于查找存放在程序存储器中的表格。
注意:① 堆栈是用户自己设定的内部RAM中的一块专用存储区,使用时一定先设堆栈指针,堆栈指针缺省为SP=07H。 5) 堆栈操作指令(2条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 PUSH direct 11000000 direct SPSP+1 (SP)(direct) 将SP加1,然后将源地址单元中的数传送到SP所指示的单元中去 2 POP direct 11010000 (direct) (SP) SPSP-1 将SP所指示的单元中的数传送到direct地址单元中,然后SPSP-1 注意:① 堆栈是用户自己设定的内部RAM中的一块专用存储区,使用时一定先设堆栈指针,堆栈指针缺省为SP=07H。
② 堆栈遵循后进先出的原则安排数据。 ③ 堆栈操作必须是字节操作,且只能直接寻址。将累加器A入栈、出栈指令可以写成: PUSH/POP ACC 或 PUSH/POP 0E0H 而不能写成: PUSH/POP A ④ 堆栈通常用于临时保护数据及子程序调用时保护现场和恢复现场。 ⑤ 以上指令结果不影响程序状态字寄存器PSW标志。
例3.5 设堆栈指针为30H,把累加器A和DPTR中的内容压入,然后根据需要再把它们弹出,编写实现该功能的程序段。 解:MOV SP,#30H ;设置堆栈指针,SP=30H为栈底地址 PUSH ACC ;SP+1→SP,SP=31H,ACC →(SP) PUSH DPH ;SP+1→SP,SP=32H,DPH →(SP)
PUSH DPL ;SP+1→SP,SP=33H,DPL →(SP) … POP DPL ;(SP)→DPL,SP-SP,SP=32H POP DPH ;(SP)→DPH,SP-SP,SP=31H POP ACC ;(SP)→ACC,SP-SP,SP=30H
3.3.3 算术运算类指令 1. 加、减法指令(22条) 1) 加法指令(8条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 3.3.3 算术运算类指令 1. 加、减法指令(22条) 1) 加法指令(8条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 ADD A,Rn 00101rrr A(A+Rn) n=0~7, rrr=000~111 1 ADD A,direct 00100101 AA+(direct) ADD A,@Ri 0010011i A(A+(Ri)) i=0,1 ADD A,#data 00100100 data AA+#data ADDC A,Rn 00111rrr AA+Rn+CY ADDC A,direct 00110101 direct AA+(direct)+CY ADDC A,@Ri 0011011i AA+(Ri)+CY ADDC A,#data 00110100 data AA+#data+CY
注意:① ADD与ADDC的区别为是否加进位位CY。 ② 指令执行结果均在累加器A中。 ③ 以上指令结果均影响程序状态字寄存器PSW的CY、OV、AC和P标志。 2) 减法指令(4条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 SUBB A,Rn 1001rrr AA-(Rn)-CY n=0~7 rrr=000~111 1 SUBB A,direct 10010101 direct AA- (direct)-CY SUBB A,@Ri 1001011i AA- (Ri)-CY i=0,1 SUBB A,#data 10010100 data AA-(#data)-CY
注意:① 减法指令中没有不带借位的减法指令,所以在需要时,必须先将CY清0。 ② 指令执行结果均在累加器A中。 ③ 减法指令结果影响程序状态字寄存器PSW的CY、OV、AC和P标志。 例3.6 编写计算12A4H+0FE7H的程序,将结果存入内部RAM 41H和40H单元,40H存低8位,41H存高8位。 解:单片机指令系统中只提供了8位的加减法运算指令,两个16位数(双字节)相加可分为两步进行,第一步先对低8位相加,第二步再对高8位相加。
高8位 低8位 1 2 A 4 H ① A4H + E7H = 8BH 进位1 + 0 F E 7 H ② 12H + 0FH + 1 = 22H 2 2 8 B 进位 1 1 1 ② ① 加法指令 ADDC ADD 程序如下: MOV A,#0A4H ;被加数低8位→A
ADD A,#0E7H ;加数低8位E7H与之相加,A=8BH,CY=1 MOV 40H,A ;A→(40H),存低8位结果 MOV A,#12H ;被加数高8位→AADDC A,#0FH ;加数高8位+A+CY,A=22H MOV 41H,A ;存高8位运算结果 3) BCD码调整指令(1条) 助记符格式 机器码(B) 指令说明 机器周期 DA A 11010100 BCD码加法调整指令 1
注意:① 结果影响程序状态字寄存器PSW的CY、OV、AC和P标志。 ② BCD(Binary Coded Decimal)码是用二进制形式表示十进制数,例如十进制数45,其BCD码形式为45H。BCD码只是一种表示形式,与其数值没有关系。 BCD码用4位二进制码表示一位十进制数,这4位二进制数的权为8421,所以BCD码又称为8421码。十进制数码0~9所对应的二进制码如表3.3所示。
在表3.3中,用4位二进制数表示一个十进制数位,例如56D和87D的BCD码表示为 0101 0110 (56D) 十进制数码 1 2 3 4 5 6 7 8 9 二进制码 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 在表3.3中,用4位二进制数表示一个十进制数位,例如56D和87D的BCD码表示为 0101 0110 (56D) 1000 0111 (87D) 0001 0100 0011 (143D)
③ DAA指令将A中的二进制码自动调整为BCD码。 ④DAA指令只能跟在ADD或ADDC加法指令后,不适用于减法。 例3.7 说明指令MOV A,#05H和ADD A,#08H及DA A的执行结果。 解:MOV A,#05H ;05H→A ADD A,#08H ;05H+08H→A,A=0DH DA A ;自动调整为BCD码,A=13H
4) 加1减1指令(9条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 INC A 00000100 AA+1 影响PSW的P标志 1 INC Rn 00001rrr RnRn+1 n=0~7, rrr=000~111 INC direct 0101 direct (direct)(direct)+1 INC @Ri 0000011i (Ri)(Ri)+1 i=0,1 INC DPTR 10100011 DPTRDPTR+1 2 DEC A 00010100 AA-1 DEC Rn 00011rrr RnRn-1 DEC direct 00010101 direct DEC @Ri 0001011i (Ri)(Ri)-1
注意:以上指令结果通常不影响程序状态字寄存器PSW。 例3.8 分别指出指令INC R0和INC @R0的执行结果。设R0=30H,(30H)=00H。 解: INC R0 ;R0+1=30H+1=31H→R0,R0=31H INC@R0 ;(R0)+1=(30H)+1→(R0),(30H)=01H,R0中内容不变 2. 乘、除法指令
注意:乘法结果影响程序状态字寄存器PSW的OV(积超过0FFH则置1,否则为0)和CY(总是清0)以及P标志。 2) 除法指令(1条) 1) 乘法指令(2条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 MUL AB 10100100 BAA*B 无符号数相乘,高位存B,低位存A 4 注意:乘法结果影响程序状态字寄存器PSW的OV(积超过0FFH则置1,否则为0)和CY(总是清0)以及P标志。 2) 除法指令(1条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 DIV AB 10000100 AA/B的商 BA/B的余数 无符号数相除,商存A,余数存B 4
注意:① 除法结果影响程序状态字寄存器PSW的OV(除数为0则置1,否则为0)和CY(总是清0)以及P标志。 ② 当除数为0时结果不能确定。
3.3.4 逻辑运算及移位类指令 1. 逻辑运算指令(20条) 1) 逻辑与指令(6条) 助记符格式 机器码(B) 相应操作 指令说明 3.3.4 逻辑运算及移位类指令 1. 逻辑运算指令(20条) 1) 逻辑与指令(6条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 ANL A,direct 01010101 direct AA∧direct 按位相与 1 ANL A,Rn 01011rrr AA∧Rn n=0~7, rrr=000~111 ANL A,@Ri 0101011i AA∧(Ri) i=0,1 ANL A,#data 01010100 data AA∧#data ANL direct,A 01010010 direct (direct)(direct)∧A 不影响PSW的P标志 ANL direct,#data 01010011 direct data (direct) (direct)∧#data 2
注意:① 以上指令结果通常影响程序状态字寄存器PSW的P标志。 ② 逻辑与指令通常用于将一个字节中的指定位清0,其它位不变。 2) 逻辑或指令(6条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 ORL A,direct 01000101 direct AA∨direct 按位相或 1 ORL A,Rn 01001rrr AA∨Rn n=0~7, rrr=000~111 ORL A,@Ri 0100011i AA∨(Ri) i=0,1 ORL A,#data 01000100 data AA∨#data ORL direct,A 01000010 direct (direct)(direct)∨A 不影响PSW的P标志 ORL direct,#data 01000011 direct data (direct) (direct)∨#data 2
注意:① 以上指令结果通常影响程序状态字寄存器PSW的P标志。 ② 逻辑或指令通常用于将一个字节中的指定位置1,其余位不变。 3) 逻辑异或指令(6条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 XRL A,direct 01100101 direct AA(direct) 按位相异或 1 XRL A,Rn 01101rrr AARn n=0~7, rrr=000~111 XRL A,@Ri 0110011i AA (Ri) i=0,1 XRL A,#data 01100100 data AA#data XRL direct,A 01100010 direct (direct)(direct)A 不影响PSW的P标志 XRL direct,#data 01100011 direct data (direct) (direct)#data 2
注意:① 以上指令结果通常影响程序状态字寄存器PSW的P标志。 ② “异或”原则是相同为0,不同为1。 4) 累加器A清0和取反指令(2条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 CLR A 11100100 A00H A中内容清0,影响P标志 1 CPL A 11110100 A A中内容按位取反,影响P标志
注意:执行带进位的循环移位指令之前,必须给CY置位或清0。 2. 循环移位指令(4条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 RL A 00100011 ┌──────┐ └←A7←A0←┘ 循环左移 1 RLC A 00110011 └CY─A7←A0┘ 带进位循环左移,影响CY标志 RR A 00000011 └→A7→A0→┘ 循环右移 RRC A 00010011 └CY→A7→A0┘ 带进位循环右移,影响CY标志 注意:执行带进位的循环移位指令之前,必须给CY置位或清0。
控制转移类指令的本质是改变程序计数器PC的内容,从而改变程序的执行方向。控制转移指令分为:无条件转移指令、条件转移指令和调用/返回指令。 3.3.5 控制转移类指令 控制转移类指令的本质是改变程序计数器PC的内容,从而改变程序的执行方向。控制转移指令分为:无条件转移指令、条件转移指令和调用/返回指令。 1. 无条件转移指令(4条) 1) 长转移指令(1条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 LJMP addr16 00000010 addr15~8 addr7~0 PCaddr16 程序跳转到地址为addr16开始的地方执行 2
注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 该指令可以转移到64 KB程序存储器中的任意位置。 2) 绝对转移指令 (1条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 AJMP addr11 a10a9a800001 addr7~0 PC10~0addr11 程序跳转到地址为PC15~11addr11开始的地方执行,2 KB内绝对转移 2
注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 该指令转移范围是2 KB。 例3.9 指令KWR: AJMP KWR1的执行结果。 解:设KWR标号地址=1030H,KWR1标号地址=1100H,该指令执行后PC首先加2变为1032H,然后由1032H的高5位和1100H的低11位拼装成新的PC值0001000100000000B,即程序从1100H开始执行。
注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 该指令的转移范围是以本指令的下一条指令为中心的-128~+127字节以内。 3) 相对转移指令 (1条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 SJMP rel 10000000 rel PCPC+rel -80H(-128)~7FH(127)短转移 2 注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 该指令的转移范围是以本指令的下一条指令为中心的-128~+127字节以内。 ③ 在实际应用中,LJMP、AJMP和SJMP后面的addr16、addr11或rel都是用标号来代替的,不一定写出它们的具体地址。
注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 该指令通常用于散转(多分支)程序。 2. 条件转移指令(8条) 4) 间接寻址的无条件转移指令(1条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 JMP @A+DPTR 01110011 PCA+DPTR 64 KB内相对转移 2 注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 该指令通常用于散转(多分支)程序。 2. 条件转移指令(8条)
注意:① 以上指令结果不影响程序状态字寄存器PSW。 1) 累加器A判0指令(2条) 助记符格式 机器码(B) 相应操作 机器周期 JZ rel 0110000 若A=0, 则PCPC+rel, 否则程序顺序执行 2 JNZ rel 01110000 若A≠0, 则PCPC+rel, 否则程序顺序执行 注意:① 以上指令结果不影响程序状态字寄存器PSW。 ② 转移范围与指令SJMP相同。
注意:① 以上指令结果影响程序状态字寄存器PSW的CY标志。 ② 转移范围与SJMP指令相同。 2) 比较转移指令(4条) 助记符格式 机器码(B) 相应操作 机器周期 CJNE A,#data,rel 10110100 data rel 若A≠#data, 则PCPC+rel,否则顺序执行;若 A<#data,则CY=1,否则CY=0 2 CJNE Rn,#data,rel 10111rrr 若 Rn≠#data,则PCPC+rel,否则顺序执行;若Rn<#data,则CY=1,否则CY=0 CJNE @Ri,#data,rel 1011011i 若(Ri)≠#data,则PCPC+rel,否则顺序执行;若(Ri)<#data,则CY=1,否则CY=0 CJNE A,direct,rel 10110101 direct rel 若A≠(direct),则PCPC+rel,否则顺序执行;若A<(direct),则CY=1,否则CY=0 注意:① 以上指令结果影响程序状态字寄存器PSW的CY标志。 ② 转移范围与SJMP指令相同。
注意: ① DJNZ指令通常用于循环程序中控制循环次数。 ② 转移范围与SJMP指令相同。 ③ 以上指令结果不影响程序状态字寄存器PSW。 3) 减1非零转移指令(2条) 助记符格式 机器码(B) 相应操作 机器周期 DJNZ Rn,rel 11011rrr rel RnRn-1,若Rn≠0,则PCPC+rel, 否则顺序执行 2 DJNZ direct,rel 11010101 direct rel (direct)(direct)-1,若(direct)≠0,则PCPC+rel,否则顺序执行 注意: ① DJNZ指令通常用于循环程序中控制循环次数。 ② 转移范围与SJMP指令相同。 ③ 以上指令结果不影响程序状态字寄存器PSW。
注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 调用范围与AJMP指令相同。 3. 调用和返回指令(5条) 1) 绝对调用指令(1条) 助记符格式 机器码(B) 相应操作 机器周期 ACALL addr11 a10a9a810001 addr7~0 PC PC+2 SP SP+1,(SP)PC0~7 SP SP+1,(SP)PC8~15 PC0~10 addr11 2 注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 调用范围与AJMP指令相同。
注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 调用范围与LJMP指令相同。 2) 长调用指令(1条) 助记符格式 机器码(B) 相应操作 机器周期 LCALL addr16 00010010 addr15~8 addr7~0 PCPC+3 SP SP+1,SPPC0~7 SP SP+1,SPPC8~15 PC addr16 2 注意:① 该指令结果不影响程序状态字寄存器PSW。 ② 调用范围与LJMP指令相同。
注意:该指令结果不影响程序状态字寄存器PSW。 3) 返回指令(2条) 助记符格式 机器码(B) 相应操作 机器周期 RET 00100010 PC8~15 (SP), SP SP-1 PC0~7 (SP), SP SP-1 子程序返回指令 2 RETI 00110010 PC8~15 SP, SP SP-1 PC0~7 SP, SP SP-1 中断返回指令 注意:该指令结果不影响程序状态字寄存器PSW。
注意:该指令结果不影响程序状态字寄存器PSW。 4) 空操作(1条) 助记符格式 机器码(B) 相应操作 指令说明 NOP 00000000 空操作 消耗1个机器周期 注意:该指令结果不影响程序状态字寄存器PSW。
3.3.6 位操作类指令 位操作指令的操作数是“位”,其取值只能是0或1,故又称之为布尔操作指令。位操作指令的操作对象是片内RAM的位寻址区(即20H~2FH)和特殊功能寄存器SFR中的11个可位寻址的寄存器。片内RAM的20H~2FH共16个单元128个位,我们为这128个位的每个位均定义一个名称:00H~7FH,称为位地址,如表3.4所示。对于特殊功能寄存器SFR中可位寻址的寄存器的每个位也有名称定义,如表3.5所示。
表3.4 片内RAM位寻址区的位地址分布 位地址/位名称 字节地址 D7 D6 D5 D4 D3 D2 D1 D0 7F 7E 7D 7C 7B 7A 79 78 2FH 77 76 75 74 73 72 71 70 2EH 6F 6E 6D 6C 6B 6A 69 68 2DH 67 66 65 64 63 62 61 60 2CH 5F 5E 5D 5C 5B 5A 59 58 2BH 57 56 55 54 53 52 51 50 2AH 4F 4E 4D 4C 4B 4A 49 48 29H 47 46 45 44 43 42 41 40 28H
续表(2) 3F 3E 3D 3C 3B 3A 39 38 27H 37 36 35 34 33 32 31 30 26H 2F 2E 2D 2C 2B 2A 29 28 25H 27 26 25 24 23 22 21 20 24H 1F 1E 1D 1C 1B 1A 19 18 23H 17 16 15 14 13 12 11 10 22H 0F 0E 0D 0C 0B 0A 09 08 21H 07 06 05 04 03 02 01 00 20H
表3.5 SFR中的位地址分布 SFR 位地址/位名称 字节 地址 D7 D6 D5 D4 D3 D2 D1 D0 B F7H F6H F5H F4H F3H F2H F1H F0H F0H ACC E7H E6H E5H E4H E3H E2H E1H E0H E0H ACC.7 ACC.6 ACC.5 ACC.4 ACC.3 ACC.2 ACC.1 ACC.0 PSW D7H D6H D5H D4H D3H D2H D1H D0H D0H CY AC F0 RS1 RS0 OV F1 P
续表(2) IP BFH BEH BDH BCH BBH BAH B9H B8H B8H — — — PS PT1 PX1 PT0 PX0 P3 B7H B6H B5H B4H B3H B2H B1H B0H B0H P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0 IE AFH AEH ADH ACH ABH AAH A9H A8H A8H EA — — ES ET1 EX1 ET0 EX0 P2 A7H A6H A5H A4H A3H A2H A1H A0H A0H P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
续表(3) SCON 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H 98H SM0 SM1 SM2 REN TB8 RB8 TI RI P1 97H 96H 95H 94H 93H 92H 91H 90H 90H P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0 TCON 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 88H TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 P0 87H 86H 85H 84H 83H 82H 81H 80H 80H P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0
第一种是直接地址写法, 如 MOV C,0D2H,其中,0D2H表示PSW中的OV位地址。 对于位寻址,有以下三种不同的写法。 第一种是直接地址写法, 如 MOV C,0D2H,其中,0D2H表示PSW中的OV位地址。 第二种是点操作符写法,如 MOV C , 0D0H.2。 第三种是位名称写法,在指令格式中直接采用位定义名称,这种方式只适用于可以位寻址的SFR,如MOV C,OV。 1. 位传送指令(2条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV C,bit 10100010 CY bit 位传送指令,结果影响CY标志 2 MOV bit,C 10010010 bit CY 位传送指令,结果不影响PSW
注意:位传送指令的操作数中必须有一个是进位位C,不能在其它两个位之间直接传送。进位位C也称为位累加器。 2. 位置位和位清零指令(4条) 助记符格式 机器码(B) 相应操作 指令说明 机器周期 CLR C 11000011 CY 0 位清0指令,结果影响CY标志 1 CLR bit 11000010 bit bit 0 位清0指令,结果不影响PSW SETB C 11010011 CY1 位置1指令,结果影响CY标志 SETB bit 11010010 bit bit 1 位置1指令,结果不影响PSW
注意:① JBC与JB指令的区别是:前者转移后并把寻址位清0,后者只转移不清0寻址位。 ② 以上指令结果不影响程序状态字寄存器PSW。 助记符格式 机器码(B) 相应操作 指令说明 机器周期 ANL C,bit 10000010 bit CY CY∧bit 位与指令 2 ANL C/bit 10110010 bit CY CY∧ ORL C,bit 01110010 bit CY CY∨bit 位或指令 ORL C/bit 10100010 bit CY CY∨ CPL C 10110011 CY 位取反指令 CPL bit 10110010 bit 位取反指令,结果不影响CY c 机器码(B) 相应操作 指令说明 机器周期 ANL C,bit 10000010 bit CY CY∧bit 位与指令 2 ANL C/bit 10110010 bit CY CY∧ ORL C,bit 01110010 bit CY CY∨bit 位或指令 ORL C/bit 10100010 bit CY CY∨ CPL C 10110011 CY 位取反指令 CPL bit 10110010 bit 位取反指令,结果不影响CY 助记符格式 机器码(B) 相应操作 指令说明 机器周期 ANL C,bit 10000010 bit CY CY∧bit 位与指令 2 ANL C/bit 10110010 bit CY CY∧ ORL C,bit 01110010 bit CY CY∨bit 位或指令 ORL C/bit 10100010 bit CY CY∨ CPL C 10110011 CY 位取反指令 CPL bit 10110010 bit 位取反指令,结果不影响CY 助记符格式 机器码(B) 相应操作 指令说明 机器周期 ANL C,bit 10000010 bit CY CY∧bit 位与指令 2 ANL C/bit 10110010 bit CY CY∧ ORL C,bit 01110010 bit CY CY∨bit 位或指令 ORL C/bit 10100010 bit CY CY∨ CPL C 10110011 CY 位取反指令 CPL bit 10110010 bit 位取反指令,结果不影响CY 助记符格式 机器码(B) 相应操作 指令说明 机器周期 ANL C,bit 10000010 bit CY CY∧bit 位与指令 2 ANL C/bit 10110010 bit CY CY∧ ORL C,bit 01110010 bit CY CY∨bit 位或指令 ORL C/bit 10100010 bit CY CY∨ CPL C 10110011 CY 位取反指令 CPL bit 10110010 bit 位取反指令,结果不影响CY 助记符格式 机器码(B) 相应操作 指令说明 机器周期 ANL C,bit 10000010 bit CY CY∧bit 位与指令 2 ANL C/bit 10110010 bit CY CY∧ ORL C,bit 01110010 bit CY CY∨bit 位或指令 ORL C/bit 10100010 bit CY CY∨ CPL C 10110011 CY 位取反指令 CPL bit 10110010 bit 位取反指令,结果不影响CY 3. 位运算指令(6条) 助记符格式 机器码(B) 相应操作 机器周期 JB bit,rel 00100000 bit rel 若bit=1,则PCPC+rel,否则顺序执行 2 JNB bit,rel 00110000 bit rel 若bit=0,则PCPC+rel,否则顺序执行 JBC bit,rel 00010000 bit rel 若 bit=1,则PCPC+rel,bit0,否则顺序执行 注意:① JBC与JB指令的区别是:前者转移后并把寻址位清0,后者只转移不清0寻址位。 ② 以上指令结果不影响程序状态字寄存器PSW。
注意:以上结果不影响程序状态字寄存器PSW。 5. 判CY标志指令(2条) 助记符格式 机器码(B) 相应操作 机器周期 JC rel 01000000 若CY=0,则PCPC+rel,否则顺序执行 2 JNC rel 01010000 若CY≠0,则PCPC+rel,否则顺序执行 注意:以上结果不影响程序状态字寄存器PSW。 例3.10 用位操作指令编程计算逻辑方程P1.7=ACC.0×(B.0+P2.1)+ ,其中“+”表示逻辑或,“×”表示逻辑与。
解: 程序段如下: MOV C,B.0 ;B.0→C ORL C,P2.1 ;C或P2.1→C ANL C,ACC.0 ;C与ACC.0→C,即ACC.0×(B.0+P2.1) →C ORL C,/P3.2 ;C 或/P3.2, 即ACC.0×(B.0+P2.1)+ →C MOV P1.7,C ;C →P1.7
3.3.7 常用伪指令 单片机汇编语言程序设计中,除了使用指令系统规定的指令外,还要用到一些伪指令。伪指令又称指示性指令,具有和指令类似的形式,但汇编时伪指令并不产生可执行的目标代码,只是对汇编过程进行某种控制或提供某些汇编信息。下面对常用的伪指令作一简单介绍。
1. 定位伪指令ORG 格式:[标号:] ORG 地址表达式 功能:规定程序块或数据块存放的起始位置。 例如:ORG 1000H ;表示下面指令MOV A,#20H存放于1000H开始的单元 MOV A,#20H 2. 定义字节数据伪指令DB 格式:[标号:] DB 字节数据表 功能:字节数据表可以是多个字节数据、字符串或表达式,它表示将字节数据表中的数据从左到右依次存放在指定地址单元。
例如: ORG 1000H TAB:DB 2BH,0A0H,'A',2*4 ;表示从1000H单元开始的地方存放数据2BH,0A0H, ;41H(字母A的ASCII码),08H 3. 定义字数据伪指令DW 格式:[标号:] DW 字数据表 功能:与DB类似,但DW定义的数据项为字,包括两个字节,存放时高位在前,低位在后。 例如:ORG 1000H DATA:DW 324AH,3CH ;表示从1000H单元开始的地方存放数据32H,4AH,00H, ;3CH(3CH以字的形式表示为003CH)
4. 定义空间伪指令DS 格式:[标号:] DS 表达式 功能:从指定的地址开始,保留多少个存储单元作为备用的空间。 例如: ORG 1000H BUF:DS 50 TAB:DB 22H ;表示从1000H开始的地方预留50(1000H~1031H)个存储字节空间, ;22H存放在1032H单元
5. 符号定义伪指令EQU或= 格式:符号名 EQU 表达式 或 符号名=表达式 功能:将表达式的值或某个特定汇编符号定义为一个指定的符号名,只能定义单字节数据,并且必须遵循先定义后使用的原则,因此该语句通常放在源程序的开头部分。 例如: LEN=10 SUM EQU 21H … MOV A,#LEN ;执行指令后,累加器A中的值为0AH
6. 数据赋值伪指令DATA 格式:符号名 DATA 表达式 功能:将表达式的值或某个特定汇编符号定义为一个指定的符号名,只能定义单字节数据,但可以先使用后定义,因此用它定义数据可以放在程序末尾进行数据定义。 例如: … MOV A,#LEN … LEN DATA 10 尽管LEN的引用在定义之前,但汇编语言系统仍可以知道A的值是0AH。
7. 数据地址赋值伪指令XDATA 格式:符号名 XDATA 表达式 功能:将表达式的值或某个特定汇编符号定义为一个指定的符号名,可以先使用后定义,并且用于双字节数据定义。 例如:DELAY XDATA 0356H … LCALL DELAY ;执行指令后,程序转到0356H单元执行 8. 汇编结束伪指令END 格式:[标号:] END 功能:汇编语言源程序结束标志,用于整个汇编语言程序的末尾处。
ACALL DELAY MOV P1,#0FFH MOV P1,#55H MOV P1,#0AAH AJMP MAIN ORG 0000H MAIN: MOV P1,#00H ACALL DELAY MOV P1,#0FFH MOV P1,#55H MOV P1,#0AAH AJMP MAIN
DELAY: MOV R6,#250 DEL1: MOV R7,#200 DEL2: DJNZ R7,DEL2 DJNZ R6,DEL1 RET END
ORG. 0000H MAIN:. MOV P1,#01H. ACALL DELAY. MOV. P1,#02H. ACALL DELAY ORG 0000H MAIN: MOV P1,#01H ACALL DELAY MOV P1,#02H ACALL DELAY MOV P1,#04H ACALL DELAY MOV P1,#08H ACALL DELAY MOV P1,#10H ACALL DELAY AJMP MAIN
ORG 0000H MAIN: MOV A,#01H LOOP: MOV P1,A ACALL DELAY RL A AJMP LOOP