1. 程式人生 > >微控制器的幾種定址方式

微控制器的幾種定址方式

定址就是尋找指令中運算元或運算元所在的地址。所謂定址方式,就是如何找到存放運算元的地址,把運算元提取出來的方法。通常指源運算元的定址方式。

MCS-51系列微控制器定址方式共有七種:暫存器定址、直接定址、立即數定址、暫存器間接定址、變址定址、相對定址、位定址。

1、暫存器定址

暫存器定址是指運算元存放在某一暫存器中,指令中給出暫存器名,就能得到運算元。暫存器可以使用暫存器組R0~R7中某一個或其它暫存器(A,B,DPTR等)。

例如:

MOV A,R0 ;(R0 )→A

MOV P1,A ;(A)→P1

ADD A, R0 ;(A)+(R0) →A

2、直接定址

在指令中直接給出運算元所在的儲存單元的地址,稱為直接定址方式。在8051中,使用直接定址方式可訪問片內RAM的128個單元以及所有的特殊功能暫存器(SFR),對於特殊功能暫存器,既可以使用他們的地址,也可以使用他們的名字。

例如:

MOV A, 3AH ;(3AH) →A

又如:

MOV A, P1 ;(P1口) →A

也可寫為:

MOV A, 90H ; 90H是P1口的地址。

3、立即數定址

指令操作碼後面緊跟的是一位元組或兩位元組運算元,用 # 號表示,以區別直接地址。例如:

MOV A, #3AH ;3AH→A

MCS-51系列微控制器有一條指令,要求操作碼後面緊跟的是兩個位元組立即數,即

MOV DPTR, #DATA16

4、暫存器間接定址

暫存器中的內容是一個地址,由該地址單元定址到所需的運算元.

例如: MOV R1,#30H ;(R1)← 立即數30H

MOV @R1,#0FH ;(30H)←立即數0FH

MOV A,@R1 ;(A)←((30H))=#0FH

注意:

“間接”表示某暫存器中的“內容”只是一個“單元地址”,這個地址單元中存放的資料才是要找的“運算元”。

例如,指令MOV A,@R0執行的操作是將R0的內容作為內部RAM的地址,再將該地址單元中的內容取出來送到累加器A中,如圖所示。

5、變址定址 ,也稱為: 基址暫存器+變址暫存器間接定址

以16位的地址指標暫存器DPTR或 16位的PC暫存器為基址暫存器,以累加器 A 為變址暫存器,兩者中的“內容”形成一個16位的“地址”,該“地址”所指的儲存單元中的內容才是運算元。用變址定址方式只能訪問程式儲存器,訪問的範圍為64KB,當然,這種訪問只能從ROM中讀取資料而不能寫入。

例如: MOVC A, @A+DPTR ;((A)+ (DPTR))→A

設:A中已存有#30H,DPTR中已存有#1000H

MOVC A,@A+DPTR;(A)←((A)+(DPTR))

操作:將30H+1000H=1030H單元中的數放進累加器A

6、相對定址

相對定址只出現在相對轉移指令中。相對轉移指令執行時,是以當前的PC值加上指令中規定的偏移量rel而形成實際的轉移地址。這裡所說得PC的當前值是執行完相對轉移指令後的PC值,一般將相對轉移指令操作碼所在的地址稱為源地址,轉移後的地址稱為目的地址。於是有:目的地址=源地址+2(相對轉移指令位元組數)+rel

51微控制器指令系統中相對轉移指令既有雙位元組的,也有三位元組的。

7、位定址

採用位定址方式的指令,運算元是8位二進位制數中的某一位。指令中給出的是位地址,是片內RAM某個單元中的某一位的地址。位地址在指令中用bit表示。

例: CLR P1.0 ;(P1.0) ← 0

SETB ACC.7 ;(ACC.7)← 1

CPL C ;( C )← NOT( C )

位地址常用下列三種方式表示;

(1)直接使用位地址表示。對於20H~2FH的16個單元共128位,位地址分佈是00H~7FH。

(2)對於特殊功能暫存器,可以直接用暫存器名字加位數表示,如PSW.3、ACC.5等。

(3)對於定義了位名字的特殊位,可以直接用其位名錶示,例如:CY、AC等。

定址方式及對應儲存器空間

定址方式 定址空間
立即數定址 程式儲存器ROM、資料儲存器RAM
直接定址 片內RAM低128B,特殊功能暫存器
暫存器定址 通用暫存器R0---R7,其他暫存器A、B、DPTR
暫存器間接定址 片內RAM低128B【@R0、@R1、SP(僅PUSH、POP)】 片外RAM(@R0、@R1、@DPTR)
變址定址 程式儲存器、資料儲存器、(@A+PC、@A+DPTR)
相對定址 程式儲存器256B(PC+偏移量)
位定址 片內RAM的20H---2FH位元組地址、部分特殊功能暫存器

定址方式中常用符號註釋

(1) Rn(n=0~7) 當前選中的工作暫存器R0~R7 。

(2) Ri(i=0,1) 當前選中的工作暫存器組中,可作為間址暫存器

的兩個工作暫存器R0、R1。

(3) #data 8位立即數。

(4) # data16 16位立即數。

(5) direct 8位片內RAM單元(包括SFR)的直接地址。

(6) addr11 11位目的地址,用於ACALL和AJMP指令中。

(7) addr16 16位目的地址,用於LCALL和LJMP指令中。

(8) rel 補碼形成的8位地址偏移量。

(9) bit 片內直接定址位地址。

(10)@ 間接定址方式中,表示間址暫存器的符號。

(11)/ 位操作指令中,表示對該位先取反再參與操作,但

不影響該位原值。

(12)(X) 表示X中的內容。

(13)((X)) 由X指出的地址單元中的內容。

(14) → 指令操作流程,將箭頭左邊的內容送入箭頭右邊的單元。