📅  最后修改于: 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位。
我们将在这里讨论以下类型的存储寄存器-
累加器寄存器A用于所有算术和逻辑运算。如果不存在累加器,则每个计算的每个结果(加法,乘法,移位等)都将存储到主存储器中。对主存储器的访问比对累加器等寄存器的访问要慢,这是因为用于大型主存储器的技术比用于寄存器的技术要慢(但要便宜)。
“ 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”寄存器作为临时存储值的方法。
“ 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字节值。
程序计数器(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期望找到的位置。第一条指令。
像除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的某些家族成员仅具有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(最后一个位置)。
程序状态字(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