单片机笔记(二)
第三章 指令系统
3.1 概念
- 指令:是指 CPU 根据人的意图来执行某种操作的命令。一台计算机所能执行的全部指令的 集合称为这个 CPU 的指令系统。
- 机器语言:是用二进制编码表示每条指令,是计算机能直接识别和执行的语言。用机器语言编写的程序称为机器语言程序或指令程序(机器码程序),又称目标程序。
- 89C51 单片机是 8 位机,其机器语言以 8 位二进制码为 单位(称为 1 字节) 。89C51 指令有单字节、双字节或 3 字节几种。
- 汇编语言是用助记符、符号和数字等来表示指令的程序语言, 容易理解和记忆。
汇编语言程序 | 机器语言程序 |
---|---|
MOVA , #0AH | 74 0AH |
ADDA, #14H | 24 14H |
3.2 指令格式
-
89C51 汇编语言指令由【操作码助记符字段】和【操作数字段】两部分组成。
(1)指令格式如下: 操作码 〔目的操作数〕〔,源操作数〕- 操作码部分:规定了指令所实现的操作功能 。
- 操作数部分:指出了参与操作的数据来源和操作结果存放的目的单元。
- 操作数可以直接是 一个数(立即数)
- 也可以是一个数据所在的空间地址, 即在执行指令时从指定的地址空间取出操作数
(2)例如: MOVA , #00H
-
89C51 指令系统中, 有单字节、双字节或 三字节指令。
(1)单字节指令:单字节指令中的 8 位二进制代码既包含操作码的信息, 也包含操作数的信息。89C51 单片机共有 49 条单字节指令。这种指令有两种情况。-
由指令码中的 rrr 三位的不同编码指定某一个寄存器。
- 指令码格式为: 1 1 1 0 1 r r r。
- 其中,高 5 位为操作内容———传送; 最低 3 位 rrr 的不同组合编码用来表示从哪一个寄存器 (R0~R7 )取数
- 指令码中隐含着对某一个寄存器的操作。
(2)双字节指令:用一字节表示操作码,另一字节表示操作数或操作数所在的地址。89C51 中有 45 条双字节指令
- 指令格式为: 〔操作码〕 〔立即数或地址〕
(3)三字节指令:其中,一字节操作码,两字节操作数。89C51 单片机共有 3 字节指令 17 条
- 其格式如下: 〔操作码〕 〔立即数或地址〕〔立即数或地址〕
-
由指令码中的 rrr 三位的不同编码指定某一个寄存器。
3.3 七种寻址方式
概述:
89C51 单片机寻址方式共有 7 种:
- 寄存器寻址;
- 直接寻址;
- 立即数寻址;
- 寄存器间接寻址;
- 变址寻址;
- 相对寻址;
- 位寻址。
【一】寄存器寻址:
- 概念:寄存器寻址就是由指令指出寄存器组 R0~R7 中某一个或其他寄存器 ( A、B、DPTR 等) 的内容作为操作数。
- 例如:
MOV A , R0 ; (R0) →A
MOV P1, A ; ( A)→P1 口
ADD A , R0 ; ( A) + (R0 )→A - 寄存器的识别由操作码的低 3 位完成。其对应关系如下。
- 例如:
【二】:直接寻址
- 概念:指令中所给出的操作数是片内 RAM 单元的地址。直接寻址的地址占一字节,所以, 一条直接寻址方式的指令至少占内存两个单元。
- 例如: MOV A ,40H ; (40H )→A 。即:内部 RAM 40 H 单元的内容送入累加器 A。
- 在 89C51 中,使用直接寻址方式可访问片内 RAM 的 128 个单元以及所有的特殊功能寄 存器(SFR)。
- 对于特殊功能寄存器,既可以使用它们的地址,,也可以使用它们的名字。
- 例如: MOV A , P1 ; ( P1 口 ) →A 。是把 SFR 中 P1 口内容送 A 。
【三】:立即数寻址
- 概念:指令操作码后面紧跟的是一字节或两字节操作数,用“ # ”号表示,以区别直接地址。
- 例如:
MOV A , 3A H ; ( 3AH )→A 。表示把片内 RAM 中 3AH 这个单元的内容送累加器 A。
MOV A , # 3A H ;3AH→A 。表示是把 3AH 这个数本身 送累加器 A。 - 89C51 有一条指令要求操作码后面紧跟的是两字节立即数, 即: MOV DPTR , # DATA16
- 例如:
【四】:寄存器间接寻址
- 概念:操作数的地址事先存放在某个寄存器中,寄存器间接寻址是把指定寄存器的内容作为地址,由该地址所指定的单元内容作为操作数。
- 89C51 规定 R0 或 R1 为间接寻址寄存器,可寻址内部 RAM 低位地址的 128 字节单元内容。
- 还可采用数据指针 (DPTR) 作为间接寻址寄存 器,寻址外部数据存储器的 64 KB 空间, 但不能用这种寻址方式寻址特殊功能寄存器。
- 例如:
将片内 RAM 65 H 单元的内容 47H 送 A , 可执行指令“MOV A , @R0”,其中 R0 中 内容为 65 H。
【五】:变址寻址
- 概念:变址寻址是以某个寄存器的内容为基地址,然后在这个基地址的基础上加上地址偏移量形成真正的操作数地址。
- 在 89C51 中,用变址寻址方式只能访问程序存储器,,访问的范围为 64 KB。
【六】:相对寻址
- 概念:相对寻址只出现在相对转移指令中。相对转移指令执行时, 是以当前的 PC 值加上指令 中规定的偏移量 r el 而形成实际的转移地址。
【七】:位寻址:
- 概念:采用位寻址方式的指令的操作数将是 8 位二进制数中的某一位。指令中给出的是位地 址,即片内 RAM 某一单元中的一位。位地址在指令中用 bit 表示。
1. 寻址方式中的符号注释
符号 | 意思 |
---|---|
Rn(n=0~7) | 当前选中的工作寄存器R0~R7 |
Ri (i=0,1) | 工作寄存器R0或R1 |
#data | 8为立即数 |
#data16 | 16位立即数 |
direct | 8 位片内 RAM 单元( 包括 SFR)的直接地址 |
addr11 | 11 位目的地址, 用于 ACALL 和 AJMP 指令中 |
addr16 | 16 位目的地址, 用于 LCALL 和 LJMP 指令中 |
rel | 补码形式的 8 位地址偏移量, 以下条指令第一字节地址为基值 |
bit | 片内 RAM 或 SFR 的直接寻址位地址。 |
-> | 指令操作流程,将箭头左边的内容送入箭头右边的单元。 |
3.4 89C51 单片机的指令系统
概述:
89C51 指令系统可分为 5 大类:
- 数据传送指令(28 条) ;
- 算术运算指令(24 条) ;
- 逻辑运算及移位指令(25 条) ;
- 控制转移指令(17 条) ;
- 位操作指令或布尔操作(17 条)
3.4.1 数据传送指令
概述:
- 以累加器 A 为目的操作数的指令(4 条 ,即 4 种寻址方式)
- 以寄存器 Rn 为目的操作数的指令(3 条)
- 以直接地址为目的操作数的指令( 5 条)
- 以间接地址为目的操作数的指令( 3 条)
- 16 位数据传送指令( 1 条)
- 查表指令( 2 条)
- 累加器 A 与片外 RAM 传送指令( 4 条)
- 栈操作指令( 2 条)
8.1 PUSH(入栈) 指令
8.2 POP( 出栈)指令- 交换指令( 4 条)
- 所谓【传送】,是把源地址单元的内容传送到目的地址单元中去,而源地址单元内容不变; 或者源、目的单元内容互换。
- MOV:传送( MOVE, 移动)指令的操作助记符。这类指令的功能是, 将源字节的内容传 送到目的字节,源字节的内容不变
【一】以累加器 A 为目的操作数的指令(4 条 ,即 4 种寻址方式)
- 含义:将第二操作数所指定的工作寄存器 Rn( 即 R0~R7 )内容、直接寻址或间接寻 址(Ri 为 R0 或 R1)所得的片内 RAM 单元或特殊功能寄存器中的内容以及立即数传送到由 第一操作数所指定的累加器 A 中
- 上述操作不影响源字节和任何别的寄存器内容,只影响 PSW 的 P 标志位。
【二】以寄存器 Rn 为目的操作数的指令(3 条)
- 含义:这组指令的功能是把源操作数所指定的内容送到当前工作寄存器组 R0~R7 中的某个寄 存器。源操作数有寄存器寻址、直接寻址和立即数寻址 3 种方式。
- 89C51 指令系统中没有“MOV Rn, Rn”传送指令。
【三】以直接地址为目的操作数的指令( 5 条)
- 含义:这组指令的功能是把源操作数所指定的内容送入由直接地址 direct 所指出的片内存储单 元中。源操作数有寄存器寻址、直接寻址、寄存器间接寻址和立即数寻址等方式。
- 注意:“MOV direct , dir ect”指令在译 成机 器码时, 源地址在前,目的地址在后,
- 例 如: ”MOV A0H , 90H”的机器码为:8590A0
【四】以间接地址为目的操作数的指令( 3 条)
- (Ri)表示 Ri 中的内容为指定的 RAM 单元。
【五】16 位数据传送指令( 1 条)
- 含义:这是惟一的 16 位立即数传送指令,其功能是把 16 位常数送入 DPTR。DPTR 由 DP H 和 DPL 组成。这条指令执行的结果是,将高 8 位立即数 dataH 送入 DPH , 低 8 位立即数 dataL 送入 DPL。在译成机器码时,也是高位字节在前,低位字节在后。
【六】查表指令( 2 条)
- 在 89C51 指令系统中,有 2 条极为有用的查表指令, 其数据表格放在程序存储器中
【七】累加器 A 与片外 RAM 传送指令( 4 条)
- 在 89C51 指令系统中,CPU 对片外 RAM 或片外 I/ O 外设芯片的访问只能用寄存器间接寻址的方式,且仅有 4 条指令。
- 含义:
- 第 2 和第 4 两条指令以 DPTR 为片外数据存储器 16 位地址指针,寻址范围达 64 KB。其 功能是在 DPTR 所指定的片外数据存储器与累加器 A 之间传送数据。
- 第 1 和第 3 两条指令是用 R0 或 R1 作低 8 位地址指针,由 P0 口送出,寻址范围是 256 字节( 此时, P2 口仍可用作通用 I/ O 口) 。这两条指令完成以 R0 或 R1 为地址指针的片外数据存储器与累加器 A之间 的数据传送。
【八】栈操作指令(2条)
-
入栈:
-
含义:入栈操作进行时,栈指针( SP) + 1 指向栈顶的上一个空单元,将直接地址( direct )寻址的单元内容压入当前 SP 所指示的堆栈单元中。本操作不影响标志位。
-
出栈:
-
含义:出栈操作将栈指针(SP)所指示的内部 RAM(堆栈) 单元中内容送入由直接地址寻址的单 元中,然后( SP) - 1→( SP) 。本操作不影响标志位。
【九】交换指令
-
字节交换指令:
-
含义:将第二操作数所指定的工作寄存器 Rn( R0~R7 ) 内容、直接寻址或间接寻址的单元内容 与累加器 A 中的内容互换。
-
半字节交换指令:
-
含义:将 Ri 间接寻址的单元内容与累加器 A 中内容的低 4 位互换, 高 4 位内容不变。该操作只影响标志位 P。 这条指令为低位字节交换指令。该指令将累加器 A 的低 4 位与 R0 或 R1 所指出的片内 RAM 单元的低 4 位数据相互交换, 各自的高 4 位不变。