嵌入式系统 - 寄存器
寄存器用于在 CPU 中临时存储信息,这些信息可能是要处理的数据,也可能是指向要获取的数据的地址。在 8051 中,有一种数据类型是 8 位,从 MSB(最高有效位)D7 到 LSB(最低有效位)D0。对于 8 位数据类型,任何大于 8 位的数据类型在处理之前都必须分成 8 位块。
8051 中最广泛使用的寄存器是 A(累加器)、B、R0-R7、DPTR(数据指针)和 PC(程序计数器)。除 DPTR 和 PC 外,所有这些寄存器都是 8 位的。
8051 中的存储寄存器
我们将在这里讨论以下类型的存储寄存器 −
- 累加器
- R 寄存器
- B 寄存器
- 数据指针 (DPTR)
- 程序计数器 (PC)
- 堆栈指针 (SP)
累加器
累加器,即寄存器 A,用于所有算术和逻辑运算。如果没有累加器,则每次计算(加法、乘法、移位等)的每个结果都将存储到主存储器中。访问主存储器比访问寄存器(如累加器)慢,因为用于大型主存储器的技术比用于寄存器的技术慢(但更便宜)。
"R"寄存器
"R"寄存器是一组八个寄存器,即 R0、R1 至 R7。这些寄存器在许多操作中用作辅助或临时存储寄存器。考虑 10 和 20 之和的示例。将变量 10 存储在累加器中,将另一个变量 20 存储在寄存器 R4 中。要处理加法运算,请执行以下命令 −
ADD A,R4
执行此指令后,累加器将包含值 30。因此,"R"寄存器是非常重要的辅助寄存器或辅助寄存器。如果没有这些"R"寄存器,累加器本身就没什么用。"R"寄存器用于临时存储值。
让我们再举一个例子。我们将 R1 和 R2 中的值相加,然后从结果中减去 R3 和 R4 的值。
MOV A,R3 ;将 R3 的值移入累加器 ADD A,R4 ;添加 R4 的值 MOV R5,A ;将结果值暂时存储在 R5 中 MOV A,R1 ;将 R1 的值移入累加器 ADD A,R2 ;添加 R2 的值 SUBB A,R5 ;减去 R5 的值(现在包含 R3 + R4)
如您所见,我们使用 R5 暂时保存 R3 和 R4 的总和。当然,这不是计算 (R1 + R2) – (R3 + R4) 的最有效方法,但它确实说明了使用"R"寄存器作为临时存储值的方法。

"B"寄存器
"B"寄存器与累加器非常相似,因为它可以保存 8 位(1 字节)值。"B"寄存器仅由两个 8051 指令使用:MUL AB 和 DIV AB。要快速轻松地将 A 乘以或除以另一个数字,您可以将另一个数字存储在"B"中并使用这两个指令。除了使用 MUL 和 DIV 指令外,"B"寄存器还经常用作另一个临时存储寄存器,就像第九个 R 寄存器一样。
数据指针
数据指针 (DPTR) 是 8051 中唯一可供用户访问的 16 位(2 字节)寄存器。累加器、R0–R7 寄存器和 B 寄存器是 1 字节值寄存器。DPTR 用于指向数据。8051 使用它通过 DPTR 指示的地址访问外部存储器。DPTR 是唯一可用的 16 位寄存器,通常用于存储 2 字节值。
程序计数器
程序计数器 (PC) 是一个 2 字节地址,它告诉 8051 下一个要执行的指令在内存中的位置。8051 初始化时,PC 从 0000h 开始,每次执行指令后都会递增。PC 并不总是递增 1。某些指令可能需要 2 或 3 个字节;在这种情况下,PC 将递增 2 或 3。
分支、跳转和中断操作会将程序计数器加载到下一个连续位置以外的地址。激活上电复位将导致寄存器中的所有值丢失。这意味着 PC 的值在复位时为 0,从而强制 CPU 从 ROM 位置 0000 获取第一个操作码。这意味着我们必须将上行代码的第一个字节放在 ROM 位置 0000 中,因为这是 CPU 期望找到第一条指令的位置。
堆栈指针 (SP)
堆栈指针与除 DPTR 和 PC 之外的所有寄存器一样,可以保存 8 位(1 字节)值。堆栈指针指示下一个值从堆栈中移除的位置。当将值推送到堆栈上时,SP 的值会增加,然后将该值存储在结果内存位置。当从堆栈中弹出值时,该值会从 SP 指示的内存位置返回,然后 SP 的值会减少。
此操作顺序很重要。初始化 8051 时,SP 将被初始化为 07h。如果同时将一个值推送到堆栈,则该值将存储在内部 RAM 地址 08h 中,因为 8051 将首先增加 SP 的值(从 07h 到 08h),然后将推送的值存储在该内存地址(08h)中。8051 通过六条指令直接修改 SP:PUSH、POP、ACALL、LCALL、RET 和 RETI。
8051 中的 ROM 空间
8051 的一些家族成员只有 4K 字节的片上 ROM(例如 8751、AT8951);一些有 8K ROM,如 AT89C52,还有一些家族成员有 32K 字节和 64K 字节的片上 ROM,如 Dallas Semiconductor。需要记住的是,8051 系列的任何成员都无法访问超过 64K 字节的操作码,因为 8051 中的程序计数器是一个 16 位寄存器(地址为 0000 到 FFFF)。
8051 内部程序 ROM 的第一个位置的地址为 0000H,而最后一个位置可能因芯片上 ROM 的大小而异。在 8051 系列成员中,AT8951 具有 $k 字节的片上 ROM,其内存地址为 0000(第一个位置)到 0FFFH(最后一个位置)。

