980 likes | 1.08k Views
第 2 章 MCS-51 指令系统. 2.1 简介 2.2 寻址方式 2.3 指令系统. 2.1 简 介. 2.1.1 指令概述 计算机之所以能够按照人们的意愿工作,是因为人们给了它相应命令。这些命令是由计算机所能识别的指令组成的。指令是 CPU 用于控制功能部件完成某一指定动作的指示和命令。
E N D
第2章MCS-51指令系统 2.1 简介 2.2 寻址方式 2.3 指令系统
2.1 简介 2.1.1 指令概述 计算机之所以能够按照人们的意愿工作,是因为人们给了它相应命令。这些命令是由计算机所能识别的指令组成的。指令是CPU用于控制功能部件完成某一指定动作的指示和命令。 一台微机所具有的所有指令的集合,就构成了指令系统。指令系统越丰富,说明CPU的功能越强。例如,Z80 CPU中,没有乘法和除法指令,乘法和除法运算必须用软件来实现,因此执行速度相对较慢;而MCS-51单片机提供了乘法和除法指令,实现乘法和除法运算时就要快得多。
一台微机能执行什么样的操作,是在微机设计时确定的。一条指令对应着一种基本操作。由于计算机只能识别二进制数,所以指令也必须用二进制形式来表示,称为指令的机器码或机器指令。一台微机能执行什么样的操作,是在微机设计时确定的。一条指令对应着一种基本操作。由于计算机只能识别二进制数,所以指令也必须用二进制形式来表示,称为指令的机器码或机器指令。 MCS-51单片机指令系统共有33种功能,42种助记符,111条指令。
2.1.2 指令格式 在实训中看到,不同指令翻译成机器码后字节数也不一定相同。按照机器码个数,指令可以分为以下三种:
MCS-51单片机指令系统包括49条单字节指令、46条双字节指令和16条三字节指令。 采用助记符表示的汇编语言指令格式如下: 标号是程序员根据编程需要给指令设定的符号地址,可有可无;标号由1~8个字符组成,第一个字符必须是英文字,不能是数字或其它符号;标号后必须用冒号。
操作码表示指令的操作种类,如MOV表示数据传送操作,ADD表示加法操作等。操作码表示指令的操作种类,如MOV表示数据传送操作,ADD表示加法操作等。 操作数或操作数地址表示参加运算的数据或数据的有效地址。操作数一般有以下几种形式:没有操作数项,操作数隐含在操作码中,如RET指令;只有一个操作数,如CPL A指令;有两个操作数,如MOV A,#00H指令,操作数之间以逗号相隔;有三个操作数,如CJNE A,#00H,NEXT指令,操作数之间也以逗号相隔。 注释是对指令的解释说明,用以提高程序的可读性;注释前必须加分号。
2.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所示。
例: MOV P1,A ;将累加器A的内容送 到P1口 MOV P1,R4 ;将寄存器R4的内容送到P1口 CLR A ;将累加器A清0 CPL A ;将累加器A中的内容取反 RL A ;将累加器A的内容循环左移
2. 直接寻址 直接寻址是指把存放操作数的内存单元的地址直接写在指令中。在MCS-51单片机中,可以直接寻址的存储器主要有内部RAM区和特殊功能寄存器SFR区。 例如,指令MOV A,3AH执行的操作是将内部RAM 中地址为3AH的单元内容传送到累加器A中,其操作数3AH就是存放数据的单元地址,因此该指令是直接寻址。 设内部RAM 3AH单元的内容是88H,那么指令MOV A,3AH的执行过程如图2.2所示。
例: MOV P1,20H ;将20H单元的内容传送到P1口 3. 立即数寻址 立即数寻址是指将操作数直接写在指令中。 例如,指令MOV A,#3AH执行的操作是将立即数3AH送到累加器A中,该指令就是立即数寻址。注意:立即数前面必须加“#”号,以区别立即数和直接地址。该指令的执行过程如图2.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,该指令的执 • 行过程如图2.4所示。 • MOV P1,@R0 ;将R0所指的存 储 • 单元的内容送P1口
5. 变址寻址 • 变址寻址是指将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。DPTR或PC是基址寄存器,累加器A是变址寄存器。该类寻址方式主要用于查表操作。 • 例如,指令MOVC A,@A+DPTR执行的操作是将累加器A和基址寄存器DPTR的内容相加,相加结果作为操作数存放的地址,再将操作数取出来送到累加器A中。 • 设累加器A=02H,DPTR=0300H,外部ROM中,0302H单元的内容是55H,则指令MOVC A,@A+DPTR的执行结果是累加器A的内容为55H。该指令的执行过程如图2.5所示。
6. 相对寻址 相对寻址是指程序计数器PC的当前内容与指令中的操作数相加,其结果作为跳转指令的转移地址(也称目的地址)。该类寻址方式主要用于跳转指令。 例如,指令SJMP 54H执行的操作是将PC当前的内容与54H相加,结果再送回PC中,成为下一条将要执行指令的地址。 设指令SJMP 54H的机器码80H 54H存放在2000H处,当执行到该指令时,先从2000H和2001H单元取出指令,PC自动变为2002H;再把PC的内容与操作数54H相加,形成目标地址2056H,再送回PC,使得程序跳转到2056H单元继续执行。该指令的执行过程如图2.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。该指令的执行过程如图2.7所示。
2.3 指令系统 MCS-51单片机指令系统包括111条指令,按功能可以划分为以下5类 数据传送指令(29条) 算术运算指令(24条) 逻辑运算指令(24条) 控制转移指令(17条) 位操作指令(17条)
符 号 含 义 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作为间接寻址寄存器时所指单元的内容 ← 将 ← 后面的内容传送到前面去 2.3.1 指令系统中的符号说明 指令的书写必须遵守一定的规则,为了叙述方便,我们采用表2.2的约定。 表2.2 指令描述约定
2.3.2 数据传送类指令 数据传送指令是MCS-51单片机汇编语言程序设计中使用最频繁的指令,包括内部 RAM、寄存器、外部RAM以及程序存储器之间的数据传送。 数据传送操作是指把数据从源地址传送到目的地址,源地址内容不变。 目的地址 源地址 数 据
助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV A,Rn 11101rrr ARn n=0~7, rrr=000~111 1 MOV A,direct 11100101 direct A (direct) 1 MOV A,@Ri 1110011i A (Ri) i=0,1 1 MOV A,#data 01110100 data A #data 1 1. 内部8位数据传送指令(15条) 内部8位数据传送指令共15条,主要用于MCS-51单片机内部RAM与寄存器之间的数据传送。指令基本格式: MOV <目的操作数>,<源操作数> 1) 以累加器A为目的地址的传送指令(4条)
累加器A 40H 寄存器R0 50H 内部RAM:40H 30H 内部RAM:50H 10H 注意:以上传送指令的结果均影响程序状态字寄存器PSW的P标志。 例2.1已知相应单元的内容如下,请指出每条指令执行后相应单元内容的变化。
(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。
助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV Rn,A 11111rrr Rn A n=0~7, rrr=000~111 1 MOV Rn,direct 10101rrr direct Rn (direct) n=0~7, rrr=000~111 1 MOV Rn,#data 01111rrr data Rn #data n=0~7, rrr=000~111 1 2) 以Rn为目的地址的传送指令(3条)
助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV direct,A 11111010 direct (direct) A 1 MOV direct,Rn 10001rrr direct (direct )Rn n=0~7, rrr=000~111 1 MOV direct2,direct1 10000101 direct1 direct2 (direct2) direct1 2 MOV direct,@Ri 1000011i direct (direct )(Ri) i=0,1 2 MOV direct,#data 01110101 direct data (direct)#data 2 注意:以上传送指令的结果不影响程序状态字寄存器PSW标志。 3) 以直接地址为目的地址的传送指令(5条)
助记符格式 机器码(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 1 注意:以上传送指令的结果不影响程序状态字寄存器PSW标志。 4) 以寄存器间接地址为目的地址的传送指令(3条)
寄存器R0 50H 寄存器R1 66H 寄存器R6 30H 内部RAM:50H 60H 内部RAM:66H 45H 内部RAM:70H 40H 注意:以上传送指令的结果不影响程序状态字寄存器PSW标志。 例3.2已知相应单元的内容如下,请指出下列指令执行后各单元内容相应的变化。
(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。
助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOV DPTR,#data16 10010000 data15~8 data7~0 (DPTR) #data16 把16位常数装入数据指针 2 2. 16位 数据传送指令(1条)
助记符格式 机器码(B) 相应操作 指令说明 机器 周期 MOVX A,@DPTR 11100000 A(DPTR) 把DPTR所对应的外部RAM地址中的内容传送给累加器A 2 MOVX A,@Ri 1110001i A (Ri) i=0,1 2 MOVX @DPTR,A 11110000 (DPTR) A 结果不影响P标志 2 MOVX @Ri,A 1110001i (Ri) A i=0,1,结果不影响P标志 2 • 注意:以上指令结果不影响程序状态字寄存器PSW标志。 • 3. 外部数据传送指令(4条)
注意:① 外部RAM只能通过累加器A进行数据传送。 ② 累加器A与外部RAM之间传送数据时只能间接寻址方式,间接寻址寄存器为DPTR,R0,R1。 ③ 以上传送指令结果通常影响程序状态字寄存器PSW的P标志。 例2.3把外部数据存储器2040H单元中的数据传送到外部数据存储器2560H单元中去。
解:MOV DPTR,#2040H MOVX A,@DPTR ;先将2040H单元的内容传送到累加器A中 MOV DPTR,#2560H MOVX @DPTR,A ;再将累加器A中的内容传送到2560H单元中
助记符格式 机器码(B) 相应操作 指令说明 机器周期 XCH A,Rn 11001rrr ARn A与Rn内容互换 1 XCH A,direct 11000101 direct A(direct) 1 XCH A,@Ri 1100011i A(Ri) i=0,1 1 • 4. 交换和查表类指令(9条) • 1) 字节交换指令(3条)
助记符格式 机器码(B) 相应操作 指令说明 机器周期 XCHD A,@Ri 1101011i A3~0(Ri)3~0 低4位交换,高4位不变 1 • 注意:以上指令结果影响程序状态字寄存器PSW的P标志。 • 2) 半字节交换指令(1条) 注意:上面指令结果影响程序状态字寄存器PSW的P标志。
助记符格式 机器码(B) 相应操作 指令说明 机器周期 SWAP A 11000100 A 3~0A7~4 高、低4位互相交换 1 • 3) 累加器A中高4位和低4位交换(1条) 注意:上面指令结果不影响程序状态字寄存器PSW标志。 例2.4设内部数据存储区2AH、2BH单元中连续存放有4个BCD码(1个BCD码占 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单元
助记符格式 机器码(B) 相应操作 指令说明 机器周期 MOVC A,@A+PC 10000011 A(A+PC) A+PC所指外部程序存储单元的值送A 2 MOVC A,@A+DPTR 10010011 A(A+DPTR) A+DPTR所指外部程序存储单元的值送A 2 • 4) 查表指令(2条) 注意:① 以上指令结果影响程序状态字寄存器PSW的P标志。 ② 查表指令用于查找存放在程序存储器中的表格。
助记符格式 机器码(B) 相应操作 指令说明 机器周期 PUSH direct 11000000 direct SPSP+1 (SP)(direct) 将SP加1,然后将源地址单元中的数传送到SP所指示的单元中去 2 POP direct 11010000 direct (direct)(SP) SPSP-1 将SP所指示的单元中的数传送到direct地址单元中,然后SPSP-1 2 • 5) 堆栈操作指令(2条) 注意:① 堆栈是用户自己设定的内部RAM中的一块专用存储区,使用时一定先设堆栈指针,堆栈指针缺省为SP=07H。
② 堆栈遵循后进先出的原则安排数据。 ③ 堆栈操作必须是字节操作,且只能直接寻址。将累加器A入栈、出栈指令可以写成: PUSH/POP ACC 或 PUSH/POP 0E0H 而不能写成: PUSH/POP A ④ 堆栈通常用于临时保护数据及子程序调用时保护现场和恢复现场。 ⑤ 以上指令结果不影响程序状态字寄存器PSW标志。
例2.5设堆栈指针为30H,把累加器A和DPTR中的内容压入,然后根据需要再把它们弹出,编写实现该功能的程序段。例2.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)