嵌入式系统 - 寄存器

  • 简述

    CPU 中使用寄存器来临时存储信息,这些信息可以是要处理的数据,也可以是指向要获取的数据的地址。在8051中,有一种数据类型是8位,从MSB(最高有效位)D7到LSB(最低有效位)D0。对于 8 位数据类型,任何大于 8 位的数据类型都必须在处理之前分成 8 位块。
    8051 中使用最广泛的寄存器是 A(累加器)、B、R0-R7、DPTR(数据指针)和 PC(程序计数器)。所有这些寄存器都是 8 位的,除了 DPTR 和 PC。
  • 8051 中的存储寄存器

    我们将在这里讨论以下类型的存储寄存器 -
    • 累加器
    • 寄存器
    • B寄存器
    • 数据指针 (DPTR)
    • 程序计数器 (PC)
    • 堆栈指针 (SP)

    累加器

    累加器寄存器 A 用于所有算术和逻辑运算。如果累加器不存在,则每次计算(加法、乘法、移位等)的每个结果都将存储到主存储器中。访问主存储器比访问诸如累加器之类的寄存器慢,因为用于大主存储器的技术比用于寄存器的技术慢(但更便宜)。

    “R”寄存器

    “R”寄存器是一组八个寄存器,即 R0、R1 到 R7。这些寄存器在许多操作中用作辅助或临时存储寄存器。考虑 10 和 20 之和的示例。将变量 10 存储在累加器中,并将另一个变量 20 存储在寄存器 R4 中。要处理加法操作,请执行以下命令 -
    
    ADD A,R4
    
    执行该指令后,累加器将包含值 30。因此“R”寄存器是非常重要的辅助或 helper registers. 如果不是这些“R”寄存器,单独的累加器不会很有用。“R”寄存器用于临时存储值。
    让我们再举一个例子。我们将 R1 和 R2 的值相加,然后从结果中减去 R3 和 R4 的值。
    
    MOV A,R3   ;Move the value of R3 into the accumulator 
    ADD A,R4   ;Add the value of R4 
    MOV R5,A   ;Store the resulting value temporarily in R5 
    MOV A,R1   ;Move the value of R1 into the accumulator 
    ADD A,R2   ;Add the value of R2 
    SUBB A,R5  ;Subtract the value of R5 (which now contains R3 + R4)
    
    如您所见,我们使用 R5 来临时保存 R3 和 R4 的总和。当然,这不是计算 (R1 + R2) – (R3 + R4) 的最有效方法,但它确实说明了使用“R”寄存器作为临时存储值的方法。
    8位寄存器

    “B”寄存器

    “B”寄存器与累加器非常相似,因为它可以保存一个 8 位(1 字节)的值。“B”寄存器仅被两条 8051 指令使用:MUL ABDIV AB. 为了快速轻松地将 A 乘以或除以另一个数字,您可以将另一个数字存储在“B”中并使用这两个指令。除了使用 MUL 和 DIV 指令外,“B”寄存器通常用作另一个临时存储寄存器,很像第九个 R 寄存器。

    数据指针

    数据指针 (DPTR) 是 8051 唯一的用户可访问的 16 位(2 字节)寄存器。累加器、R0–R7 寄存器和 B 寄存器是 1 字节值寄存器。DPTR 用于指向数据。8051 使用它来使用 DPTR 指示的地址访问外部存储器。DPTR 是唯一可用的 16 位寄存器,通常用于存储 2 字节值。

    程序计数器

    程序计数器 (PC) 是一个 2 字节的地址,它告诉 8051 可以在内存中找到下一条要执行的指令。PC 在 8051 初始化时从 0000h 开始,每次执行指令后递增。PC 并不总是加 1。有些指令可能需要 2 或 3 个字节;在这种情况下,PC 将增加 2 或 3。
    Branch, jump, 和 interrupt操作使用除下一个顺序位置以外的地址加载程序计数器。激活上电复位将导致寄存器中的所有值丢失。这意味着复位时 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 直接通过 6 条指令修改 SP:PUSH、POP、ACALL、LCALL、RET 和 RETI。
  • 8051 中的 ROM 空间

    8051的一些家族成员只有4K字节的片上ROM(例如8751、AT8951);有些像AT89C52那样有8K ROM,也有一些像Dallas Semiconductor那样有32K字节和64K字节片上ROM的家族成员。要记住的一点是,8051 系列的任何成员都不能访问超过 64K 字节的操作码,因为 8051 中的程序计数器是一个 16 位寄存器(0000 到 FFFF 地址)。
    8051内部程序ROM的第一个地址为0000H,而最后一个位置根据芯片ROM的大小而不同。在 8051 家族成员中,AT8951 具有 $k 字节的片上 ROM,其内存地址为 0000(第一个位置)到 0FFFH(最后一个位置)。
    ROM空间

    8051 标志位和 PSW 寄存器

    程序状态字 (PSW) 寄存器是一个 8 位寄存器,也称为 flag register. 它有 8 位宽,但只使用了 6 位。两个未使用的位是user-defined flags. 四个标志被称为conditional flags,这意味着它们表示执行指令后产生的条件。这四个是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 位选择相应的 Register Bank 位。
    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 位;否则,它被清除。用于执行二进制编码十进制算术的指令。
    • 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