8051 标志位和 PSW 寄存器
程序状态字 (PSW) 寄存器是一个 8 位寄存器,也称为 标志寄存器。它有 8 位宽,但只使用了 6 位。两个未使用的位是 用户定义标志。其中四个标志称为 条件标志,这意味着它们指示执行指令后产生的条件。这四个是 CY(进位)、AC(辅助进位)、P(奇偶校验)和 OV(溢出)。位 RS0 和 RS1 用于更改组寄存器。下图显示了程序状态字寄存器。
PSW 寄存器包含反映 CPU 当前状态的状态位。
CY | CA | F0 | RS1 | RS0 | OV | - | P |
---|
CY | PSW.7 | 进位标志 |
AC | PSW.6 | 辅助进位标志 |
F0 | PSW.5 | 标志 0 可供用户用于一般用途。 |
RS1 | PSW.4 | 寄存器组选择器位 1 |
RS0 | PSW.3 | 寄存器组选择器位0 |
OV | PSW.2 | 溢出标志 |
- | PSW.1 | 用户可定义标志 |
P | PSW.0 | 奇偶校验标志。在指令周期内由硬件设置/清除,以指示累加器中 1 位的偶数/奇数。 |
我们可以使用 RS0 和 RS1 位选择相应的寄存器组位。
RS1 | RS2 | 寄存器组 | 地址 |
---|---|---|---|
0 | 0 | 0 | 00H-07H |
0 | 1 | 1 | 08H-0FH |
1 | 0 | 2 | 10H-17H |
1 | 1 | 3 | 18H-1FH |
CY,进位标志 − 只要 D7 位有进位,此进位标志就会被设置 (1)。8 位加法或减法运算后会受到影响。也可以通过"SETB C"和"CLR C"等指令直接将其重置为 1 或 0,其中"SETB"代表设置位进位,"CLR"代表清除进位。
AC,辅助进位标志 − 如果在 ADD 或 SUB 操作期间 D3 和 D4 有进位,则设置 AC 位;否则,清除 AC 位。它用于执行二进制编码的十进制算术的指令。
P,奇偶校验标志 − 奇偶校验标志仅表示累加器寄存器中的 1 的数量。如果 A 寄存器包含奇数个 1,则 P = 1;对于偶数个 1,P = 0。
OV,溢出标志 − 当有符号数运算的结果太大导致高位溢出到符号位时,将设置此标志。它仅用于检测有符号算术运算中的错误。
示例
在以下指令中添加 9CH 和 64H 后,显示 CY、AC 和 P 标志的状态。
MOV A, #9CH
ADD A, # 64H
Solution: 9C 10011100 +64 01100100 100 00000000 CY = 1 since there is a carry beyond D7 bit AC = 0 since there is a carry from D3 to D4 P = 0 because the accumulator has even number of 1's