單片機(jī)指令尋址方式總結(jié)
操作數(shù)是指令的處理對(duì)象,是指令的重要組成部分。尋址方式是確定操作數(shù)存放位置的方式,是正確掌握指令使用方法的基礎(chǔ)。
MCS-51單片機(jī)指令有7種尋址方式,分別是立即數(shù)尋址、寄存器尋址、直接尋址、寄存器間接尋址、位尋址、變址尋址和相對(duì)尋址。
1立即數(shù)尋址
立即數(shù)是以“#”開頭的數(shù)字,如#10、#10010B、#13H、#1256H和#0ACH等。在指令中,立即數(shù)只能是源操作數(shù),不能是目的操作數(shù)。
【例3-10】立即數(shù)尋址。指令在ROM中的存放如下:
在指令“MOV A,#12H”中,立即數(shù)#12H是源操作數(shù),緊隨操作碼74H之后存放在ROM中。該指令執(zhí)行時(shí),單片機(jī)先從ROM中讀取操作碼74H,對(duì)操作碼74H解碼后,確定要進(jìn)行的操作是將一個(gè)8位立即數(shù)送入累加器A,接下來單片機(jī)從緊鄰操作碼的下一個(gè)存儲(chǔ)單元中取得立即數(shù)12H并送入累加器A。另外,該指令的目的操作數(shù)累加器A隱含在操作碼中,沒有明確給出。
2寄存器尋址
當(dāng)指令的操作數(shù)位于某一寄存器中時(shí),該操作的尋址方式為寄存器尋址??捎糜诩拇嫫鲗ぶ返募拇嫫饔校汗ぷ骷拇嫫鱎0~R7、累加器A、數(shù)據(jù)指針寄存器DPTR,以及MUL和DIV指令中的累加器A和寄存器B。
【例3-11】寄存器尋址。指令及其在ROM中的存放如下:
在本例中,R0、R2和DPTR均為寄存器尋址的操作數(shù)。其中,指令“MOV R0,#12H”和“MOV R2,#13H”的操作碼分別是78H和7AH,單片機(jī)對(duì)操作碼進(jìn)行譯碼后即可知指令要完成的操作分別是將一個(gè)立即數(shù)送入工作寄存器R0和R2中;“INC DPTR”的操作碼中隱含了操作數(shù),其操作是將DPTR中的數(shù)加1。
3直接尋址
若指令中直接給出操作數(shù)的存儲(chǔ)地址,則該操作數(shù)的尋址方式是直接尋址??梢酝ㄟ^直接尋址方式訪問存放于片內(nèi)RAM(地址范圍為00H~7FH)和特殊功能寄存器(地址范圍為80H~FFH)中的操作,并且直接尋址操作數(shù)的地址將出現(xiàn)在指令的機(jī)器碼中。
【例3-12】直接尋址。指令及其在ROM中的存放如下:
在本例中,兩條指令的操作碼都是75H,代表指令要完成的操作是將一個(gè)立即數(shù)傳送給一個(gè)直接尋址的操作數(shù)。目標(biāo)操作數(shù)SP和10H的尋址方式均為直接尋址,其中,SP是特殊功能寄存器,其地址為81H。需要注意的是,代表地址的數(shù)字10H沒有以“#”開頭,若數(shù)字以“#”開頭即為立即數(shù)尋址。
4寄存器間接尋址
采用寄存器間接尋址的操作數(shù)均存放在存儲(chǔ)器中,其存儲(chǔ)地址在寄存器中。指令執(zhí)行時(shí),首先要從寄存器中獲得操作數(shù)的存儲(chǔ)地址,然后根據(jù)該地址找到存放操作數(shù)的存儲(chǔ)單元,進(jìn)而實(shí)現(xiàn)操作數(shù)的訪問。在寄存器間接尋址中,寄存器的作用類似于指針,用于存放數(shù)據(jù)的地址??捎糜诩拇嫫鏖g接尋址的寄存器有R0、R1和DPTR。寄存器間接尋址方式可以用于訪問片內(nèi)RAM、片外RAM、片外I/O接口和ROM。
【例3-13】寄存器間接尋址。指令及其在ROM中的存放如下:
在本例中,目標(biāo)操作數(shù)@R0的尋址方式是寄存器間接尋址。若寄存器R0中的數(shù)值是34H,則數(shù)值12H將被傳送到片內(nèi)RAM區(qū)中地址為34H的存儲(chǔ)單元中。指令執(zhí)行時(shí),單片機(jī)取得操作碼76H,對(duì)操作碼進(jìn)行譯碼后,確定需要完成的任務(wù)是將一個(gè)立即數(shù)送入一個(gè)片內(nèi)RAM存儲(chǔ)單元中,而該存儲(chǔ)單元的地址在R0中,需要傳送的立即數(shù)在ROM中并存放于操作碼之后。
5位尋址
前幾種尋址方式均用于訪問字節(jié)型數(shù)據(jù),屬于字節(jié)數(shù)據(jù)尋址可以對(duì)單獨(dú)一位進(jìn)行訪問,所采用的尋址方式為位尋址。位尋址可用于訪問片內(nèi)RAM的位尋址區(qū)和可以按位尋址的特殊功能寄存器的位。
片內(nèi)RAM位尋址區(qū)中位的表達(dá)方式有以下兩種:①位地址值(00H~0F7H);②字節(jié)地址.位序號(hào)。
可以按位尋址的特殊功能寄存器位的表達(dá)方式有以下四種:①位地址值(80H~0F7H);②位名稱;③特殊功能寄存器字節(jié)地址.位序號(hào);④特殊功能寄存器名稱.位序號(hào)。另外,特殊功能寄存器名稱是特殊功能寄存器地址的符號(hào)表示,它們是等價(jià)的。
需要特別注意的是:在表示累加器A中的位的位地址時(shí),不能用“A.位序號(hào)”,只能用“ACC.位序號(hào)”。
【例3-14】片內(nèi)RAM中的位尋址。指令如下:
6變址尋址
變址尋址是“基址寄存器加變址寄存器間接尋址”的簡(jiǎn)稱。在這種尋址方式中,基址寄存器是16位的程序計(jì)數(shù)器(PC)或16位的數(shù)據(jù)指針寄存器(DPTR),變址寄存器是累加器A。指令執(zhí)行時(shí),基址寄存器內(nèi)的數(shù)與變址寄存器內(nèi)的數(shù)相加構(gòu)成16位的源操作數(shù)地址。這種尋址方式只能用于程序存儲(chǔ)器的訪問。另外,因?yàn)槌绦虼鎯?chǔ)器中的內(nèi)容無法改變,所以這種尋址方式只適用于源操作數(shù)。
采用變址尋址方式的指令共有三條,包括:“MOVC A,@A+PC”、“MOVC A,@A+DPTR”和“JMP@A+DPTR”。下面僅以指令“MOVC A,@A+DPTR”為例介紹變址尋址方式。
【例3-16】變址尋址MOVC指令。指令如下:
MOVC A,@A+DPTR;以(A)+(DPTR)為地址,從ROM中取1個(gè)字節(jié)數(shù)據(jù)送入累加器A
在本例中,指令“MOVC A,@A+DPTR”的機(jī)器碼是93H,其中隱含了源操作數(shù)和目標(biāo)操作數(shù),該指令執(zhí)行時(shí),單片機(jī)取得操作碼93H并對(duì)其譯碼后,即知要完成的操作是以(A)+(DPTR)為地址,從ROM中取1個(gè)字節(jié)數(shù)據(jù)送入累加器A。若該指令執(zhí)行之前,(A)=30H、(DPTR)=2000H,則該指令執(zhí)行時(shí),源操作數(shù)在程序存儲(chǔ)器的地址為30H+2000H=2030H。該指令執(zhí)行后,程序存儲(chǔ)器中地址為2030H的字節(jié)單元中的數(shù)據(jù)將被傳送給累加器A。
7相對(duì)尋址
相對(duì)尋址主要用于相對(duì)轉(zhuǎn)移指令,相對(duì)轉(zhuǎn)移指令執(zhí)行時(shí)程序?qū)l(fā)生跳轉(zhuǎn)。根據(jù)計(jì)算機(jī)的工作原理,程序執(zhí)行之前被存放在存儲(chǔ)器中,程序執(zhí)行時(shí)計(jì)算機(jī)將以程序計(jì)數(shù)器中的值為地址到相應(yīng)的存儲(chǔ)器單元中取指令,取得的指令將被譯碼并執(zhí)行。因此,跳轉(zhuǎn)指令之所以能使程序發(fā)生跳轉(zhuǎn),是因?yàn)槠淠苁褂?jì)算機(jī)不按存儲(chǔ)順序取指令。
在相對(duì)尋址中,目標(biāo)地址=程序計(jì)數(shù)器(PC)的當(dāng)前值+地址偏移量rel。指令執(zhí)行后,目標(biāo)地址被送入PC,使得單片機(jī)到目標(biāo)地址所指向的程序存儲(chǔ)器單元中取指令,從而改變程序的執(zhí)行順序。需要注意的是:①程序計(jì)數(shù)器(PC)的當(dāng)前值(可簡(jiǎn)稱為當(dāng)前PC值)是相對(duì)轉(zhuǎn)移指令的下一條指令在程序存儲(chǔ)器中的存放地址,可以由轉(zhuǎn)移指令本身的存放地址加上轉(zhuǎn)移指令本身的字節(jié)長(zhǎng)度獲得;②地址偏移量rel是8位有符號(hào)數(shù)(-128~+127)。