单片机笔记(二)

第三章 指令系统

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 位不变。

3.4.2 算术运算指令

概述:

  1. 加法类指令(4条)
  2. 带进位加法指令( 4 条)
  3. 带借位减法指令( 4 条)
  4. 乘法指令( 1 条)
  5. 除法指令( 1 条)
  6. 加 1 指令( 5 条)
  7. 减 1 指令( 4 条)
  8. 十进制调整指令( 1 条)

【一】 加法类指令(4条):
在这里插入图片描述

  • 含义:这些指令是将工作寄存器、内部 RAM 单元内容或立即数的 8 位无符号二进制数和累加 器 A 中的数相加,所得的“和”存放于累加器 A 中。
    (1)上述指令的执行将影响标志位 AC、CY、OV 和 P。当然, 溢出标志位 OV 只有带符号数 运算时才有用。

    1. AC:(辅助进位标志位)如果低4位向高4位有进位,则AC=1,否则AC=0;
    2. CY:(进位标志位)最高位有进位,则CY=1,否则CY=0;
    3. P:(奇偶标志位)结果中1的个数为奇数,则P=1,否则P=0,。
    4. OV:(溢出标志位)次高位和最高位的标志做异或运算,为OV的值。
      1. 如果次高位有进位,则C6=1,否则C6=0。
      2. 如果最高位有进位,则C7=1,否则C7=0。
      3. C6和C7做异或运算,结果就是OV的结果。
      4. 注:只有:正+正、负+负,才能导致溢出。

    (2)必须是对累加器A进行操作。

【二】带进位加法指令( 4 条)
在这里插入图片描述

  • 含义:组指令的功能是同时把源操作数所指出的内容和进位标志位 CY 都加到累加器 A 中, 结果存放在 A 中,其余的功能和上面 ADD 指令相同。
    (1)本指令的执行将影响标志位 AC、CY、OV 和 P。
    (2)本指令常用于多字节加法。

【三】带借位减法指令( 4 条):
在这里插入图片描述
在这里插入图片描述

  • 含义:这组指令的功能是,从累加器 A 中减去源操作数所指出的内容及进位位 CY 的值,,差值保留在累加器 A 中。 即:先减CY位的值,再减操作数。
    (1)在多字节减法运算中,低字节差有时会向高字节产生借位 ( CY 置 1 ) ,所以在高字节运算时,就要用带借位减法指令。
    (2)由于 89C51 指令系统中没有不带借位的减法指令,,如果需要, 则可以在“SUBB”指令前用“CLR C”指令将 CY 清 0。这一点必须注意。
    (3) 此外,两个数相减时, 如果位 7 有借位,则 CY 置 1 ;否则清 0。若位 3 有借位, 则 AC 置 1; 否则清 0。两个带符号数相减,还要考查 OV 标志, 若 OV 为 1 , 表示差数溢出, 即破坏了正确 结果的符号位。

【四】乘法指令( 1 条)
在这里插入图片描述

  • 含义:这条指令的功能是,把累加器 A 和寄存器 B 中两个 8 位无符号数相乘, 所得 16 位积的低字节存放在 A 中,高字节存放在 B 中。
    (1)若乘积大于0FFH ,则 OV 置 1 ;否则清 0( 即 B 的内容 为 0)。CY 总是被清0

【五】除法指令( 1 条)
在这里插入图片描述

  • 含义:这条指令的功能是进行 A 除以 B 的运算,A 和 B 的内容均为 8 位无符号整数
    (1)指令操作后,整数商存于 A 中,余数存于 B 中。
    (2)CY 和 OV 均被清 0。若原 (B) = 00H ,则结果无法确定, 用OV = 1表示,而 CY 仍为 0。

【六】加 1 指令( 5 条)

在这里插入图片描述

  • 含义:这组指令的功能是将操作数所指定的单元内容加 1,其操作不影响 PSW。只影响P(奇偶标志位)
    (1)若原单元内容 为 FFH , 加 1 后溢出为 00 H , 也不会影响 PSW 标志。
    (2)另外,“INC A”和“ADD A , #01H”这两条指令都将累加器 A 的内容加 1 , 但后者对标志 位 CY 有影响。

