80C51單片機(jī)指令系統(tǒng)的7種尋址方式
尋址方式就是尋找操作數(shù)或指令地址的方式。尋址方式包含兩方面的內(nèi)容:一是操作數(shù)的尋址,二是指令地址的尋址(如轉(zhuǎn)移指令、調(diào)用指令)。尋址方式是計(jì)算機(jī)性能的具體體現(xiàn),也是編寫(xiě)匯編語(yǔ)言程序的基礎(chǔ),必須非常熟悉并靈活運(yùn)用。對(duì)于兩操作數(shù)指令,源操作數(shù)有尋址方式,目的操作數(shù)也有尋址方式。若不特別聲明,后面提到的尋址方式均指源操作數(shù)的尋址方式。
80C51單片機(jī)指令系統(tǒng)共有7種尋址方式,包括:立即尋址、寄存器尋址、直接尋址、寄存器間接尋址、變址尋址、相對(duì)尋址和位尋址,F(xiàn)以7條指令為例說(shuō)明這7種尋址方式。
(1)立即尋址:將操作數(shù)直接寫(xiě)在指令中。
如指令①: MOV A,#3AH 執(zhí)行的操作是將立即數(shù)3AH送到累加器A中,因?yàn)橹噶钪杏辛⒓磾?shù)3AH,所以稱(chēng)此尋址方式為立即尋址。注意,立即數(shù)前面必須加“#”號(hào),以區(qū)別立即數(shù)和直接尋址。該指令的執(zhí)行過(guò)程如圖1所示。
圖1 立即數(shù)尋址示意圖
(2)寄存器尋址:是指將指令操作數(shù)存放于寄存器中,寄存器包括工作寄存器R0~R7、累加器A、通用寄存器B、地址寄存器DPTR等。
如指令②: MOV A,R0 ;(A)←(R0)
該指令將寄存器R0中的數(shù)送入累加器A中,因?yàn)橹噶钤床僮鲾?shù)為寄存器R0,所以稱(chēng)此尋址方式為寄存器尋址。
如果程序狀態(tài)寄存器PSW的RS1RS0=00(選中第0組工作寄存器,對(duì)應(yīng)地址為(00H~07H),設(shè)RAM區(qū)00H的內(nèi)容為20H,則執(zhí)行MOV A,R0指令后,累加器A中的內(nèi)容變?yōu)?0H。該指令執(zhí)行過(guò)程如圖2所示。
圖2 寄存器尋址示意圖
(3)直接尋址 :是指把存放操作數(shù)的內(nèi)存單元的地址直接寫(xiě)在指令中。在80C51單片機(jī)中可以直接尋址的存儲(chǔ)器主要有內(nèi)部RAM區(qū)和特殊功能寄存器SFR區(qū)。
如指令③:MOV A,30H ;(A)←(30H)
該指令將地址為30H的存儲(chǔ)單元的內(nèi)容送入累加器A,因?yàn)橹噶钤床僮鲾?shù)為地址直接給出的存儲(chǔ)單元,故稱(chēng)此尋址方式為直接尋址。若(30H)=3AH,指令③執(zhí)行后,(A)=3AH,該指令的執(zhí)行過(guò)程如圖3所示。
圖3 直接尋址示意圖
(4)寄存器間接尋址:將存放操作數(shù)的存儲(chǔ)單元的地址放在寄存器中,指令中只給出該寄存器。執(zhí)行指令時(shí),首先根據(jù)寄存器的內(nèi)容,找到所需要的操作數(shù)地址,再由該地址找到操作數(shù)并完成相應(yīng)操作。在80C51指令系統(tǒng)中,用于寄存器間接尋址的寄存器有R0、R1和DPTR,稱(chēng)為寄存器間接尋址寄存器。
注意:間接尋址寄存器前面必須加上符號(hào)“@”。
如指令④:MOV A,@R0 ;(A)←((R0))
該指令將以R0中內(nèi)容為地址的存儲(chǔ)單元的內(nèi)容送入累加器A中,因?yàn)橹噶畈僮鲾?shù)是存儲(chǔ)單元,其地址由寄存器R0間接給出,所以稱(chēng)此尋址方式為寄存器間接尋址。
設(shè)R0=3AH,內(nèi)部RAM 3AH中的值是65H,則指令MOV A,@R0的執(zhí)行結(jié)果是累加器A的值為65H,該指令的執(zhí)行過(guò)程如圖4所示。
圖4 寄存器間接尋址示意圖
(5)變址尋址 :是指將基址寄存器與變址寄存器的內(nèi)容相加,結(jié)果作為操作數(shù)的地址。DPTR或PC是基址寄存器,累加器A是變址寄存器。這種尋址方式稱(chēng)為變址尋址。該尋址方式主要用于查表操作。
當(dāng)執(zhí)行指令⑤時(shí),設(shè)(A)=50H ,(DPTR)=2007H,(2057H)=60H ,指令⑤執(zhí)行后MOVC A,@A+DPTR ;(A)←((A)+(DPTR))=(50H+2007H)=(2057H)=60H。
該指令將DPTR中的基地址2007H與A中的偏移地址50H相加,形成實(shí)際地址2057H,再將地址為2057H的存儲(chǔ)單元中的內(nèi)容60H送入累加器A中。顯然這種尋址方式稱(chēng)為變址尋址。該指令執(zhí)行過(guò)程如圖5所示。
圖5 變址尋址示意圖
(6)相對(duì)尋址 :是指程序計(jì)數(shù)器PC的當(dāng)前內(nèi)容與指令中的操作數(shù)相加,其結(jié)果作為跳轉(zhuǎn)指令的轉(zhuǎn)移地址(也稱(chēng)目的地址)。這種尋址方式稱(chēng)為相對(duì)尋址。該類(lèi)尋址方式主要用于跳轉(zhuǎn)指令。
如指令⑥:SJMP rel ;(PC)←(PC)+rel
當(dāng)執(zhí)行指令⑥時(shí),設(shè)當(dāng)前(PC)=2009H,而相對(duì)偏移量rel=02H,則執(zhí)行該指令后,(PC)=2009H+02H=200BH,即程序由地址為2009H處跳轉(zhuǎn)到200BH處執(zhí)行,其跳轉(zhuǎn)的距離為相對(duì)偏移量rel=02H。由于指令中的操作數(shù)為相對(duì)偏移量rel ,所以稱(chēng)這種尋址方式為相對(duì)尋址。該指令的執(zhí)行過(guò)程如圖6所示。
圖6 相對(duì)尋址示意圖
(7)位尋址 :指令中操作數(shù)為8位二進(jìn)制數(shù)某一位,稱(chēng)為位尋址。80C51單片機(jī)中,操作數(shù)不僅可以按字節(jié)為單位進(jìn)行操作,也可以按位進(jìn)行操作。當(dāng)我們把某一位作為操作數(shù)時(shí),這個(gè)操作數(shù)的地址稱(chēng)為位地址。
位尋址區(qū)包括專(zhuān)門(mén)安排在內(nèi)部RAM中的兩個(gè)區(qū)域:一是內(nèi)部RAM的位尋址區(qū),地址范圍是20H~2FH,共16個(gè)RAM單元,位地址為00H~7FH;二是特殊功能寄存器SFR中有11個(gè)寄存器可以位尋址。參見(jiàn)位地址的定義。
例如:SETB ACC.0 ;(ACC.0)←1 該指令將累加器的最低位ACC.0置1,由于指令中的操作數(shù)為一位二進(jìn)數(shù),故稱(chēng)此尋址方式為位尋址。該指令的執(zhí)行過(guò)程如圖7所示。
圖7 位尋址示意圖
由尋址方式的討論可知,操作數(shù)按類(lèi)型可分為:立即數(shù)、寄存器、存儲(chǔ)單元、位操作數(shù)、相對(duì)偏移量。而存儲(chǔ)單元地址又可有直接尋址,寄存器間接尋址,變址尋址三種。
各種尋址方式對(duì)應(yīng)操作數(shù)的指令符號(hào)規(guī)定如下。
(1)#data:表示8位立即數(shù),如#3AH。
(2)#data16:表示16位立即數(shù),即0000H~FFFFH。
(2)Rn:表示寄存器R0~R7。
(3)direct:表示片內(nèi)存儲(chǔ)單元的直接地址, 如30H。
(4)addr16,addr11:表示指令中的16位或11位轉(zhuǎn)移地址。
(5)rel:表示相對(duì)偏移量,如 02H。
(6)bit:表示位地址,如ACC.0。
(7)( ):表示存儲(chǔ)單元的內(nèi)容,如(30H)=40H。
(8)(( )):表示間接尋址的存儲(chǔ)單元內(nèi)容,((R0))=(7FH)=50H。
編輯:admin 最后修改時(shí)間:2018-06-27