CPU中使用寄存器臨時存儲信息,這些信息可以是要處理的數據,也可以是指向要獲取的數據的地址。在8051中,有一個數據類型是8位的,從MSB(最高有效位)D7到LSB(最低有效位)D0。對於8位數據類型,任何大於8位的數據類型在處理之前都必須分解爲8位塊。
8051最廣泛使用的寄存器是A(累加器)、B、R0-R7、DPTR(數據指針)和PC(程序計數器)。所有這些寄存器都是8位的,除了DPTR和PC。
Storage Registers in 8051
我們將在這裡討論以下類型的存儲寄存器−
- Accumulator
- R register
- B register
- Data Pointer (DPTR)
- Program Counter (PC)
- Stack Pointer (SP)
Accumulator
累加器寄存器A用於所有算術和邏輯運算。如果累加器不存在,則每次計算的每個結果(加法、乘法、移位等)都將存儲在主存儲器中。訪問主存比訪問累加器之類的寄存器慢,因爲用於大主存的技術比用於寄存器的技術慢(但便宜)。
The "R" Registers
「R」寄存器是一組8個寄存器,即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」寄存器作爲臨時存儲值的方法。
The "B" Register
「B」寄存器與累加器非常相似,因爲它可以保存8位(1位元組)的值。「B」寄存器僅由兩個8051指令使用:MUL AB和DIV AB。爲了快速方便地將A乘或除以另一個數,您可以將另一個數存儲在「B」中並使用這兩條指令。除了使用MUL和DIV指令外,「B」寄存器還經常用作另一個臨時存儲寄存器,很像第九個R寄存器。
The Data Pointer
數據指針(DPTR)是8051唯一用戶可訪問的16位(2位元組)寄存器。累加器、R0–R7寄存器和B寄存器是1位元組值寄存器。DPTR用於指向數據。它被8051用來使用DPTR指示的地址訪問外部存儲器。DPTR是唯一可用的16位寄存器,通常用於存儲2位元組值。
The Program Counter
程序計數器(PC)是一個2位元組的地址,它告訴8051下一條要執行的指令在內存中的位置。當8051初始化時,PC在0000h開始,並且在每次執行指令後遞增。PC不總是遞增1。有些指令可能需要2或3個字節;在這種情況下,PC將增加2或3個字節。
分支、跳轉和中斷操作用下一個順序位置以外的地址加載程序計數器。啓動上電復位將導致寄存器中的所有值丟失。這意味著復位時PC的值爲0,迫使CPU從ROM位置0000獲取第一個操作碼。這意味著我們必須將upcode的第一個字節放在ROM位置0000中,因爲這是CPU希望找到第一條指令的地方。
The Stack Pointer (SP)
堆棧指針與除DPTR和PC之外的所有寄存器一樣,可以保存8位(1位元組)的值。堆棧指針告訴要從堆棧中移除下一個值的位置。當一個值被推送到堆棧上時,SP的值將遞增,然後將該值存儲在生成的內存位置。當從堆棧中彈出一個值時,該值將從SP指示的內存位置返回,然後SP的值將遞減。
這個操作順序很重要。當8051初始化時,SP將被初始化爲07h。如果同時將一個值推送到堆棧上,則該值將存儲在內部RAM地址08h中,因爲8051將首先遞增SP的值(從07h到08h),然後將所推的值存儲在該存儲器地址(08h)。SP被8051直接修改爲6個指令:PUSH、POP、ACALL、LCALL、RET和RETI。
ROM Space in 8051
有些8051的家族成員只有4K字節的片上ROM(如8751、AT8951);有些像AT89C52一樣有8K的ROM,有些家族成員有32K字節和64K字節的片上ROM,如達拉斯半導體。需要記住的一點是,8051系列的任何成員都不能訪問超過64K字節的操作碼,因爲8051中的程序計數器是16位寄存器(0000到FFFF地址)。
程序ROM在8051中的第一個位置具有0000H的地址,而最後一個位置可以根據晶片上ROM的大小而不同。在8051系列成員中,AT8951具有$k字節的片上ROM,其存儲器地址爲0000(第一位置)到0FFFH(最後位置)。
8051 Flag Bits and PSW Register
程序狀態字(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. |
We can select the corresponding Register Bank bit using RS0 and RS1 bits.
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, the carry flag − This carry flag is set (1) whenever there is a carry out from the D7 bit. It is affected after an 8-bit addition or subtraction operation. It can also be reset to 1 or 0 directly by an instruction such as "SETB C" and "CLR C" where "SETB" stands for set bit carry and "CLR" stands for clear carry.
AC, auxiliary carry flag − If there is a carry from D3 and D4 during an ADD or SUB operation, the AC bit is set; otherwise, it is cleared. It is used for the instruction to perform binary coded decimal arithmetic.
P, the parity flag − The parity flag represents the number of 1's in the accumulator register only. If the A register contains odd number of 1's, then P = 1; and for even number of 1's, P = 0.
OV, the overflow flag − This flag is set whenever the result of a signed number operation is too large causing the high-order bit to overflow into the sign bit. It is used only to detect errors in signed arithmetic operations.
Example
Show the status of CY, AC, and P flags after the addition of 9CH and 64H in the following instruction.
MOV A, #9CH
ADD A, # 64H