📜  嵌入式系统-寄存器

📅  最后修改于: 2021-01-07 05:47:16             🧑  作者: Mango


寄存器在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   ;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字节值。

计划柜台

程序计数器(Program Counter,PC)是一个2字节的地址,它告诉8051在存储器中可以找到下一条要执行的指令。 8051初始化时,PC从0000h开始,并在每次执行指令后递增。 PC并不总是递增1。某些指令可能需要2或3个字节;有些指令可能需要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通过6条指令直接修改SP:PUSH,POP,ACALL,LCALL,RET和RETI。

8051中的ROM空间

8051的某些家族成员仅具有4K字节的片上ROM(例如8751,AT8951);而其他的家族成员则只有4K字节。有些具有像AT89C52这样的8K ROM,还有一些具有32K字节和64K字节片上ROM的家族成员,例如Dallas Semiconductor。要记住的一点是,由于8051中的程序计数器是一个16位寄存器(0000至FFFF地址),因此8051系列的任何成员都不能访问超过64K字节的操作码。

8051内的程序ROM的第一个位置的地址为0000H,而最后一个位置可以根据芯片上ROM的大小而有所不同。在8051系列成员中,AT8951具有$ k字节的片上ROM,其存储器地址为0000(第一个位置)至0FFFH(最后一个位置)。

ROM空间

8051标志位和PSW寄存器

程序状态字(PSW)寄存器是8位寄存器,也称为标志寄存器。它为8位宽,但仅使用其中的6位。这两个未使用的位是用户定义的标志。四个标志称为条件标志,这意味着它们指示在执行指令后产生的条件。这四个是CY (传送), AC (辅助进位), P (奇偶校验)和OV (溢出)。 RS0和RS1位用于更改存储区寄存器。下图显示了程序状态字寄存器。

PSW寄存器包含反映CPU当前状态的状态位。

CY CA F0 RS1 RS0 OV P
CY PSW.7 Carry Flag
AC PSW.6 Auxiliary Carry Flag
F0 PSW.5 Flag 0 available to user for general purpose.
RS1 PSW.4 Register Bank selector bit 1
RS0 PSW.3 Register Bank selector bit 0
OV PSW.2 Overflow Flag
PSW.1 User definable FLAG
P PSW.0 Parity FLAG. Set/ cleared by hardware during instruction cycle to indicate even/odd number of 1 bit in accumulator.

我们可以使用RS0和RS1位选择相应的寄存器组位。

RS1 RS2 Register Bank Address
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位置1。否则清除。用于指令执行二进制编码的十进制算术。

  • P,奇偶校验标志-奇偶校验标志仅表示累加器寄存器中的1。如果A寄存器包含1的奇数,则P = 1;否则,P = 1。对于1的偶数,P = 0。

  • OV,溢出标志-每当有符号数运算的结果太大而导致高位溢出到符号位时,就设置此标志。它仅用于检测有符号算术运算中的错误。

在以下指令中添加9CH和64H后,显示CY,AC和P标志的状态。

MOV A,#9CH

添加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