嵌入式系統 - 暫存器



暫存器用於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 Bit registers

“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(最後一個位置)。

ROM Space

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 
廣告