【七】减 1 指令( 4 条)
在这里插入图片描述

  • 含义:这组指令的功能是将操作数所指的单元内容减 1,其操作不影响标志位 CY。
    (1)若原单元内 容为 00H ,则减 1 后为 FFH ,也不会影响标志位。其他情况与加 1 指令相同。

【八】十进制调整指令( 1 条)
在这里插入图片描述

  • 含义:这条指令跟在 ADD 或 ADDC 指令后, 且只能用于压缩 BCD 数相加结果的调整。将相加后存放在累加器 A 中的结果进行十进制调整,实现十进制加法运算功能。

  • 【含义解释】:本指令是对累加器 A 中的 BCD 数加法结果进行调整。两个压缩型 BCD 数按二进制数相加后,必须经本指令调整才能得到压缩型 BCD 数的和的正确值
    (1)操作过程为:

    1. 若累加器 A 的低 4 位数值大于 9 或者第 3 位向第 4 位产生进位 (即辅助进位位 AC 为 1) ,则需将 A 的低 4 位内容加 6 调整,,以产生低 4 位正确的 BCD 数值。 如果加 6 调整后,低 4 位产生进位, 且高 4 位均为 1,则内部加法置位 CY; 反之,,不清除 CY 标 志位。
    2. 若累加器 A 高 4 位的值大于 9 或进位位 CY = 1, 则高 4 位须加 6 调整,以产生高 4 位的 正确 BCD 数值。同样,在加 6 调整后产生最高进位,则置位 CY;反之, 不清除 CY。如果这时 CY 置位, 表示和的 BCD 数值≥100。这对多字节十进制加法有用, 不影响 OV 标志。

    (2)由此可见,执行“DA A”后,CPU 根据累加器 A 的原始数值和 PSW 的状态, 由硬件自动 对累加器 A 进行加 06 H、60H 或 66 H 的操作。

3.4.3 逻辑操作指令

【一】简单操作指令(2 条)

(1)累加器 A 清 0 指令
在这里插入图片描述

  • 含义:清 0 累加器 A , 只影响标志位 P。

(2)累加器 A 取反指令
在这里插入图片描述

  • 含义:对累加器 A 内容逐位取反,不影响标志位。

【二】移位指令( 4 条)

(1) 累加器 A 循环左移指令
在这里插入图片描述
(2)累加器 A 循环右移指令
在这里插入图片描述
(3)累加器 A 连同进位位循环左移指令
在这里插入图片描述
(4)累加器 A 连同进位位循环右移指令在这里插入图片描述

  • 含义:前两条指令的功能分别是,将累加器 A 的内容循环左移或右移一位; 后两条指令的功能 分别是,将累加器 A 的内容连同进位位 CY 一起循环左移或右移一位。

【三】累加器半字节交换指令
在这里插入图片描述

  • 含义:这条指令的功能是将累加器 A 的高低两半字节交换
    (1)例:( A) = FAH。 执行指令“SWAP A”的结果为( A) = AFH。

【四】逻辑“与”指令(6 条)
在这里插入图片描述

  • 含义:
    (1)前 4 条指令是将累加器 A 的内容和源操作数所指的内容按位进行逻辑“与”, 结果存放在 A 中。
    (2) 后两条指令是将直接地址单元中的内容和源操作数所指的内容按位进行逻辑“与”,结果 存入直接地址单元中。若直接地址正好是 I/ O 端口, 则为“读—修改—写”操作。
  • 作用:使某些位清零,其他位不变,或判断奇偶数。

