尋址方式:尋址就是尋找操作數(shù)的地址。絕大多數(shù)指令執(zhí)行時都需要操作數(shù),因此就存在如何確定操作數(shù)地址的問題。所謂尋址方式就是通過什么途徑獲取操作數(shù)的方式。根據(jù)指令操作的需要,計算機(jī)總是提供多種尋址方式。一般來說,尋址方式越多計算機(jī)的尋址能力就越強(qiáng),但指令系統(tǒng)也就越復(fù)雜。
8051指令系統(tǒng)有7種尋址方式:寄存器尋址,直接尋址,寄存器間接尋址,立即尋址,基址寄存器加變址寄存器間接尋址,相對尋址,位尋址,下面分別介紹。
寄存器尋址
寄存器尋址:寄存器尋址就是操作數(shù)在寄存器中,因此指定了寄存器就得到了操作數(shù)。采用寄存器尋址方式的指令都是一字節(jié)的指令,指令中以符號名稱來表示寄存器。例如:MOV A R1 這條指令的功能是把工作寄存器R1的內(nèi)容傳送到累加器A中,由于操作數(shù)在R1中,因此指令中指定了R1,也就得到了操作數(shù)。
寄存器尋址方式的尋址范圍包括:工作寄存器組R0~R7,部分特殊寄存器ACC,B,DPTR等。
直接尋址
直接尋址:直接尋址就是在指令中直接給出操作數(shù)所在單元的真實地址。這里給出的操作數(shù)直接地址為8位二進(jìn)制地址。程序中一般用十六進(jìn)制數(shù)表示。例如:指令MOV A,30H 把內(nèi)部RAM單元30H中的數(shù)據(jù)傳送給累加器A,指令中30H就是操作數(shù)的直接地址。
直接尋址方式的尋址范圍包括:內(nèi)部數(shù)據(jù)存儲器低128單元,特殊功能寄存器。
特殊功能寄存器在指令的表示中除了可以以直接地址形式給出外,還可以以寄存器符號形式給出,如對累加器A,在指令中可使用其直接地址OEOH,也可使用其符號形式ACC。
立即尋址
立即尋址:立即尋址方式就是實際操作數(shù)作為指令的一部分,在指令中直接給出,取指令時,可在程序存儲器中直接取得操作數(shù)。
通常把出現(xiàn)在指令中的操作數(shù)稱為立即數(shù)。采用立即尋址方式的指令,在立即數(shù)前面加上立即尋址符“#”。例如指令MOV A,#30H中30H就是立即數(shù),指令功能為將30H賦給累加器A。
8051中除了一條指令需16位長的立即數(shù)外,其余都是8位的立即數(shù),這條16位的立即尋址指令是:MOV DPTR,#data16 指令的功能是將16位的立即數(shù)賦給數(shù)據(jù)指針DPTR寄存器。
寄存器間接尋址
寄存器間接尋址:寄存器間接尋址方式中,寄存器內(nèi)存放的是操作數(shù)的地址,即操作數(shù)是通過寄存器間接得到的,因此稱為寄存器間接尋址。
寄存器的間接尋址需要以寄存器符號的形式來表示,且在寄存器名稱前面加上間接尋址符號“@”。例如指令MOV A,@R0就使用了寄存器間接尋址方式,這條指令的意義為將地址指針R0指向的內(nèi)部數(shù)據(jù)存儲器單元中的數(shù)據(jù)送入累加器A中。
假設(shè)R0中內(nèi)容為30H,則此指令的功能是以R0寄存器的內(nèi)容30H為地址,把內(nèi)部RAM 30H單元中的內(nèi)容傳送給累加器A。
8051規(guī)定,采用R0、R1 DPTR作為間接尋址寄存器,可尋址片內(nèi)數(shù)據(jù)存儲器RAM的低128B單元和片外數(shù)據(jù)存儲器的低256單元。
采用DPTR作間址寄存器,可尋址片外數(shù)據(jù)存儲器的整個64KB地址空間。堆棧指針SP用于指示堆棧操作的地址,因此,PUSH和POP指令也是寄存器間接尋址。
基址寄存器加變址寄存器間接尋址
基址寄存器加變址寄存器間接尋址:這種尋址方式用于尋址程序存儲器的地址空間,它是以DPTR或PC作基址寄存器,以累加器A作為變址寄存器,以兩者的內(nèi)容之和形成的16位數(shù)作為操作數(shù)地址,也稱為變址尋址。
例如指令MOVC A,@A+DPTR就是變址尋址,其功能為把DPTR和A的內(nèi)容之和作為程序存儲器的地址,再將程序存儲器中該地址單元的內(nèi)容傳送給累加器A。
假如執(zhí)行指令前,A=30H。 DPTR=22F1H。根據(jù)本尋址方式形成的操作數(shù)地址為22F1H+30H=2321H。程序存儲器ROM的地址單元2321H中內(nèi)容為68H。故指令執(zhí)行結(jié)果為A的內(nèi)容變?yōu)?8H。
這種尋址方式是專門針對程序存儲器的尋址方式。基址寄存器不同,其尋址范圍不同。
用PC作基址寄存器時,尋址范圍為以當(dāng)前PC值為起始的256B。
MOVC A,@A+PC 尋址范圍為64KB程序存儲器空間。
采用這種尋址方式的指令只有3條。MOVC A,@A+DPTR MOVC A,@A+PC JMP @A+DPTR前2條是程序存儲器讀指令,也稱查表指令。后1條是無條件轉(zhuǎn)移指令,又叫散轉(zhuǎn)指令。
相對尋址
相對尋址:相對尋址方式是為實現(xiàn)程序的相對轉(zhuǎn)移而設(shè)計,由相對轉(zhuǎn)移指令所采用。在這種尋址方式下,將程序計數(shù)器PC的當(dāng)前值加上由指令中給出的偏移量rel,從而構(gòu)成了程序轉(zhuǎn)移的目的地址。
這里應(yīng)注意,PC的當(dāng)前值為該相對轉(zhuǎn)移指令的下一條指令的地址。因而轉(zhuǎn)移目的地地址可表示如下:目的地址=轉(zhuǎn)移指令地址+轉(zhuǎn)移指令字節(jié)數(shù)+rel,相對地址的偏移量rel是一個8位帶符號二進(jìn)制補(bǔ)碼,范圍為+127—-128。即相對尋址時,向前可跳轉(zhuǎn)127字節(jié),向后可跳轉(zhuǎn)128字節(jié)。
例如在程序存儲器地址2000H處有一條采用相對尋址方式的兩字節(jié)轉(zhuǎn)移指令JC 35H,并且在執(zhí)行此指令前進(jìn)位CY=1,按照指令的功能應(yīng)發(fā)生相對轉(zhuǎn)移JC 35H為兩字節(jié)指令,因此在計算目的地址時,PC的當(dāng)前值為下一條指令的地址2002H,偏移量為35H,因此計算出的目的地址為2037H,將它賦給PC,則程序轉(zhuǎn)移到2037H地址繼續(xù)運(yùn)行。
位尋址
位尋址:8051具有獨(dú)立的位處理機(jī)即布爾處理機(jī),對尋址的位進(jìn)行處理。相應(yīng)的,在指令系統(tǒng)中有一類位操作指令,它們僅允許采用位尋址方式,直接尋址內(nèi)部數(shù)據(jù)存儲器16個字節(jié)單元的128個位,以及特殊功能寄存器中可直接尋址的位,可位尋址的各位都具有獨(dú)立的8位二進(jìn)制表示的位地址。
在布爾處理機(jī)中,以進(jìn)位位CY作為位累加器。例如指令A(yù)NL C,31H就是一條位尋址指令,其功能是布爾累加器C的值與位地址31H中的值進(jìn)行邏輯“與”操作。
位尋址方式的尋址范圍是內(nèi)部ROM中字節(jié)地址20H~2FH的16字節(jié)單元共128個二進(jìn)制位,位地址為00~7FH。在8051中,位地址的表示可以采用下面幾種形式:
直接使用位地址表示 ,例如進(jìn)位位CY的位地址為0D7H。
采用字節(jié)單元地址加位的表示法,如20H.5,表示字節(jié)單元地址20H的位5。這種表示法可以避免查表或計算,比較方便。對可位尋址的特殊功能寄存器可直接用寄存器名稱加位的方法。如以PSW.7表示進(jìn)位位CY,以ACC.5表示累加器ACC的第五位。
使用位名稱:在可位尋址的特殊功能寄存器中,一些位是有符號名稱的,例如PSW中位5是F0標(biāo)志,可用直接F0表示該位,進(jìn)位位可用CY表示等。