单片机笔记(二)

第三章 指令系统

3.1 概念

  • 指令:是指 CPU 根据人的意图来执行某种操作的命令。一台计算机所能执行的全部指令的 集合称为这个 CPU 的指令系统。
  • 机器语言:是用二进制编码表示每条指令,是计算机能直接识别和执行的语言。用机器语言编写的程序称为机器语言程序指令程序(机器码程序),又称目标程序
  • 89C51 单片机是 8 位机,其机器语言以 8 位二进制码为 单位(称为 1 字节) 。89C51 指令有单字节、双字节或 3 字节几种。
  • 汇编语言是用助记符符号数字等来表示指令的程序语言, 容易理解和记忆。
汇编语言程序 机器语言程序
MOVA , #0AH 74 0AH
ADDA, #14H 24 14H

3.2 指令格式

  • 89C51 汇编语言指令由【操作码助记符字段】和【操作数字段】两部分组成。
    (1)指令格式如下: 操作码 〔目的操作数〕〔,源操作数〕

    1. 操作码部分:规定了指令所实现的操作功能 。
    2. 操作数部分:指出了参与操作的数据来源和操作结果存放的目的单元。
      1. 操作数可以直接是 一个数(立即数)
      2. 也可以是一个数据所在的空间地址, 即在执行指令时从指定的地址空间取出操作数

    (2)例如: MOVA , #00H

  • 89C51 指令系统中, 有单字节、双字节或 三字节指令。
    (1)单字节指令:单字节指令中的 8 位二进制代码既包含操作码的信息, 也包含操作数的信息。89C51 单片机共有 49 条单字节指令。这种指令有两种情况。

    1. 由指令码中的 rrr 三位的不同编码指定某一个寄存器
      1. 指令码格式为: 1 1 1 0 1 r r r。
      2. 其中,高 5 位为操作内容———传送; 最低 3 位 rrr 的不同组合编码用来表示从哪一个寄存器 (R0~R7 )取数
    2. 指令码中隐含着对某一个寄存器的操作。

    (2)双字节指令:用一字节表示操作码,另一字节表示操作数或操作数所在的地址。89C51 中有 45 条双字节指令

    1. 指令格式为: 〔操作码〕 〔立即数或地址〕

    (3)三字节指令:其中,一字节操作码,两字节操作数。89C51 单片机共有 3 字节指令 17 条

    1. 其格式如下: 〔操作码〕 〔立即数或地址〕〔立即数或地址〕

3.3 七种寻址方式

概述:
89C51 单片机寻址方式共有 7 种:

  1. 寄存器寻址;
  2. 直接寻址;
  3. 立即数寻址;
  4. 寄存器间接寻址;
  5. 变址寻址;
  6. 相对寻址;
  7. 位寻址。

【一】寄存器寻址:

  • 概念:寄存器寻址就是由指令指出寄存器组 R0~R7 中某一个或其他寄存器 ( A、B、DPTR 等) 的内容作为操作数。
    1. 例如:
      MOV A , R0 ; (R0) →A
      MOV P1, A ; ( A)→P1 口
      ADD A , R0 ; ( A) + (R0 )→A
    2. 寄存器的识别由操作码的低 3 位完成。其对应关系如下。
      单片机笔记(二)

【二】:直接寻址

  • 概念:指令中所给出的操作数是片内 RAM 单元的地址。直接寻址的地址占一字节,所以, 一条直接寻址方式的指令至少占内存两个单元。
    1. 例如: MOV A ,40H ; (40H )→A 。即:内部 RAM 40 H 单元的内容送入累加器 A。
    2. 在 89C51 中,使用直接寻址方式可访问片内 RAM 的 128 个单元以及所有的特殊功能寄 存器(SFR)。
    3. 对于特殊功能寄存器,既可以使用它们的地址,,也可以使用它们的名字。
      1. 例如: MOV A , P1 ; ( P1 口 ) →A 。是把 SFR 中 P1 口内容送 A 。

【三】:立即数寻址

  • 概念:指令操作码后面紧跟的是一字节或两字节操作数,用“ # ”号表示,以区别直接地址。
    1. 例如:
      MOV A , 3A H ; ( 3AH )→A 。表示把片内 RAM 中 3AH 这个单元的内容送累加器 A。
      MOV A , # 3A H ;3AH→A 。表示是把 3AH 这个数本身 送累加器 A。
    2. 89C51 有一条指令要求操作码后面紧跟的是两字节立即数, 即: MOV DPTR , # DATA16

【四】:寄存器间接寻址

  • 概念:操作数的地址事先存放在某个寄存器中,寄存器间接寻址是把指定寄存器的内容作为地址,由该地址所指定的单元内容作为操作数。
    1. 89C51 规定 R0 或 R1 为间接寻址寄存器,可寻址内部 RAM 低位地址的 128 字节单元内容。
    2. 还可采用数据指针 (DPTR) 作为间接寻址寄存 器,寻址外部数据存储器的 64 KB 空间, 但不能用这种寻址方式寻址特殊功能寄存器。
    3. 例如:
      将片内 RAM 65 H 单元的内容 47H 送 A , 可执行指令“MOV A , @R0”,其中 R0 中 内容为 65 H。

【五】:变址寻址

  • 概念:变址寻址是以某个寄存器的内容为基地址,然后在这个基地址的基础上加上地址偏移量形成真正的操作数地址。
    1. 在 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 大类:

  1. 数据传送指令(28 条) ;
  2. 算术运算指令(24 条) ;
  3. 逻辑运算及移位指令(25 条) ;
  4. 控制转移指令(17 条) ;
  5. 位操作指令或布尔操作(17 条)

3.4.1 数据传送指令

概述:

  1. 以累加器 A 为目的操作数的指令(4 条 ,即 4 种寻址方式)
  2. 以寄存器 Rn 为目的操作数的指令(3 条)
  3. 以直接地址为目的操作数的指令( 5 条)
  4. 以间接地址为目的操作数的指令( 3 条)
  5. 16 位数据传送指令( 1 条)
  6. 查表指令( 2 条)
  7. 累加器 A 与片外 RAM 传送指令( 4 条)
  8. 栈操作指令( 2 条)
    8.1 PUSH(入栈) 指令
    8.2 POP( 出栈)指令
  9. 交换指令( 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”指令在译 成机 器码时, 源地址在前,目的地址在后,
    1. 例 如: ”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 条指令。
  • 含义:
    1. 第 2 和第 4 两条指令以 DPTR 为片外数据存储器 16 位地址指针,寻址范围达 64 KB。其 功能是在 DPTR 所指定的片外数据存储器与累加器 A 之间传送数据。
    2. 第 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 位不变。