第 3章 MCS-51指令系统本章介绍 MCS- 51单片机的指令格式和寻址方式,讲述数据传送、算术运算、
逻辑运算及移位、位操作、控制转移指令,
我们应对常用的指令熟练掌握,以便为程序设计打下必要的基础。
机器语言,计算机能直接识别的是由 0和
1编码组成的指令,这种编码称机器码,或称为机器语言指令 。
汇编语言,用助记符和专门的语言规则表示指令的功能和特征指令来编写程序。
<标号,操作码 操作数; 注释 >
3.1 机器语言、汇编语言,C语言
C语言是一种通用的计算机程序设计语言,它既可用来编写计算机的系统程序,
也可用来编写一般的应用程序。 C语言具有以下一些特点:
( 1)语言简洁,使用方便灵活。
( 2)可移植性好。
( 3)表达能力强。
( 4)表达方式灵活。
( 5)可进行结构化程序设计。
( 6)可以直接操作计算机硬件。
( 7)生成的目标代码质量高。
3.2 寻址方式
MCS- 51指令系统有 7种寻址方式,每种方式都有其对应的有效寻址范围(空间)。
寄存器寻址 —— 对选中的寄存器中的数据进行处理。
直接寻址 —— 又称为绝对寻址,按给出的地址数据直接对存储器单元访问。
立即寻址 —— 直接进行给出的立即数处理。
位寻址 —— MCS- 51共有 211个可寻址位。
寄存器间接寻址 —— 用寄存器中的数据作存储器的单元地址来访问该存储单元。
相对寻址 —— 相对寻址方式是为解决程序转移而专门设置的,为转移指令所采用。
基址加变址寄存器间接寻址 —— 用一个基址(基本地址指针)寄存器和一个偏移量地址寄存器分别存储基本地址和偏移量地址,用两者相加形成的数据作为存储单元的地址来访问该存储单元。
3.2.1寄存器寻址寄存器寻址方式是对选中寄存器中的数据进行处理,适用于数据放置在寄存器之中的情况。
MOV R1,B ;将寄存器 B中的数值送入到寄存器 R1中
INC R2 ;将寄存器 R2中的数值加 1
MOV A,R7 ;将寄存器 R7中的数值送入到寄存器 A中
3.2.2 直接寻址直接寻址方式是对直接指定地址的存储器单元中的数据进行处理,适用于数据放置在可以直接寻址的存储单元之中的情况。
MOV 40H,B; 将寄存器 B中的数值送入到内部 RAM的 40H单元中
INC 30H;将内部 RAM的 30H单元中的数值加 1
MOV TL0,R7;将寄存器 R7中的数值送入到特殊功能寄存器 TL0中
3.2.3 立即寻址立即寻址是对指令操作码后的数据进行处理,适用于在程序中直接处理的数据的情况。
MOV 38H,# 05H;将数值 05H送入到内部 RAM的 38H单元中
ADD A,# 30H ; 将 A寄存器中的数值加上 30H
MOV TH0,# 0F2H;将定时器 0高 8位设置为数值 0F2H
3.2.4 位寻址方式
MCS- 51单片机有位处理功能,可以对数据位进行操作。
MOV C,40H;把 40H位的值送进位位 C
位寻址的寻址范围包括:
内部 RAM中的位寻址区 单元地址为 20H-
2FH,共 16个单元,128个位,位地址是
00H-7FH。
特殊功能寄存器中的可寻址位 可供位寻址的特殊功能寄存器共有 11个,实际有寻址位 83个。
特殊功能寄存器中的可寻址位在指令中用如下 4种方法表示:
(1)直接使用位地址。例如,PSW寄存器位
5的地址为 0D5H。
(2)位名称的表示方法。例如,PSW寄存器位 5是 F0标志位,则可使用 F0表示该位。
(3)字节地址加位数的表示方法。例如,
0D0单元(即 PSW寄存器)位 5,表示为
( 0D0H),5
(4)特殊功能寄存器符号加位数的表示方法。
3.2.5 寄存器间接寻址寄存器间接寻址是将要处理数据的地址放在寄存器中,即用寄存器中的数据作为存储单元的地址数值。
MOV @R1,#05H ;将数值 05H送入到以 R1内数值为地址的内部 RAM单元中
ADD A,@R1 ; 将 A寄存器中的数值加上以 R1内数值为地址的内部 RAM单元中的数据,结果存放于 A
MOVX A,@DPTR ;将以 DPTR内数值为地址的外部数据存储器的内容送给寄存器 A
3.2.6 相对寻址方式相对寻址方式是为解决程序转移而专门设置的,为转移指令所采用。
目的地址 = 转移指令地址 + 转移指令的字节数 + rel
偏移量 rel是一个带符号的 8位二进制数补码数,所能表示的数的范围是:- 128~+
127。
3.2.7基址加变址寄存器间接寻址
(变址寻址)
MCS-51指令系统中基址加变址寄存器间接寻址方式是使用专用 16位寄存器( DPTR
或 PC)存放基地址,寄存器 A做变址寄存器。
MOVC A,@ A+ PC ;将 A和 PC两个寄存器的数值相加之和作为程序存储器中的数据地址,将该地址的内容送到 A中
MOVC A,@ A+ DPTR 将 A和 DPTR两个寄存器的数值相加之和作为程序存储器中的数据地址,将该地址的内容送到 A中
3.3 MCS-51单片机指令分类通常,指令系统中的指令按所实现的功能可以分为五类:数据传送类,算术运算类,逻辑运算类,控制转移类,其他类。
3.3.1.数据传送类
数据传送类指令实现数据的复制或转移,
是编程时使用得最多最频繁的一类指令。
数据传送类指令的作用是将源操作数传送到目的操作数。数据传送指令执行后,源操作数不改变,目的操作数被改为源操作数数值。
3.3.2.算术运算类
算术运算类指令用于进行数值计算的处理,
可以实现 CPU中运算器所能处理位数长度的数的加、减、乘、除运算。所有的 CPU
都能实现加减运算,有些指令系统有乘法指令,有些还有除法指令,还有的可以实现有符号数的运算。
在加减运算时要考虑到进位的影响,可以根据需要选择使用带进位加减或不带进位加减指令。
3.3.3 逻辑运算类指令
逻辑运算类指令用于进行逻辑计算的处理,
可以实现对 CPU字长度的清,0”、取反、
移位、与、或等逻辑运算。大多数逻辑运算指令都只能使用累加器 A(如 MCS- 51)
或通用寄存器。
不同 CPU的指令系统中具有的移位功能不同,指令数量也不同,具体使用时要根据指令系统的说明使用。
3.3.4 控制转移类
控制转移类指令用于改变程序执行的流向,
主要有跳转(转移)和调用两种方式,可以产生分支和循环等流程结构。
控制转移指令是在该指令执行时改变程序计数器的数值(程序存储器指针),指令执行结束后的下一条指令按新的指针地址取指和执行。根据转移的条件、修改数值的方式等的不同,转移有无条件转移、有条件转移、相对转移、绝对转移、长转移、
直接转移、间接转移等不同形式。
3.4 数据传送指令
3.4.1一般传输指令格式为,MOV 目的字节,源字节
MOV A,Rn ;将寄存器 Rn的内容送
A,Rn为当前寄存器组中的 R0-R7之一
MOV B,@ Ri;将工作寄存器 Ri (Ri为 R0
或 R1)所指的内存单元内容送寄存器 B
MOV Rn,# data; 8位立即数 data送 Rn,
Rn为 R0-R7之一
MOV Rn,direct ;将 RAM区 direct单元的内容送 Rn,Rn为 R0-R7之一
MOV direct,A ; 将 A中内容送 RAM区
direct单元
MOV direct,@ Ri ;将 Ri (R0或 R1)所指单元的内容送 direct
MOV direct2,direct1 ;将 direct1单元的内容送 direct2单元
MOV @ Ri,#data ; 将 8位立即数送到 Ri所指的 RAM单元
MOV DPTR,#data ; 将 16位立即数送入数据指针寄存器
3.4.2累加器传输指令
字符交换指令
XCH A,direct ;将 direct单元内容和 A
的内容交换
XCH A,Rn; n为 0-7之一,将工作寄存器 Rn的内容和 A的内容交换
XCH A,@ Ri; Ri为 R0或 R1,将 Ri所指单元的内容和 A的内容互换
累加器高 4位和低 4位交换指令
SWAP A ; A的高 4位和低 4位互换
累加器低 4位和内存单元低 4位半字节交换指令
XCHD A,@ Ri ; Ri为 R0或 R1,将 Ri所指单元的低 4位与 A的低 4位互换,高 4位不变。
累加器和外部数据存储器数据传输指令
MOVX A,@ Ri ; Ri为 R0或 R1,将 Ri所指外部存储器单元内容送 A
MOVX @ Ri,A ; Ri为 R0或 R1,将 A中内容送 Ri所指外部存储器单元
MOVX A,@ DPTR ;将 16位指针 DPTR所指外部存储器单元内容送 A
MOVX @ DPTR,A;将 A中内容送 DPTR所指外部存储器单元
查表指令
MOVC A,@ A+PC ;将 PC值和 A的内容相加,所得值作为新地址,将此地址单元内容送 A
MOVC A,@ A+DPTR;将 DPTR中的 16
位地址和 A中内容相加得新地址,把此地址内容送 A
查表指令将 PC或 DPTR作为首地址,将累加器的内容作为位移量,可用来对程序存储器中所存的表格进行检索。
堆栈指令
PUSH direct ;先将 SP加 1,再将 direct所指单元内容推入 SP+1所指的堆栈单元
PUSH DPH;先将 SP加 1,再将数据指针高位
DPH推入堆栈 SP+1单元
PUSH DPL ;先将 SP加 1,再将数据指针低位 DPL推入堆栈 SP+1单元
POP direct;先将 SP单元的内容弹出到 direct单元,再将 SP减 1
POP DPH ;先将栈顶 SP的内容弹出到数据指针的高 8位 DPH,再将 SP减 1
POP DPL;先将栈顶 SP的内容弹出到数据指针的低 8位 DPL,再将 SP减 1
3.5算术运算指令
3.5.1加法指令
一般加法指令
带进位的加法指令
增量指令
3.5.2 减法指令
带借位的减法指令
减量指令
3.5.3 乘法指令和除法指令
MUL AB ;将累加器 A和寄存器 B中的两个
8位无符号数相乘,得 16位积,低 8位在 A
中,高 8位在 B中
DIV AB ;将累加器 A中的 8位无符号数除以 B寄存器的 8位无符号数,商在 A中,余数在 B中。
3.6 逻辑运算指令
3.6.1单操作数指令
CLR A ; A清 0,不影响标志位
CPL A ; A中内容逐位取反
RR A ; A中内容循环右移一位,
最低位 D0移到 D7
RRC A ; CY进入 A的最高位,
A的最低位进入 CY,D2进入 D1等
RL A ; A中内容循环左移一位,
即 D7移到 D0,D0移到 D1等。
RLC A ; A的最高位进入 CY,
原 CY进入 A的最低位 D0,D0进入 Dl等
3.6.2 双操作数指令
逻辑与指令
逻辑或指令
3.6.3逻辑异或指令
XRL A,Rn ;
XRL A,@ Ri ;
XRL A,#data ;
XRL A,direct ;
XRL direct,A ;
XRL direct,#data ;
3.7转移控制指令
3.7.1调用和返回指令
3.7.2无条件转移指令
3.7.3条件转移指令
3.7.4 比较转移指令
3.7.5 循环转移指令
3.8空操作指令
NOP ; 空操作指令用一个机器周期,它的功能只是使 PC值加 1,CPU不做任何操作。 NOP指令一般用作延迟。
3.9位处理指令
位传送指令
位控制指令
位逻辑运算指令
位转移指令
3.10 伪指令汇编语言必须经汇编变成机器语言计算机才能执行,汇编程序对用汇编语言编写的源程序进行汇编时,
还要提供一些汇编用的指令,例如要指定程序或数据存放的起始地址;要给一些连续存放的数据确定单元等等。但是,这些指令在汇编时不产生目标代码,不影响程序的执行,所以称为伪指令。
逻辑运算及移位、位操作、控制转移指令,
我们应对常用的指令熟练掌握,以便为程序设计打下必要的基础。
机器语言,计算机能直接识别的是由 0和
1编码组成的指令,这种编码称机器码,或称为机器语言指令 。
汇编语言,用助记符和专门的语言规则表示指令的功能和特征指令来编写程序。
<标号,操作码 操作数; 注释 >
3.1 机器语言、汇编语言,C语言
C语言是一种通用的计算机程序设计语言,它既可用来编写计算机的系统程序,
也可用来编写一般的应用程序。 C语言具有以下一些特点:
( 1)语言简洁,使用方便灵活。
( 2)可移植性好。
( 3)表达能力强。
( 4)表达方式灵活。
( 5)可进行结构化程序设计。
( 6)可以直接操作计算机硬件。
( 7)生成的目标代码质量高。
3.2 寻址方式
MCS- 51指令系统有 7种寻址方式,每种方式都有其对应的有效寻址范围(空间)。
寄存器寻址 —— 对选中的寄存器中的数据进行处理。
直接寻址 —— 又称为绝对寻址,按给出的地址数据直接对存储器单元访问。
立即寻址 —— 直接进行给出的立即数处理。
位寻址 —— MCS- 51共有 211个可寻址位。
寄存器间接寻址 —— 用寄存器中的数据作存储器的单元地址来访问该存储单元。
相对寻址 —— 相对寻址方式是为解决程序转移而专门设置的,为转移指令所采用。
基址加变址寄存器间接寻址 —— 用一个基址(基本地址指针)寄存器和一个偏移量地址寄存器分别存储基本地址和偏移量地址,用两者相加形成的数据作为存储单元的地址来访问该存储单元。
3.2.1寄存器寻址寄存器寻址方式是对选中寄存器中的数据进行处理,适用于数据放置在寄存器之中的情况。
MOV R1,B ;将寄存器 B中的数值送入到寄存器 R1中
INC R2 ;将寄存器 R2中的数值加 1
MOV A,R7 ;将寄存器 R7中的数值送入到寄存器 A中
3.2.2 直接寻址直接寻址方式是对直接指定地址的存储器单元中的数据进行处理,适用于数据放置在可以直接寻址的存储单元之中的情况。
MOV 40H,B; 将寄存器 B中的数值送入到内部 RAM的 40H单元中
INC 30H;将内部 RAM的 30H单元中的数值加 1
MOV TL0,R7;将寄存器 R7中的数值送入到特殊功能寄存器 TL0中
3.2.3 立即寻址立即寻址是对指令操作码后的数据进行处理,适用于在程序中直接处理的数据的情况。
MOV 38H,# 05H;将数值 05H送入到内部 RAM的 38H单元中
ADD A,# 30H ; 将 A寄存器中的数值加上 30H
MOV TH0,# 0F2H;将定时器 0高 8位设置为数值 0F2H
3.2.4 位寻址方式
MCS- 51单片机有位处理功能,可以对数据位进行操作。
MOV C,40H;把 40H位的值送进位位 C
位寻址的寻址范围包括:
内部 RAM中的位寻址区 单元地址为 20H-
2FH,共 16个单元,128个位,位地址是
00H-7FH。
特殊功能寄存器中的可寻址位 可供位寻址的特殊功能寄存器共有 11个,实际有寻址位 83个。
特殊功能寄存器中的可寻址位在指令中用如下 4种方法表示:
(1)直接使用位地址。例如,PSW寄存器位
5的地址为 0D5H。
(2)位名称的表示方法。例如,PSW寄存器位 5是 F0标志位,则可使用 F0表示该位。
(3)字节地址加位数的表示方法。例如,
0D0单元(即 PSW寄存器)位 5,表示为
( 0D0H),5
(4)特殊功能寄存器符号加位数的表示方法。
3.2.5 寄存器间接寻址寄存器间接寻址是将要处理数据的地址放在寄存器中,即用寄存器中的数据作为存储单元的地址数值。
MOV @R1,#05H ;将数值 05H送入到以 R1内数值为地址的内部 RAM单元中
ADD A,@R1 ; 将 A寄存器中的数值加上以 R1内数值为地址的内部 RAM单元中的数据,结果存放于 A
MOVX A,@DPTR ;将以 DPTR内数值为地址的外部数据存储器的内容送给寄存器 A
3.2.6 相对寻址方式相对寻址方式是为解决程序转移而专门设置的,为转移指令所采用。
目的地址 = 转移指令地址 + 转移指令的字节数 + rel
偏移量 rel是一个带符号的 8位二进制数补码数,所能表示的数的范围是:- 128~+
127。
3.2.7基址加变址寄存器间接寻址
(变址寻址)
MCS-51指令系统中基址加变址寄存器间接寻址方式是使用专用 16位寄存器( DPTR
或 PC)存放基地址,寄存器 A做变址寄存器。
MOVC A,@ A+ PC ;将 A和 PC两个寄存器的数值相加之和作为程序存储器中的数据地址,将该地址的内容送到 A中
MOVC A,@ A+ DPTR 将 A和 DPTR两个寄存器的数值相加之和作为程序存储器中的数据地址,将该地址的内容送到 A中
3.3 MCS-51单片机指令分类通常,指令系统中的指令按所实现的功能可以分为五类:数据传送类,算术运算类,逻辑运算类,控制转移类,其他类。
3.3.1.数据传送类
数据传送类指令实现数据的复制或转移,
是编程时使用得最多最频繁的一类指令。
数据传送类指令的作用是将源操作数传送到目的操作数。数据传送指令执行后,源操作数不改变,目的操作数被改为源操作数数值。
3.3.2.算术运算类
算术运算类指令用于进行数值计算的处理,
可以实现 CPU中运算器所能处理位数长度的数的加、减、乘、除运算。所有的 CPU
都能实现加减运算,有些指令系统有乘法指令,有些还有除法指令,还有的可以实现有符号数的运算。
在加减运算时要考虑到进位的影响,可以根据需要选择使用带进位加减或不带进位加减指令。
3.3.3 逻辑运算类指令
逻辑运算类指令用于进行逻辑计算的处理,
可以实现对 CPU字长度的清,0”、取反、
移位、与、或等逻辑运算。大多数逻辑运算指令都只能使用累加器 A(如 MCS- 51)
或通用寄存器。
不同 CPU的指令系统中具有的移位功能不同,指令数量也不同,具体使用时要根据指令系统的说明使用。
3.3.4 控制转移类
控制转移类指令用于改变程序执行的流向,
主要有跳转(转移)和调用两种方式,可以产生分支和循环等流程结构。
控制转移指令是在该指令执行时改变程序计数器的数值(程序存储器指针),指令执行结束后的下一条指令按新的指针地址取指和执行。根据转移的条件、修改数值的方式等的不同,转移有无条件转移、有条件转移、相对转移、绝对转移、长转移、
直接转移、间接转移等不同形式。
3.4 数据传送指令
3.4.1一般传输指令格式为,MOV 目的字节,源字节
MOV A,Rn ;将寄存器 Rn的内容送
A,Rn为当前寄存器组中的 R0-R7之一
MOV B,@ Ri;将工作寄存器 Ri (Ri为 R0
或 R1)所指的内存单元内容送寄存器 B
MOV Rn,# data; 8位立即数 data送 Rn,
Rn为 R0-R7之一
MOV Rn,direct ;将 RAM区 direct单元的内容送 Rn,Rn为 R0-R7之一
MOV direct,A ; 将 A中内容送 RAM区
direct单元
MOV direct,@ Ri ;将 Ri (R0或 R1)所指单元的内容送 direct
MOV direct2,direct1 ;将 direct1单元的内容送 direct2单元
MOV @ Ri,#data ; 将 8位立即数送到 Ri所指的 RAM单元
MOV DPTR,#data ; 将 16位立即数送入数据指针寄存器
3.4.2累加器传输指令
字符交换指令
XCH A,direct ;将 direct单元内容和 A
的内容交换
XCH A,Rn; n为 0-7之一,将工作寄存器 Rn的内容和 A的内容交换
XCH A,@ Ri; Ri为 R0或 R1,将 Ri所指单元的内容和 A的内容互换
累加器高 4位和低 4位交换指令
SWAP A ; A的高 4位和低 4位互换
累加器低 4位和内存单元低 4位半字节交换指令
XCHD A,@ Ri ; Ri为 R0或 R1,将 Ri所指单元的低 4位与 A的低 4位互换,高 4位不变。
累加器和外部数据存储器数据传输指令
MOVX A,@ Ri ; Ri为 R0或 R1,将 Ri所指外部存储器单元内容送 A
MOVX @ Ri,A ; Ri为 R0或 R1,将 A中内容送 Ri所指外部存储器单元
MOVX A,@ DPTR ;将 16位指针 DPTR所指外部存储器单元内容送 A
MOVX @ DPTR,A;将 A中内容送 DPTR所指外部存储器单元
查表指令
MOVC A,@ A+PC ;将 PC值和 A的内容相加,所得值作为新地址,将此地址单元内容送 A
MOVC A,@ A+DPTR;将 DPTR中的 16
位地址和 A中内容相加得新地址,把此地址内容送 A
查表指令将 PC或 DPTR作为首地址,将累加器的内容作为位移量,可用来对程序存储器中所存的表格进行检索。
堆栈指令
PUSH direct ;先将 SP加 1,再将 direct所指单元内容推入 SP+1所指的堆栈单元
PUSH DPH;先将 SP加 1,再将数据指针高位
DPH推入堆栈 SP+1单元
PUSH DPL ;先将 SP加 1,再将数据指针低位 DPL推入堆栈 SP+1单元
POP direct;先将 SP单元的内容弹出到 direct单元,再将 SP减 1
POP DPH ;先将栈顶 SP的内容弹出到数据指针的高 8位 DPH,再将 SP减 1
POP DPL;先将栈顶 SP的内容弹出到数据指针的低 8位 DPL,再将 SP减 1
3.5算术运算指令
3.5.1加法指令
一般加法指令
带进位的加法指令
增量指令
3.5.2 减法指令
带借位的减法指令
减量指令
3.5.3 乘法指令和除法指令
MUL AB ;将累加器 A和寄存器 B中的两个
8位无符号数相乘,得 16位积,低 8位在 A
中,高 8位在 B中
DIV AB ;将累加器 A中的 8位无符号数除以 B寄存器的 8位无符号数,商在 A中,余数在 B中。
3.6 逻辑运算指令
3.6.1单操作数指令
CLR A ; A清 0,不影响标志位
CPL A ; A中内容逐位取反
RR A ; A中内容循环右移一位,
最低位 D0移到 D7
RRC A ; CY进入 A的最高位,
A的最低位进入 CY,D2进入 D1等
RL A ; A中内容循环左移一位,
即 D7移到 D0,D0移到 D1等。
RLC A ; A的最高位进入 CY,
原 CY进入 A的最低位 D0,D0进入 Dl等
3.6.2 双操作数指令
逻辑与指令
逻辑或指令
3.6.3逻辑异或指令
XRL A,Rn ;
XRL A,@ Ri ;
XRL A,#data ;
XRL A,direct ;
XRL direct,A ;
XRL direct,#data ;
3.7转移控制指令
3.7.1调用和返回指令
3.7.2无条件转移指令
3.7.3条件转移指令
3.7.4 比较转移指令
3.7.5 循环转移指令
3.8空操作指令
NOP ; 空操作指令用一个机器周期,它的功能只是使 PC值加 1,CPU不做任何操作。 NOP指令一般用作延迟。
3.9位处理指令
位传送指令
位控制指令
位逻辑运算指令
位转移指令
3.10 伪指令汇编语言必须经汇编变成机器语言计算机才能执行,汇编程序对用汇编语言编写的源程序进行汇编时,
还要提供一些汇编用的指令,例如要指定程序或数据存放的起始地址;要给一些连续存放的数据确定单元等等。但是,这些指令在汇编时不产生目标代码,不影响程序的执行,所以称为伪指令。