許一洲
(西北民族大學(xué) 電氣工程學(xué)院,甘肅 蘭州730106)
80C51單片機(jī)指令系統(tǒng)共有111條指令,由操作碼和操作數(shù)兩部分構(gòu)成[1]。這些指令包括數(shù)據(jù)傳送類指令、算術(shù)運(yùn)算類指令、邏輯運(yùn)算類指令、控制轉(zhuǎn)移類指令和位操作類指令[2]。其中,數(shù)據(jù)傳送類指令在單片機(jī)中使用頻繁,除了一般傳送指令外,還有4類特殊傳送指令。
一般傳送類指令都是采用MOV操作符,可以分為16位傳送和8位傳送。
16位傳送指令僅僅只有一條,功能是將源操作數(shù)data16送入目的操作數(shù)DPTR中,如:
MOV DPTR,#data16;
當(dāng)源操作數(shù)data16為3456H時(shí),執(zhí)行以上操作后,(DPH)=34H,(DPL)=56H。這條指令一般用于給DPTR賦予ROM中的數(shù)據(jù)表的表頭地址,也可以是某一片外RAM緩沖區(qū)的首地址或者是擴(kuò)展的片外接口地址。
8位傳送指令能夠?qū)⒃醋止?jié)的內(nèi)容拷貝至目的字節(jié),且源字節(jié)的內(nèi)容不會(huì)變化,屬于字節(jié)傳送。目的字節(jié)可以是累加器A、寄存器Rn或Ri、片內(nèi)RAM單元地址及SFR地址direct。源字節(jié)中除了上述4類以外,8位立即數(shù)#data也可以作為源字節(jié)。以目的字節(jié)為準(zhǔn),將8位傳送指令分成4類。
以累加器A為目的操作數(shù)的指令使用最頻繁,其指令可以構(gòu)造成以下4種,如:
MOV A,Rn;
MOV A,direct;
MOV A,@Ri;
MOV A,#data;
累加器A作為目的字節(jié),執(zhí)行后源字節(jié)即可送入累加器A。
由于目的字節(jié)為工作寄存器,因此源字節(jié)不能采用工作寄存器及其間址方式尋址。它的指令有以下3種,如:
MOV Rn,A;
MOV Rn,direct;
MOV Rn,#data;
指令執(zhí)行后,源字節(jié)即可送入到工作寄存器Rn中。
由于direct也可以作為源字節(jié)(這里用direct1表示),因此其構(gòu)造有5種方式,如:
MOV direct,A;
MOV direct,Rn;
MOV direct,direct1;
MOV direct,@Ri;
MOV direct,#data;
執(zhí)行指令后,源字節(jié)即可送入direct中。
由于目的字節(jié)采用寄存器間址,因此源字節(jié)不能采用寄存器及其間址尋址,如:
MOV @Ri,A;
MOV @Ri,direct;
MOV @Ri,data;
由于操作符不同,將其他不是MOV操作符指令稱為特殊傳送指令,如MOVC、MOVX、PUSH、POP、XCH、XCHD以及SWAP??蓪⑦@些特殊傳送指令分為ROM查表、外部RAM讀/寫、堆棧操作和交換指令4種。
ROM中通常存放兩類內(nèi)容:一是單片機(jī)執(zhí)行的程序代碼;二是固定不變的常數(shù)。因此,訪問(wèn)ROM實(shí)際上指的是讀取ROM中的常數(shù)表的表項(xiàng),簡(jiǎn)稱查表,需經(jīng)過(guò)累加器來(lái)完成。使用MOVC指令,可以由DPTR或PC內(nèi)容為基址。
(1)以DPTR內(nèi)容做基址時(shí),如:
MOVC A,@A+DPTR;
需要注意,在執(zhí)行指令時(shí),需要使累加器A的內(nèi)容與DPTR的內(nèi)容16位無(wú)符號(hào)數(shù)相加,作為16位要訪問(wèn)的ROM地址,最后將該地址單元的內(nèi)容送到累加器A中。例如,(DPTR)=3000H、(A)=40H時(shí),最終結(jié)果A為3040H。
(2)以PC內(nèi)容為基址時(shí),如:
MOVC A,@A+PC;
執(zhí)行該指令的時(shí)候,要注意PC內(nèi)容會(huì)自動(dòng)加1,然后與累加器A的16位無(wú)符號(hào)數(shù)相加,作為訪問(wèn)的16位ROM地址,最后送入累加器A。當(dāng)上訴指令所在地址為1000H且(A)=30H時(shí),執(zhí)行后會(huì)將1031H單元內(nèi)容送入累加器A。
單片機(jī)的片外RAM或接口會(huì)經(jīng)常存放一些中間數(shù)據(jù),在訪問(wèn)片外RAM或接口操作時(shí)可以有讀和寫兩類,這時(shí)需要利用MOVX指令通過(guò)累加器來(lái)完成。
(1)做讀操作時(shí),可以將DPTR、R0或R1作為間址尋址器讀片外RAM空間,如:
MOVX A,@DPTR;
MOVX A,@Ri;
若間址寄存器內(nèi)容為3000H,(3000H)=30H,執(zhí)行指令后(A)=30H。
(2)做寫操作時(shí),同樣可將DPTR、R0或R1作為間址寄存器寫外部RAM。與讀操作的區(qū)別僅僅在于傳輸方向不同,如:
MOVX @DPTR,A
MOVX @Ri,A;
需要注意,片外擴(kuò)展的I/O口也要通過(guò)MOVX進(jìn)行數(shù)據(jù)輸入輸出。
堆棧是通過(guò)“后進(jìn)先出”的原則在片內(nèi)RAM中的一片存儲(chǔ)區(qū),固定的一端稱為棧底,活動(dòng)的一端稱為棧頂,利用指針SP指向棧頂位置。
PUSH指令會(huì)先將SP的內(nèi)容加1,之后將直接地址操作數(shù)送入SP所指的單元,如:
PUSH direct;
若(SP)=07H,(40H)=88H, 執(zhí) 行“PUSH 40H”指令后,(SP)=08H,(08H)=88H。
POP指令是先將SP所指向的單元送入指令中的直接地址單元,然后再將SP內(nèi)容減1,如:
POP direct;
若(SP)=5FH,(5FH)=90H, 執(zhí) 行“POP 70H”指令后,(70H)=90H,(SP)=5EH。
MOV類指令傳送只是將數(shù)據(jù)從源字節(jié)復(fù)制到目的字節(jié)的單向傳送。當(dāng)需要兩字節(jié)或兩半字節(jié)的雙向交換時(shí),需要利用數(shù)據(jù)交換指令,包括XCH、XCHD和SWAP。
(1)XCH作為字節(jié)交換指令,具有以下3種構(gòu)造方式:
XCH A,Rn;
XCH A,direct;
XCH A,@Ri;
這3條指令均能實(shí)現(xiàn)操作數(shù)與累加器A內(nèi)容的互換,如執(zhí)行“XCH A,R0”,若(R0)=80H,(A)=20H,執(zhí)行后(A)=80H,(R0)=20H。
(2)XCHD屬于半字節(jié)交換,功能是間址操作數(shù)的低半字節(jié)與累加器A的低半字節(jié)內(nèi)容互換如:
XCHD A,@Ri;
若(R0)=30H,(30H)=67H,(A)=20H,執(zhí)行“XCHD A,@R0”指令后,(A)=27H,(30H)=60H。
(3)SWAP同樣屬于半字節(jié)交換,與XCHD不同的是,它是將累加器的高低4位互換,如:
SWAP A;
若(A)=31H,執(zhí)行以上指令后,(A)=03H。
現(xiàn)階段,單片機(jī)已被廣泛運(yùn)用于生產(chǎn)和生活中的各個(gè)領(lǐng)域。要熟練掌握單片機(jī),必須要熟悉單片機(jī)的操作指令。數(shù)據(jù)交換指令是單片機(jī)操作指令的一個(gè)重要組成部分,對(duì)其深入學(xué)習(xí),有助于進(jìn)一步使用和發(fā)展單片機(jī)技術(shù)。