【五】逻辑“或”指令(6 条)
在这里插入图片描述

  • 含义:这组指令的功能是,将两个指定的操作数按位进行逻辑“或”
    (1)前 4 条指令的操作结果存 放在累加器 A 中。
    (2)后两条指令的操作结果存放在直接地址单元中( 也具有“读—修改—写”操 作功能)

  • 作用:使某些位置1,其他位不变。
    【六】逻辑“异或”指令( 6 条)
    在这里插入图片描述
    在这里插入图片描述

  • 含义:这组指令的功能是。将两个指定的操作数按位 进行“异或”
    (1)前 4 条指令的结果存放在累加器 A 中。
    (2)后两条指令的操作结果存放在直接地址单元中 (同样为“读 - 修改 - 写”操作) 。

  • 作用:使某些位取反,其他位不变。

  • 这类指令的操作均只影响标志位 P。

3.4.4 控制程序转移类指令

计算 机运行过程中,有时因为操作的需要, 程序不能按顺序逐条执行指令,需要改变程序运行方向, 即将程序跳转到某个指定的地址, 再顺序执行下去。

概述:

  1. 无条件转移指令。
  2. 条件转移指令。
  3. 调用指令。
  4. 返回指令等。

所有这些指令的目标地址都是在 64 KB 程序存储器地址空间内。

【一】

  • 无条件转移指令( 4 条): 短转移、长转移、相对转移、间接转移(散转指令)
  • 概念:当程序执行到该指令时,程序无条件转移到指令所提供的地址处执行。

(1)短转移
在这里插入图片描述

(2)长转移
在这里插入图片描述

  • 含义:指令提供 16 位目标地址, 将指令的第 2 和第 3 字节地址码分别装入 PC 的高 8 位和低 8 位中,程序无条件转向指定的目标地址去执行。

(3)相对转移
在这里插入图片描述

  • 含义:该指令为双字节指令, 执行时先将 PC 内容加 2, 再加相对地址 rel,

(4)间接转移
在这里插入图片描述

  • 含义:该指令的转移地址由数据指针 DPTR 的 16 位数和累加器 A 的 8 位数进行无符号数相加 形成,并直接送入 PC。指令执行过程对 DPTR、A 和标志位均无影响。

【二】空操作指令( 1 条)

在这里插入图片描述

  • 含义:除 PC 加 1 外,不影响其他寄存器和标志位。NOP 指令常用来产 生一个机器周期的延迟。

【三】条件转移类指令( 8 条)

  • 根据给出的条件进行检测,若条件满足,则程序转向指定的目的地址(目的地址是以下一条指令的起始地址为中心的 - 128~ + 127 共 256 字节范 围)去执行。

(1)判零转移指令

在这里插入图片描述

  • 含义:JZ 和 JNZ 指令分别对累加器 A 的内容为全 0 和不为全 0 进行检测并转移,当不满足各自的条件时,程序继续往下执行。当各自的条件满足时( 相当于一条相对转移指令) ,程序转向指定的目标地址。

(2)比较转移指令

在这里插入图片描述
在这里插入图片描述

  • 含义:它的功能是对指定的目的字节和源字节进行比较,若它们的值不相等, 则转移。转移的目 标地址为当前的 PC 值加 3 后,再加指令的第 3 字节偏移量( rel)。若目的字节内的数大于源 字节内的数,则清 0 进位标志位 CY;若目的字节数小于源字节数, 则置位进位标志位 CY; 若 二者相等,则往下执行。本指令执行后不影响任何操作数。

(3)循环转移指令
在这里插入图片描述

  • 含义:程序每执行一次本指令,便将第一操作数的字节变量减 1,并判字节变量是否为 0。若不为0, 则转移到目标地址,继续执行循环程序段;若为 0, 则终止循环程序段的执行, 程序往下 执行。其中,rel 为相对于DJNZ 指令的下一条指令第一个字节的相对偏移量,用一个带符号的 8 位数表示。

【四】调用和返回指令

(1)短调用指令
在这里插入图片描述

(2) 长调用指令
在这里插入图片描述
(3)返回指令
在这里插入图片描述

发布了59 篇原创文章 · 获赞 47 · 访问量 5491

猜你喜欢

转载自blog.csdn.net/qq_44755403/article/details/104609349
今日推荐