尋址模式指的是如何對給定的內存位置進行尋址。執行此指令有五種不同的方式或五種尋址模式,如下所示;
- Immediate addressing mode
- Direct addressing mode
- Register direct addressing mode
- Register indirect addressing mode
- Indexed addressing mode
Immediate Addressing Mode
讓我們從一個例子開始。
MOV A, #6AH
一般來說,我們可以寫,
MOV A, #data
它被稱爲立即數,因爲8位數據立即傳輸到累加器(目標操作數)。
下圖描述了上述指令及其執行。操作碼74H保存在0202地址。數據6AH保存在程序存儲器的0203地址。在讀取操作碼74H之後,下一個程序存儲器地址處的數據被傳送到累加器A(E0H是累加器的地址)。由於指令爲2位元組,且在一個周期內執行,因此程序計數器將增加2,並指向程序存儲器的0204。
注意−6AH之前的「#」符號表示操作數是數據(8位)。如果沒有「35;」,則十六進位數將被視爲地址。
Direct Addressing Mode
這是處理操作數的另一種方法。這裡,數據(源數據)的地址作爲操作數給出。舉個例子。
MOV A, 04H
寄存器組#0(第四個寄存器)具有地址04H。當執行MOV指令時,存儲在寄存器04H中的數據被移動到累加器。當寄存器04H保存數據1FH時,1FH被移到累加器。
注意−我們沒有在直接尋址模式中使用「#」,這與立即尋址模式不同。如果我們使用了「35;」,那麼數據值04H將被傳輸到累加器,而不是1FH。
現在,請看下圖。它顯示了指令是如何執行的。
如上圖所示,這是一個2位元組指令,需要1個周期才能完成。PC將增加2,並指向0204。指令MOV A的操作碼,地址爲E5H。當在0202執行指令(E5H)時,累加器被激活並準備接收數據。然後,PC轉到下一個地址0203,查找源數據(要傳輸到累加器)所在位置04H的地址。在04H,控制項找到數據1F並將其傳輸到累加器,從而完成執行。
Register Direct Addressing Mode
在這種尋址模式下,我們直接使用寄存器名(作爲源操作數)。讓我們試著用一個例子來理解。
MOV A, R4
一次,寄存器可以接受從R0到R7的值。有32個這樣的寄存器。爲了使用只有8個變量的32個寄存器來尋址寄存器,使用寄存器組。從0到3有4個註冊銀行。每個銀行由8個寄存器組成,從R0到R7命名。
一次只能選擇一個寄存器組。通過名爲「處理器狀態字」(PSW)的特殊功能寄存器(SFR),可以選擇寄存器組。PSW是一個8位SFR,每個位都可以根據需要進行編程。位從PSW.0指定到PSW.7。PSW.3和PSW.4用於選擇註冊銀行。
現在,請看下面的插圖,清楚地了解它是如何工作的。
操作碼EC用於MOV A、R4。操作碼存儲在地址0202,當它被執行時,控制直接轉到相關寄存器組的R4(在PSW中選擇)。如果選擇寄存器組0,則寄存器組0的R4中的數據將移動到累加器。這裡2F存儲在04H。04H表示註冊銀行0的R4地址。
數據(2F)移動以粗體突出顯示。2F從數據存儲器位置0ch傳輸到累加器,並顯示爲虛線。0CH是註冊銀行1的寄存器4(R4)的地址位置。上面的指令是1位元組,需要1個周期才能完成執行。意思是,你可以使用寄存器直接尋址模式來節省程序內存。
Register Indirect Addressing Mode
在這種尋址模式下,數據的地址作爲操作數存儲在寄存器中。
MOV A, @R0
這裡,R0中的值被視爲一個地址,它保存要傳輸到累加器的數據。示例:如果R0具有值20H,並且數據2FH存儲在地址20H,則在執行此指令後,值2FH將被傳輸到累加器。請參見下圖。
因此MOV A,@R0的操作碼是E6H。假設選擇了寄存器組0,則寄存器組0的R0保存數據20H。程序控制移到20H,在那裡它定位數據2FH,並將2FH傳輸到累加器。這是一條1位元組指令,程序計數器遞增1並移到程序存儲器的0203。
注意−只允許R0和R1組成寄存器間接尋址指令。換句話說,程式設計師可以使用@R0或@R1創建指令。允許所有註冊銀行。
Indexed Addressing Mode
我們將舉兩個例子來理解索引尋址模式的概念。看一下下面的說明;
MOVC A, @A+DPTR
和
MOVC A, @A+PC
where DPTR is the data pointer 和 PC is the program counter (both are 16-bit registers). Consider the first example.
MOVC A, @A+DPTR
The source oper和 is @A+DPTR. It contains the source data from this location. Here we are adding the contents of DPTR with the current content of the accumulator. This addition will give a new address which is the address of the source data. The data pointed by this address is then transferred to the accumulator.
The opcode is 93H. DPTR has the value 01FE, where 01 is located in DPH (higher 8 bits) 和 FE is located in DPL (lower 8 bits). Accumulator has the value 02H. Then a 16-bit addition is performed 和 01FE H+02H results in 0200 H. Data at the location 0200H will get transferred to the accumulator. The previous value inside the accumulator (02H) will be replaced with the new data from 0200H. The new data in the accumulator is highlighted in the illustration.
This is a 1-byte instruction with 2 cycles needed for execution 和 the execution time required for this instruction is high compared to previous instructions (which were all 1 cycle each).
另一個示例MOVC A,@A+PC的工作方式與上面的示例相同。這裡,程序計數器(PC)中的數據與累加器一起添加,以獲得目標地址,而不是與累加器一起添加DPTR。