嵌入式系统 - 寄存器
寄存器用于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”寄存器作为临时存储值的方式。
“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)。SP由8051通过六条指令直接修改:PUSH、POP、ACALL、LCALL、RET和RETI。
8051中的ROM空间
一些8051系列成员只有4KB的片上ROM(例如8751、AT8951);有些有8KB ROM,如AT89C52,还有一些系列成员有32KB和64KB的片上ROM,例如达拉斯半导体。需要记住的是,8051系列的任何成员都不能访问超过64KB的操作码,因为8051中的程序计数器是16位寄存器(0000到FFFF地址)。
8051内部程序ROM的第一个位置的地址为0000H,而最后一个位置可能因芯片上ROM的大小而异。在8051系列成员中,AT8951有4KB的片上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位加法或减法运算后受到影响。它也可以通过指令直接重置为1或0,例如“SETB C”和“CLR C”,其中“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