第三章 MCS-51匯編語言指令教材_第1頁
第三章 MCS-51匯編語言指令教材_第2頁
第三章 MCS-51匯編語言指令教材_第3頁
第三章 MCS-51匯編語言指令教材_第4頁
第三章 MCS-51匯編語言指令教材_第5頁
已閱讀5頁,還剩193頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第3章MCS-51匯編語言指令尋址方式 匯編語言程序設(shè)計(jì)基礎(chǔ)數(shù)據(jù)傳送類指令 邏輯操作類指令算術(shù)運(yùn)算類指令 位操作指令控制轉(zhuǎn)移類指令 程序設(shè)計(jì)舉例MCS-51系列單片機(jī)為8位機(jī),可識別28

=256種數(shù)據(jù)及代碼。從指令的執(zhí)行時間看,12個振蕩器周期的指令64條,24個振蕩器周期的指令45條,48個振蕩器周期的指令2條(MUL及DIV)。分別對應(yīng)單機(jī)器周期、雙機(jī)器周期和四機(jī)器周期。在系統(tǒng)時鐘為12MHz時,對應(yīng)用時1

S、2S、4S。

不論何種匯編語言,其助記符都包括操作碼和操作數(shù)兩部分。操作碼指明了本條指令的功能,操作數(shù)代表了指令的操作對象。操作數(shù)指定了參與運(yùn)算的數(shù)據(jù)或數(shù)據(jù)所在單元的地址。如何得到這個地址稱為尋址方式。3.1尋址方式3.1.1立即尋址指令中跟在操作碼后面的數(shù)據(jù)就是實(shí)際參與運(yùn)算的操作數(shù),稱為立即數(shù)。其指令碼形式為:PCPC+1操作碼立即數(shù)一般為一字節(jié)一字節(jié)或二字節(jié)如:MOVA,#20H;(A)←20H即把20H這個數(shù)據(jù)送入累加器A中,即送入特殊功能寄存器中地址為E0H的單元。PC分析0111010000100000操作碼立即數(shù)……PC執(zhí)行PCACC(0E0H)00100000MOVA,#20H執(zhí)行示意圖3.1.2寄存器尋址把指定的某一可尋址的工作寄存器R0~R7的內(nèi)容作為操作數(shù)。指令操作碼的低3位指示所用寄存器。如:INCR3;(R3)←(R3)+1PC…RS1RS0…000**01100001011……ROM1……01000001……片內(nèi)RAMALU取指PC010000103.1.3直接尋址指令中包含了操作數(shù)的地址,該地址直接給出了參加運(yùn)算或傳送的單元的地址。直接尋址可訪問三種地址空間:⑴特殊功能寄存器SFR(又叫做專用寄存器):直接尋址是唯一的方式。⑵內(nèi)部數(shù)據(jù)存儲器RAM中的128個字節(jié)。⑶221個位地址空間。如:MOVA,70H;(A)←(70H)PC分析PC執(zhí)行PC1110010101110000操作碼直接地址……ROM……01100110……SFR70H……ACC011001103.1.4寄存器間接尋址指令指定的某一寄存器的內(nèi)容作為操作數(shù)地址。可用來間接尋址的寄存器有R0、R1、堆棧指針SP和數(shù)據(jù)指針DPTR。前面加@表示間接尋址??稍L問內(nèi)部數(shù)據(jù)存儲器或外部數(shù)據(jù)存儲器。如:MOVA,@R0;(A)←(R0)11101110……ROMPC取指PC…RS1RS0…000**00000110110……00110110片內(nèi)RAM……01100000…………R060HACC3.1.5基址寄存器加變址寄存器間接尋址(又叫變址尋址)基址寄存器(DPTR或PC)的內(nèi)容與變址寄存器(A)的內(nèi)容的和為可尋址單元的地址。該類尋址方式用于訪問程序存儲器,對查表訪問特別有用。注意:A中內(nèi)容為無符號數(shù)。如:MOVCA,

A+PC;(A)←((A)+(PC))設(shè)(A)=80H,(PC)=8019HPC取指PC10000011……ROM10001010……80A8HALU100010001000000000100000執(zhí)行8020+88=80A8H10001010ALEPC3.1.6相對尋址把指令中給定的地址偏移量與本指令所在單元地址(PC內(nèi)容)相加得到真正有效的操作數(shù)地址。該偏移量有正、負(fù)號,即在機(jī)器中必須以補(bǔ)碼形式給出,所轉(zhuǎn)移的范圍為相當(dāng)于當(dāng)前PC值的+127~-128之間。如:JC80H若C=0,則PC值不改變;若C=1,則以現(xiàn)行的PC值為基址加上80H得到所轉(zhuǎn)向的地址。假設(shè)該指令放在1005H單元中,C=1。PC取指PC0100000010000000ROM…………1005HALU0001000000000111執(zhí)行1007+FF80=0F87H1006H1007HPC……0F87H00001111100011113.1.7尋址方式小結(jié)方式利用的變量使用的空間寄存器尋址R0~R7、A、Cy、DPTR直接尋址內(nèi)部RAM和SFR及位空間寄存器間接尋址@R0、@R1、SP內(nèi)部數(shù)據(jù)存儲器@R0、@R1、@DPTR外部數(shù)據(jù)存儲器立即尋址程序存儲器變址尋址DPTR+A、PC+A程序存儲器相對尋址PC+偏移量程序存儲器3.2MCS-51匯編語言程序設(shè)計(jì)基礎(chǔ)3.2.1MCS-51單片機(jī)的助記符語言學(xué)會硬件聯(lián)接和掌握程序編制是兩個重要的環(huán)節(jié)。只有硬件聯(lián)接無誤和程序編制正確,計(jì)算機(jī)才有可能按設(shè)計(jì)者的要求去完成各種各樣的任務(wù)。機(jī)器指令代碼常用在實(shí)時控制場合。這是由于由機(jī)器指令代碼編寫的程序比較簡練,可不經(jīng)編譯立即被機(jī)器所執(zhí)行。各類機(jī)器的機(jī)器指令用助記符代替。這樣以來,了解和熟悉指令系統(tǒng),就歸結(jié)為了解和熟悉指令系統(tǒng)的助記符。助記符一般是由操作碼和操作數(shù)兩部分組成。操作碼反映了指令的功能,操作數(shù)代表了指令的操作對象。㈠操作碼:操作碼是指令功能的英文縮寫。MCS-51與IBM匯編語言常用操作碼對照表MCS-51IBM匯編語言MCS-51IBM匯編語言MCS-51IBM匯編語言MOVMOVRETIIRETDECDECMOVXOUTRETNANLANDINJZJZORLORMOVCJNZJNZXRLXORPUSHPUSHJCJCRLROLPOPPOPJBRLCRLCACALLCALLDJNZRRRORLCALLCALLADDADDRRCRCRAJMPJMPADDCADCCPLNOTLJMPJMPINCINCCLRCLccSJMPJMPDADAAJNCJNCRETRETSUBBSBBJNBSETBSTddNOPNOP㈡操作數(shù)操作數(shù)是一條指令操作的對象。⒈當(dāng)操作數(shù)是指令中給出的數(shù)據(jù)時,則被稱為立即數(shù),有8位和16位二進(jìn)制數(shù)兩種。在助記符的數(shù)字前加"#"來標(biāo)記其是立即數(shù)。不同功能的指令,操作形式不同。操作數(shù)可以是數(shù)據(jù),也可以是地址,且地址更常見。⒉操作數(shù)是存放數(shù)據(jù)的地址,這些地址通常是:⑴所選定工作寄存器區(qū)的工作寄存器R0~R7、A、B、C(位)、DPTR等可編址的寄存器。⑵片內(nèi)數(shù)據(jù)存儲器中的低128字節(jié)、特殊功能寄存器SFR及可位尋址的221位。⑶片外數(shù)據(jù)存儲器空間。⑷程序存儲器空間。3.2.2指令格式了解和熟悉指令,主要是對指令助記符了解和掌握。這種用助記符描述機(jī)器指令的語言稱為匯編語言。MCS-51指令系統(tǒng)的指令格式如下:[標(biāo)號]:操作碼助記符[第一操作數(shù)][,第二操作數(shù)][;注釋]標(biāo)號是表示該指令所在的符號地址,一般是由字母打頭的字母數(shù)字串表示。操作碼助記符表示了指令的操作性質(zhì)。注釋部分是用戶為了方便閱讀程序所加的說明,可有可無。第一、第二操作數(shù)表示操作的對象。指令的操作碼部分必不可少,操作數(shù)部分有的指令沒有,或只有一個操作數(shù)。MCS-51單片機(jī)采用變字長存儲機(jī)器指令的方式,指令字長有單字節(jié)、雙字節(jié)和三字節(jié)三種。其格式如下:單字節(jié)指令雙字節(jié)指令三字節(jié)指令操作碼操作碼操作碼操作數(shù)第一操作數(shù)第二操作數(shù)指令字節(jié)越多,占用的內(nèi)存單元越多。但是指令的執(zhí)行時間長短并不和所占用的字節(jié)數(shù)的多少成比例。如乘、除法為單字節(jié)指令,但執(zhí)行時間最長。3.2.3指令分類MCS-51單片機(jī)的111條指令按功能分為以下五大類:⑴數(shù)據(jù)傳送類:29條⑵邏輯操作類:24條⑶算術(shù)操作類:24條⑷位操作類:17條⑸控制轉(zhuǎn)移類:17條3.2.4符號說明在分類介紹指令之前,把描述指令的一些符號意義首先作一簡單的介紹:Rn:當(dāng)前選中的寄存器區(qū)的8個工作寄存器R0~R7。Ri:當(dāng)前選中的寄存器區(qū)中可作間接尋址寄存器的2個工作寄存器R0、R1。direct:8位的內(nèi)部數(shù)據(jù)存儲器單元的地址。可以是內(nèi)部RAM單元的地址及SFR的地址。#data:包含在指令中的8位常數(shù)。#data16:包含在指令中的16位常數(shù)。addr16:16位目的地址。用于LCALL和LJMP指令中。范圍是64KB程序存儲器空間。addr11:11位目的地址。用于ACALL和AJMP指令中。目的地址必須與下一條指令的第一字節(jié)在同一個2KB程序存儲器區(qū)地址空間之內(nèi)。rel:8位的帶符號的偏移地址。用于SJMP和所有的條件轉(zhuǎn)移指令中。DPTR:數(shù)據(jù)指針??捎米?6位的地址寄存器。bit:內(nèi)部RAM或SFR中的直接尋址位。A:累加器。B:特殊功能寄存器。用于MUL和DIV指令中。C:進(jìn)位標(biāo)志或進(jìn)位位,或布爾處理機(jī)中的運(yùn)算器。@:間接寄存器或基址寄存器的前綴。如@Ri。/:位操作數(shù)的前綴。表示對該位操作數(shù)求反。如/bit。(×):×中的內(nèi)容。((×)):由×尋址的單元中的內(nèi)容。←:箭頭左邊的內(nèi)容被箭頭右邊的內(nèi)容所代替。3.2.5MCS-51匯編語言程序設(shè)計(jì)的基本方法對于一個設(shè)計(jì)題目,一般按照:分析題目并確定算法、設(shè)計(jì)程序結(jié)構(gòu)、編寫程序、編譯調(diào)試。分析題目即明確題目的要求,搞清楚所給定的原始條件及應(yīng)得到的結(jié)果,以及對運(yùn)算精度和速度的要求等。該步驟是整個程序設(shè)計(jì)工作的基礎(chǔ)。確定算法即選擇合適的求解問題的方法。算法不是唯一的,但是不同的算法在計(jì)算精度、占用的內(nèi)存及編程工作量等方面有所差別,需比較并選擇最合適的算法。程序結(jié)構(gòu)設(shè)計(jì)根據(jù)分析的結(jié)果和確定的算法,采用自頂向下的方法對設(shè)計(jì)題目進(jìn)行細(xì)化,分解為更能準(zhǔn)確表達(dá)算法的功能模塊及程序結(jié)構(gòu)。編寫程序代碼是在程序結(jié)構(gòu)設(shè)計(jì)完成后,根據(jù)程序結(jié)構(gòu)設(shè)計(jì)所提供的具體要求,規(guī)劃好寄存器和存儲器的使用,轉(zhuǎn)化為程序代碼。編程要力爭做到層次清晰、占用內(nèi)存少、運(yùn)行時間短。編譯即將源代碼進(jìn)行匯編,形成可執(zhí)行的代碼。調(diào)試即將編譯通過的可執(zhí)行代碼進(jìn)行模擬運(yùn)行,輸入給定的數(shù)據(jù),檢查運(yùn)行結(jié)果是否正確。3.2.6MCS-51偽指令偽指令是供匯編用的特殊指令,只是在匯編過程中產(chǎn)生某種控制,或者對標(biāo)號進(jìn)行賦值。偽指令在匯編時不產(chǎn)生機(jī)器語言指令,僅提供匯編控制信息。⒈設(shè)置起始地址偽指令ORG(Origin)格式:ORG NNNN功能:指定目標(biāo)程序或數(shù)據(jù)塊在存儲器中存放的起始地址。其中NNNN為十進(jìn)制或十六進(jìn)制地址。ORG偽指令總是出現(xiàn)在每段源程序或數(shù)據(jù)塊的開始位置。源程序的開始,一般都要設(shè)置一條ORG偽指令來指定該程序在存儲器中的起始位置,若省略則默認(rèn)為0??啥啻问褂肙RG指令來規(guī)定不同程序段的起始地址,但是不允許和前面指定的地址重疊,即不同的程序段之間不能有重疊。⒉定義字節(jié)偽指令DB(DefineByte)格式:[標(biāo)號:]DB字節(jié)數(shù)據(jù)表功能:把字節(jié)數(shù)據(jù)表中的數(shù)據(jù)依次存放在由標(biāo)號指定的連續(xù)地址單元中。字節(jié)數(shù)據(jù)表中的數(shù)據(jù)多于一個時用逗號分隔。如:DATA1: DB 48H,9EH,’1’,80假設(shè)DATA1的地址為1020H,則(1020H)=48H,(1021H)=9EH,(1022H)=31H,(1023H)=50H⒊定義字偽指令DW(DefineWord)格式:[標(biāo)號:]DW字?jǐn)?shù)據(jù)表功能:把字?jǐn)?shù)據(jù)表中的數(shù)據(jù)依次存放在由標(biāo)號指定的連續(xù)地址單元中。字?jǐn)?shù)據(jù)的高位字節(jié)(高8位數(shù)據(jù))存放在低地址單元,低位字節(jié)(低8位數(shù)據(jù))存放在高地址單元如:DATA2: DW 1234H,56H假設(shè)DATA2的地址為1040H,則(1040H)=12H,(1041H)=34H,(1042H)=00H,(1043H)=56H⒋定義空單元偽指令DS(DefineStorage)格式:[標(biāo)號:]DS常數(shù)表達(dá)式功能:從標(biāo)號指定的起始地址開始預(yù)留由常數(shù)表達(dá)式指定個數(shù)的單元,以備源程序使用。此時標(biāo)號可在源程序中代替地址,類似于高級語言中的變量名稱。如: HIGH: DS 4 LOW: DS 2假設(shè)起始地址為30H,則30H~33H單元給HIGH,34H及35H給LOW。HIGH即30H,HIGH+1即31H,HIGH+2即32H,HIGH+2即33H,LOW即34H,LOW+1即35H。⒌賦值偽指令EQU(Equate)格式:符號名EQU表達(dá)式功能:將表達(dá)式的值賦予符號名,故稱為等值語句。表達(dá)式可以是一個數(shù)或者特定的匯編符號。如: V10 EQU 10 REG EQU R0 MEM EQU 30H⒍數(shù)據(jù)地址賦值偽指令DATA格式:符號名DATA表達(dá)式功能:將表達(dá)式的值賦予符號名。與EQU類似,但有幾點(diǎn)不同:①DATA偽指令中的符號名可以先使用、后定義;②DATA偽指令后只能是表達(dá)式或數(shù)據(jù),不能是匯編符號;③DATA定義的字符名可以出現(xiàn)在其他表達(dá)式中;④DATA常用來定義數(shù)據(jù)地址。⒎位地址賦值偽指令BIT格式:符號名BIT位地址功能:將位地址賦予符號名,之后符號名就可在程序中使用,來代替位地址。⒏匯編結(jié)束偽指令END格式:[標(biāo)號:]END功能:告訴編譯程序,該程序段已經(jīng)結(jié)束。END語句應(yīng)放在整個程序段后,否則其后的語句將不會得到編譯處理。⒐位定義段標(biāo)志BSE該指令用于定義位地址時,把所有的位定義放在一起,單成一段。⒑數(shù)據(jù)定義段標(biāo)志DSEG該指令用于定義內(nèi)存變量時,把所有定義的內(nèi)存變量單獨(dú)作為一段。⒒代碼段定義標(biāo)志CSEG該指令的作用是把程序代碼單道作為一段。⒓標(biāo)號定義標(biāo)志XSEG該指令的作用是將定義的地址和標(biāo)號單獨(dú)作為一段。⒔段結(jié)束標(biāo)志ENDS該指令的作用是作為段的結(jié)束。3.2.7程序結(jié)構(gòu)在匯編語言程序設(shè)計(jì)中,常用的程序結(jié)構(gòu)有:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)和子程序結(jié)構(gòu)。⒈順序結(jié)構(gòu)順序結(jié)構(gòu)是最普遍的結(jié)構(gòu),程序按照指令的順序逐條執(zhí)行。順序結(jié)構(gòu)是程序設(shè)計(jì)的基本結(jié)構(gòu)⒉分支結(jié)構(gòu)根據(jù)條件,對其不同的情況進(jìn)行分析、判斷,以選擇執(zhí)行不同的程序段,即分支結(jié)構(gòu)。分支結(jié)構(gòu)就是根據(jù)某種條件的判斷結(jié)果,決定程序的不同走向。分為簡單分支和散轉(zhuǎn)兩類。通過執(zhí)行條件轉(zhuǎn)移指令來實(shí)現(xiàn),MCS-51指令系統(tǒng)中的條件轉(zhuǎn)移指令有:判斷累加器A是否為零轉(zhuǎn)移指令JZ、JNZ;比較條件轉(zhuǎn)移指令CJNE;判斷進(jìn)位及位轉(zhuǎn)移指令JC、JNC、JB、JNB。條件滿足?a)一般分支分支1分支2是否b)散轉(zhuǎn)分支(R)=?分支1分支2分支N=0=1=N…分支程序結(jié)構(gòu):⒊循環(huán)結(jié)構(gòu)循環(huán)程序是指當(dāng)滿足某條件時,能夠重復(fù)執(zhí)行某段程序的程序結(jié)構(gòu)。因?yàn)樵趯?shí)際應(yīng)用中,常常會要執(zhí)行同樣的操作,即重復(fù)執(zhí)行同樣的動作,此時采用循環(huán)結(jié)構(gòu),可減少指令及書寫時間、節(jié)省程序存儲器空間。但是需要注意的是,循環(huán)結(jié)構(gòu)不會節(jié)省CPU的執(zhí)行時間。循環(huán)結(jié)構(gòu)的程序由四部分組成:①初始化部分初始化部分是循環(huán)程序的準(zhǔn)備部分,完成循環(huán)變量的初始化、工作單元清零及循環(huán)計(jì)數(shù)器的初始化。②循環(huán)體循環(huán)體是循環(huán)結(jié)構(gòu)程序的執(zhí)行部分,即重復(fù)執(zhí)行的程序段,是循環(huán)程序的實(shí)體。③修改部分每執(zhí)行一次循環(huán)體后,修改有關(guān)變量、地址指針或循環(huán)結(jié)束條件。④控制部分根據(jù)循環(huán)計(jì)數(shù)器的值或其他循環(huán)條件,判斷循環(huán)是否繼續(xù)執(zhí)行。如果循環(huán)次數(shù)未到或循環(huán)條件滿足,繼續(xù)循環(huán);否則退出循環(huán)。常用于循環(huán)控制的指令有:DJNZ、CJNE、JC、JNC、JB、JNB等。開始初始化循環(huán)體循環(huán)修改繼續(xù)循環(huán)?結(jié)束a)直到型循環(huán)開始初始化循環(huán)體循環(huán)修改繼續(xù)循環(huán)?結(jié)束b)當(dāng)型循環(huán)當(dāng)型循環(huán)即先判斷循環(huán)條件再執(zhí)行循環(huán)體的循環(huán)結(jié)構(gòu),循環(huán)體可能一次都不執(zhí)行;直到型循環(huán)即先執(zhí)行循環(huán)體再判斷循環(huán)條件的循環(huán)結(jié)構(gòu),循環(huán)體至少執(zhí)行一次??梢酝ㄟ^這兩種基本循環(huán)構(gòu)成多重循環(huán),即循環(huán)嵌套,但是不允許循環(huán)交叉。⒋子程序結(jié)構(gòu)在程序的編制過程中,經(jīng)常會進(jìn)行一些相同的計(jì)算或操作。每次都編寫相同的程序,不僅麻煩且浪費(fèi)存儲器空間。因此,對于常用的程序段,可將其從程序中獨(dú)立出來,供其他程序調(diào)用。這種獨(dú)立功能的程序段稱為子程序。主程序調(diào)用子程序時,通過子程序調(diào)用指令A(yù)CALL或LCALL實(shí)現(xiàn)。子程序執(zhí)行完畢,通過執(zhí)行子程序末尾的子程序返回指令RET實(shí)現(xiàn)。子程序在執(zhí)行過程中還可以調(diào)用其他子程序,這稱為子程序嵌套。子程序結(jié)構(gòu)符合結(jié)構(gòu)化程序設(shè)計(jì),可讀性強(qiáng)。在設(shè)計(jì)子程序時,應(yīng)注意以下問題:①子程序的入口及出口條件子程序的入口條件就是子程序執(zhí)行所需要的參數(shù)或者數(shù)據(jù)。為了使子程序能夠正確執(zhí)行并得到所需結(jié)果,調(diào)用該子程序的程序根據(jù)子程序的要求,負(fù)責(zé)把其所需數(shù)據(jù)放在指定的寄存器或單元,即把參數(shù)傳遞給子程序。另外,還可以通過堆棧進(jìn)行參數(shù)傳遞。子程序的出口條件就是子程序執(zhí)行的結(jié)果返回給調(diào)用程序。②保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場子程序在被調(diào)用時,MCS-51系統(tǒng)只是對斷點(diǎn)進(jìn)行了保護(hù),即把調(diào)用指令的下一條指令壓入了堆棧,但并未對其他寄存器內(nèi)容進(jìn)行保護(hù)。子程序執(zhí)行需要使用一些寄存器,為了保證子程序執(zhí)行不破壞調(diào)用程序的這部分寄存器的內(nèi)容,需要對這些寄存器進(jìn)行保護(hù),這個工作稱為保護(hù)現(xiàn)場。保護(hù)現(xiàn)場的工作一般在子程序的開始部分進(jìn)行,采用的方法是把這些寄存器內(nèi)容壓入堆棧。在執(zhí)行完子程序之后返回主程序繼續(xù)原工作之前,必須把保護(hù)現(xiàn)場時所壓棧的寄存器內(nèi)容進(jìn)行出棧,以保證主程序執(zhí)行所需要的內(nèi)容正確,這稱為恢復(fù)現(xiàn)場。3.3數(shù)據(jù)傳送類指令傳送類指令是指令系統(tǒng)中使用最多的一類指令,主要用于數(shù)據(jù)的保存及交換等場合。按操作方式把傳送類指令分為三種:⑴數(shù)據(jù)傳送;⑵數(shù)據(jù)交換;⑶棧操作。數(shù)據(jù)傳送類指令一般的操作是把源操作數(shù)傳送到目的操作數(shù)。指令執(zhí)行后,源操作數(shù)不變,目的操作數(shù)修改為源操作數(shù)。若要求數(shù)據(jù)傳送時,不丟失目的操作數(shù),則可以用交換型的傳送指令。㈠數(shù)據(jù)傳送類指令的一些特點(diǎn)⑴除了用POP或MOV指令將數(shù)據(jù)傳送到程序狀態(tài)字外,數(shù)據(jù)傳送指令一般不影響標(biāo)志位(C、AC、OV),不包括P(奇偶校驗(yàn))。因?yàn)?,一則MOVA類指令會影響P,二則P不影響執(zhí)行順序。⑵對特殊功能寄存器SFR的操作必須用直接尋址,而直接尋址也是訪問SFR的唯一方式。源操作數(shù)可用寄存器尋址、間接尋址、直接尋址、立即尋址、變址尋址五種尋址方式。目的操作數(shù)可用寄存器尋址、間接尋址、直接尋址三種方式。數(shù)據(jù)傳送類指令用到的助記符有:MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP。傳送類指令功能操作碼助記符操作數(shù)備注數(shù)據(jù)傳送內(nèi)部數(shù)據(jù)傳送MOVdirect,Rn,@Ri,A←#dataRn表示R0~R7Ri表示R0或R1

表示源地址和目的地址可互換DPTR←#data16A

Rn,@Ri,directdirect

Rn,@Ri,direct外部數(shù)據(jù)存儲器

MOVXA

@Ri,@DPTR程序存儲器傳送

MOVCA←@A+DPTR,@A+PC數(shù)據(jù)交換字節(jié)交換

XCHA

Rn,@Ri,direct

表示內(nèi)容可互換半字節(jié)交換

XCHDSWAPA低4位

@Ri低4位A高4位

A低4位棧操作壓入堆棧

PUSH(SP)←direct寫指令時(SP)不出現(xiàn)彈出堆棧

POP(SP)→direct㈡數(shù)據(jù)傳送的路徑累加器A寄存器間址@R1@R0(外部數(shù)據(jù)0~255)寄存器間址@DPTR(外部數(shù)據(jù)0~64K)a)外部數(shù)據(jù)存儲器傳送操作變址@PC+A,@DPTR+A寄存器間址@R0,@R1,@DPTR累加器A寄存器R0~R7直接地址direct立即數(shù)#data寄存器間址(SP)寄存器C直接地址direct寄存器DPTR11c)數(shù)據(jù)傳送的所有可能路徑累加器A基寄存器加變址寄存器@PC+A(程序存儲器0~64K)基寄存器加變址寄存器@DPTR+A(程序存儲器0~64K)b)程序存儲器傳送操作⒈數(shù)據(jù)傳送又可分為:①內(nèi)部數(shù)據(jù)存儲器各部分間,以及內(nèi)部數(shù)據(jù)存儲器各部分與累加器A之間的數(shù)據(jù)傳送;②片外數(shù)據(jù)存儲器與累加器A之間的數(shù)據(jù)傳送;③程序存儲器送數(shù)到累加器A的傳送。所用的操作碼分別為:MOV、MOVX、MOVC⑴MOV的作用區(qū)間主要是內(nèi)部數(shù)據(jù)存儲器,寄存器尋址、間接尋址及直接尋址使得傳送指令允許在工作寄存器R0~R7、片內(nèi)數(shù)據(jù)存儲器、累加器A和特殊功能寄存器任意兩個之間傳送一個字節(jié)的數(shù)據(jù)。特別是直接地址到直接地址之間的數(shù)據(jù)傳送,能把一個并行I/O口中的數(shù)據(jù)直接傳送到內(nèi)部數(shù)據(jù)存儲器RAM中,而不必經(jīng)過任何工作寄存器(R0~R7)或累加器A,提高了傳送速度。此外利用MOV指令可把16位的立即數(shù)據(jù)直接送入數(shù)據(jù)指針DPTR中。⑵MOVX指令用于累加器A與片外擴(kuò)展數(shù)據(jù)存儲器或擴(kuò)展的I/O口間進(jìn)行數(shù)據(jù)傳送。在MCS-51中對片外數(shù)據(jù)存儲器和擴(kuò)展I/O口的操作是一樣看待的,采取統(tǒng)一編址,即I/O口也作為一個單元對待。這種傳送只有一種尋址方式──寄存器間接尋址。⑶MOVC指令用于程序存儲器送數(shù)到累加器A,是一種查表指令。這種指令只有兩條,采用變址尋址的方式,以PC或DPTR作為基址寄存器,以A作為變址寄存器,基址寄存器與變址寄存器內(nèi)容相加得到程序存儲器單元的地址。⒉數(shù)據(jù)交換操作完成的是累加器A與選定的工作寄存器、片內(nèi)RAM中的寄存器間接尋址字節(jié)、片內(nèi)RAM或SFR的一個直接尋址字節(jié)間交換數(shù)據(jù),操作碼為XCH;XCHD完成的是A低4位與片內(nèi)RAM某單元字節(jié)的低4位交換數(shù)據(jù);SWAP完成的是累加器A的高低4位的交換。數(shù)據(jù)交換圖示:寄存器R7~R0直接地址

direct累加器A寄存器間址

@R1、@R04低半字節(jié)⒊棧操作指令也完成數(shù)據(jù)傳送的功能,棧區(qū)設(shè)在內(nèi)部RAM中。但是在置棧指針前,必須估計(jì)一下棧區(qū)的深度,然后才可利用SP間接尋址執(zhí)行數(shù)據(jù)壓入或彈出的操作。3.3.1通用傳送指令操作碼助記符:MOV格式:MOV<目的字節(jié)>,<源字節(jié)>功能:傳送字節(jié)變量。(目的字節(jié))←(源字節(jié)),傳送結(jié)束后,源字節(jié)內(nèi)容不變,且不影響標(biāo)志位。說明:把第二字節(jié)操作數(shù)指定的字節(jié)變量傳送到由第一操作數(shù)指定的單元中,不影響源字節(jié),不影響任何別的寄存器或標(biāo)志。允許15種源和目的尋址方式組合。操作數(shù)可能的組合關(guān)系:Direct(直接地址)@Ri(間接尋址)A(累加器)Rn(寄存器)#data(立即數(shù))⒈立即數(shù)送累加器A和內(nèi)部數(shù)據(jù)存儲器(Rn,內(nèi)部RAM,SFR)⑴MOVA,#data ;(A)←#data,即立即數(shù)送A代碼:01110100 ;74H立即數(shù)說明:代碼的第二字節(jié)為立即數(shù),與操作碼一起放在程序存儲器中;執(zhí)行指令時與操作碼一起取到CPU中。⑵MOVdirect,#data ;(direct)←#data

代碼:01110101 ;75H

直接地址 立即數(shù)功能:立即數(shù)送內(nèi)部數(shù)據(jù)存儲器或SFR,直接尋址。說明:代碼的第二字節(jié)為直接地址,第三字節(jié)為立即數(shù),在指令執(zhí)行時,與操作碼一起從ROM中取入CPU中。⑶MOV@Ri,#data ;((Ri))←#data

代碼:0111011i ;76H~77H,i=0,1

立即數(shù)功能:立即數(shù)送內(nèi)部數(shù)據(jù)存儲器,寄存器間接尋址。說明:Ri在內(nèi)部數(shù)據(jù)存儲器中的地址由PSW的RS1、RS0確定??稍L問內(nèi)部數(shù)據(jù)存儲器的低128個單元。⑷MOVRn,#data ;(Rn)←#data,n=0~7代碼:01111rrr ;78H~7FH

立即數(shù)功能:立即數(shù)送工作寄存器,寄存器尋址。說明:Rn在內(nèi)部數(shù)據(jù)存儲器中的地址由PSW的RS1、RS0確定??稍L問內(nèi)部數(shù)據(jù)存儲器的00H~1FH單元。例3-1:MOV@R0,#data,設(shè)(R0)=20H,則指令的執(zhí)行過程如下:000000RS1RS0PSW01110110#dataROM0010000020HR0內(nèi)部RAM形成8位地址②③④①①PC→PC→PC→#data例3-2:利用直接尋址可把立即數(shù)送入片內(nèi)數(shù)據(jù)RAM任一單元或SFR中任一寄存器,而用寄存器間接尋址需用兩條,如:MOV 20H,#data等價于:MOV R0,#20HMOV @R0,#data

⒉內(nèi)部數(shù)據(jù)存儲器(Rn,內(nèi)部RAM,SFR)與A傳送數(shù)據(jù)⑴內(nèi)部RAM或SFR內(nèi)容送AMOVA,direct ;(A)←(direct)代碼:11100101 ;E5H

直接地址功能:直接尋址單元內(nèi)容送累加器A說明:代碼的第二字節(jié)為直接地址,可指向SFR及內(nèi)部RAM(0~127單元)。⑵內(nèi)部RAM內(nèi)容送AMOVA,@Ri ;(A)←((Ri)),i=0,1代碼:1110011i ;E6H~E7H⑶工作寄存器內(nèi)容送AMOVA,Rn ;(A)←(Rn),n=0~7代碼:11101rrr ;E8H~EFH⑷累加器A內(nèi)容送內(nèi)部RAM或SFRMOVdirect,A ;(direct)←(A)代碼:11110101 ;F5Hdirect⑸A內(nèi)容送內(nèi)部RAMMOV@Ri,A ;((Ri))←(A)代碼:1111011i ;F6H~F7H⑹A內(nèi)容送工作寄存器MOVRn,A ;(Rn)←(A)代碼:11111rrr ;F8H~FFH注意:寄存器間接尋址@Ri是以Ri的內(nèi)容作為地址進(jìn)行尋址,由于Ri為八位寄存器,其尋址范圍可為0~255。但由于SFR只能被直接尋址,且在SFR中很多單元又未定義(51系列),對這些未定義的單元讀寫,將得到不確定的值,寫入的數(shù)據(jù)也將被丟失。所以,寄存器間接尋址的真正作用范圍實(shí)際上只有128(0~127)個單元。例如指令序列 MOV R1,#82H ;82H=130 MOV A,R1

表面上看起來符合MCS-51的指令形式,實(shí)際上是不正確的。因?yàn)?2H是SFR塊中的DPL的地址,對SFR塊來說,這種間接尋址無效。所以欲從DPL取數(shù)據(jù)到A,必須用直接尋址方式。MOVA,82H或?qū)憺椋篗OVA,DPL執(zhí)行后A中的內(nèi)容就是DPL中的值⒊內(nèi)部數(shù)據(jù)存儲器中的Rn、SFR和片內(nèi)數(shù)據(jù)RAM之間的數(shù)據(jù)傳送⑴內(nèi)部RAM或SFR間的直接傳送:三字節(jié)指令MOVdirect2,direct1 ;(dircet2)←(direct1)說明:代碼的第二功能、第三字節(jié)分別為源操作數(shù)和目的操作數(shù)的絕對地址。該指令的功能很強(qiáng),能實(shí)現(xiàn)內(nèi)部RAM間、SFR間及SFR與內(nèi)部RAM之間的直接數(shù)據(jù)傳送。注意:在把指令編譯成代碼時,其它的指令都是:操作碼、目的字節(jié)、源字節(jié)的格式,而MOVdirect2,direct1的代碼是:操作碼、源字節(jié)、目的字節(jié)。代碼:10000101 ;85H direct1 direct2⑵內(nèi)部RAM內(nèi)容送內(nèi)部RAM或SFRMOVdirect,@Ri ;(direct)←((Ri))代碼:1000011i ;86H或87Hdirect⑶工作寄存器內(nèi)容送內(nèi)部RAM或SFR:二字節(jié)指令MOVdirect,Rn ;(direct)←(Rn)代碼:10001rrr ;88H~8FH

dircet

⑸內(nèi)部RAM或SFR內(nèi)容送Rn

MOVRn,direct ;(Rn)←(direct)代碼:10101rrr ;A8H~AFH direct⑷內(nèi)部RAM或SFR內(nèi)容送RAM:二字節(jié)指令MOV@Ri,dircet ;((Ri))←(direct)代碼:1010011i ;A6H或A7H direct例3-3:指令MOVP3,P1,指令執(zhí)行后,把口1的內(nèi)容送到口3輸出,不必經(jīng)累加器A中轉(zhuǎn)。例3-4:若RS1=1,RS0=1,則選中第三組工作寄存器區(qū)MOV direct,R0等價于MOVdirect,18H例3-5:MOV 20H,#25H MOV 25H,#10H MOV P1,#0CAH執(zhí)行后,(20H)=25H,(25H)=10H,(P1)=0CAHMOV R0,#20HMOV A,@R0MOV R1,AMOV B,@R1MOV @R1,P1MOV P3,P1執(zhí)行后:(R0)=20H,(A)=25H,(R1)=25H,(B)=10H,(25H)=CAH,(P3)=CAH⒋目標(biāo)地址傳送:16位立即數(shù)送數(shù)據(jù)指針DPTR。MOVDPTR,#data16 ;(DPH)←#data15~#data8;(DPL)←#data7~#data0說明:這是整個指令系統(tǒng)中唯一的一條16位數(shù)據(jù)的傳送指令,用來設(shè)置地址指針。如:MOVDPTR,#2003H;執(zhí)行后,(DPH)=20H,(DPL)=03H。代碼:10011000 ;90H #data15~8 #data7~0

3.3.2外部數(shù)據(jù)存儲器(或外擴(kuò)I/O口)與A傳送指令操作碼助記符:MOVX格式:MOVX<目的字節(jié)>,<源字節(jié)>功能:外部數(shù)據(jù)存儲器或外部I/O口與A之間的數(shù)據(jù)傳送。⒈外部數(shù)據(jù)存儲器單元內(nèi)容送累加器AMOVXA,@DPTR ;(A)←((DPTR))代碼:11100000 ;E0H說明:指令執(zhí)行時,P3.7引腳上輸出RD有效信號,用作外部數(shù)據(jù)存儲器的讀選通信號。DPTR所包含的16位地址信息由P0、P2輸出,選中單元的數(shù)據(jù)由P0口輸入到累加器A。

⒉外部數(shù)據(jù)存儲器單元內(nèi)容送累加器AMOVXA,@Ri ;(A)←((Ri))代碼:1110001i ;E2H,E3H說明:指令執(zhí)行時,P3.7引腳上輸出RD有效信號,用作外部數(shù)據(jù)存儲器的讀選通信號。P0口上分時輸出由Ri指定的8位地址信息及輸入該單元的數(shù)據(jù)內(nèi)容。⒊累加器A內(nèi)容送外部數(shù)據(jù)存儲器MOVX

@DPTR,A ;((DPTR))←(A)代碼:11110000 ;F0H說明:指令執(zhí)行時,由P3.6引腳輸出WR有效信號,用作外部數(shù)據(jù)存儲器的寫選通信號。DPTR所包含的16位地址信息由P0、P2輸出,累加器A的內(nèi)容由P0口輸出,P0口作分時復(fù)用的地址、數(shù)據(jù)口。⒋累加器A內(nèi)容送外部數(shù)據(jù)存儲器MOVX@Ri,A ;((Ri))←(A)代碼:1111001i F2H或F3H說明:指令執(zhí)行時,由P3.6引腳輸出WR有效信號,用作外部數(shù)據(jù)存儲器的寫選通信號。P0口上分時輸出由Ri指定的8位地址信息及輸出到該單元的數(shù)據(jù)內(nèi)容。例3-6:設(shè)外部數(shù)據(jù)存儲器(2030H)=2AH,(5DH)=88H,累加器(A)=0F8H,工作寄存器(R0)=5DH,數(shù)據(jù)指針(DPTR)=2030H。則執(zhí)行如下指令時的結(jié)果為:MOVA,@DPTR ;(A)=2AHMOVA,@R0 ;(A)=88HMOV@DPTR,A ;(2030H)=F8HMOV@R0,A ;(5DH)=F8H3.3.3程序存儲器向累加器A傳送指令操作碼助記符:MOVC格式:MOVCA,<源字節(jié)>⒈MOVCA,@A+PC ;(PC)←(PC)+1,(A)←((A)+(PC))代碼:10000011 83H說明:指令首先將PC值修正為下一條指令的地址上,然后執(zhí)行16位無符號數(shù)的加法操作,獲得基址與變址之和。低八位相加產(chǎn)生進(jìn)位時,直接加到高位,并不影響標(biāo)志位。⒉MOVCA,@A+DPTR ;(A)←((A)+(DPTR))代碼:10010011 93H這兩條指令主要用于查表,就是完成從程序存儲器讀取數(shù)據(jù)的功能。但是由于MOVCA,@A+PC以PC作為基址寄存器,在CPU執(zhí)行取完該指令操作碼時,PC值會自動加1,指向下一條指令的第一個字節(jié),這時PC中的值已經(jīng)不是該指令所在單元的值,而是PC+1。因?yàn)锳中的內(nèi)容為8位無符號整數(shù),這使得查表范圍受到限制,只能在以PC當(dāng)前值開始后的256個字節(jié)范圍內(nèi)。編程時還需進(jìn)行偏移量的計(jì)算,計(jì)算公式為:偏移量=表首地址-(該指令所在地址+1)而MOVCA,@A+DPTR以DPTR作為基址寄存器,由于DPTR的內(nèi)容可以通過賦值改變,從而使得這條指令的應(yīng)用范圍更為廣泛,表格常數(shù)可以設(shè)置在64KB程序存儲器的任何地址空間,而不必象MOVCA,@A+PC指令那樣只能把表格常數(shù)只設(shè)在PC指針以下的256個單元中。缺點(diǎn)是在DPTR已經(jīng)有別的用途時,在賦表首地址值之前,必須保護(hù)現(xiàn)場,執(zhí)行完查表指令后再對DPTR予以恢復(fù)。例3-7、若要根據(jù)累加器A的內(nèi)容找出由偽指令DB所定義的四個值中的一個。可用下列程序:ppqq: ADD A,#01Hppqq+2: MOVC A,@A+PCppqq+3: RETppqq+4:STAR: DB 66H,77H,88H,99H在這個程序中,第一條指令把A的內(nèi)容加1,是為了能夠根據(jù)A的內(nèi)容找到相應(yīng)的數(shù)據(jù)值。這是因?yàn)楫?dāng)MOVCA,@A+PC執(zhí)行后,PC值已經(jīng)是ppqq+3,而不是ppqq+4,即不是DB所定義的四個值的區(qū)域開始處。例3-8:試編制根據(jù)累加器A中的數(shù)(0~9)查其平方表的子程序。COUNT:PUSHDPH ;保護(hù)DPTR內(nèi)容PUSHDPLMOVDPTR,#TABLE;賦表首址→DPTRMOVCA,@A+DPTR ;據(jù)A中內(nèi)容查表POPDPL ;恢復(fù)DPTR原內(nèi)容POPDPHRET ;返回主程序TABLE:DB00,01,04,09,16,25,DB36,49,64,813.3.4數(shù)據(jù)交換指令⒈字節(jié)交換指令⑴XCHA,direct ;(A)

(direct)

代碼:10000101;85H⑵XCHA,@Ri ;(A)

((Ri))

代碼:1100011i;C6H或C7H⑶XCHA,Rn ;(A)

(Rn)

代碼:11001rrr;C8H~CFH上述指令把A中的內(nèi)容與第二操作數(shù)所指定的單元(寄存器尋址、直接尋址和寄存器間接尋址單元)的內(nèi)容互相交換。⒉半字節(jié)交換指令⑴XCHDA,@Ri ;(A3~0)

((Ri)3~0)代碼:1101011i ;D6H或D7H⑵SWAPA ;(A3~0)

(A7~4)代碼:11000100 ;C4說明:交換累加器A的高半字節(jié)與低半字節(jié)。例3-9:設(shè)(A)=57H,(20H)=68H,(R0)=30H,(30H)=39H則執(zhí)行時:代碼結(jié)果①XCHA,20H ;(A)=68H,(20H)=57H②XCHA,@R0 ;(A)=39H,(30H)=57H③XCHA,R0 ;(A)=30H,(R0)=57H④XCHDA,@R0;(A)=59H,(30H)=37H⑤SWAPA ;(A)=75H3.3.5棧操作指令⒈壓棧操作:PUSHdirect代碼:11000000 ;C0H直接地址操作:(SP)←(SP)+1((SP))←(direct)說明:指令執(zhí)行后不影響標(biāo)志位。⒉出棧操作:POPdirect代碼:11010000 ;D0H

直接地址

操作:(direct)←((SP))(SP)←(SP)-1說明:一般說來,執(zhí)行此指令后不影響標(biāo)志位。若目標(biāo)操作數(shù)為PSW,則有可能使一些標(biāo)志改變,這也是通過指令修改標(biāo)志的一種方法。PUSH和POP指令是兩條逆?zhèn)魉椭噶?,常被用于保護(hù)現(xiàn)場和恢復(fù)現(xiàn)場的程序中,使程序執(zhí)行時方便、迅速。堆棧中的數(shù)據(jù)是以“先進(jìn)后出”(FirstInLastOut)的方式處理的,由堆棧指針SP控制。在應(yīng)用中要特別注意堆棧操作的這一特點(diǎn)。例3-10:PUSHDPL ;保護(hù)DPL內(nèi)容PUSHDPH ;保護(hù)DPH內(nèi)容PUSHPSW ;保護(hù)PSW內(nèi)容PUSHACC ;保護(hù)累加器內(nèi)容… ;執(zhí)行服務(wù)程序POPACC ;恢復(fù)累加器內(nèi)容POPPSW ;恢復(fù)PSW內(nèi)容POPDPH ;恢復(fù)DPH內(nèi)容POPDPL ;恢復(fù)DPL內(nèi)容則DPTR、PSW、A中的內(nèi)容能夠正確恢復(fù)。若出棧時按如下操作:POPDPLPOPDPHPOPPSWPOPACC則DPTR、PSW、A中的內(nèi)容不能正確恢復(fù),使得程序執(zhí)行混亂,執(zhí)行情況不可預(yù)測。例3-11:設(shè)(SP)=2FH,(A)=3EH,則執(zhí)行PUSHACC前后,堆棧內(nèi)容如下。30H2FHSP←執(zhí)行前內(nèi)部RAM30H2FHSP←3EH執(zhí)行后內(nèi)部RAM3.4邏輯操作類指令邏輯操作類指令包括與、或、異或、清除、求反、左右移位等邏輯操作。按操作數(shù)情況可分為單操作數(shù)和雙操作數(shù)兩種。該類指令的操作數(shù)都是8位。單操作數(shù)是專門對累加器A進(jìn)行的邏輯操作,這些操作包括:清0、求反、左右移位等,結(jié)果仍保存在累加器A中。雙操作數(shù)指令主要是累加器A與第二操作數(shù)之間執(zhí)行邏輯與、或和異或操作,第二操作數(shù)可以是立即數(shù)、工作寄存器、內(nèi)部RAM單元、SFR。其對應(yīng)的尋址方式是:寄存器尋址、寄存器間接尋址、直接尋址。邏輯操作的結(jié)果仍保存在累加器A中;也可將直接尋址單元作為第一操作數(shù),和立即數(shù)、累加器A執(zhí)行邏輯與、或、異或操作,結(jié)果仍保存在直接尋址單元中。寄存器R7~R0寄存器間址@R1@R0累加器A(ANL,ORL,XRL)直接direct(ANL,ORL,XOR)立即數(shù)#data功能操作碼助記符操作數(shù)備注單操作數(shù):清零取反循環(huán)左移帶進(jìn)位左移循環(huán)右移帶進(jìn)位右移CLRCPLRLRLCRRRRC

A

→A

表示某種運(yùn)算"→"表示送到目的地址雙操作數(shù):與或異或ANLORLXRL3.4.1對累加器A進(jìn)行的邏輯操作(單操作數(shù)指令)⒈對累加器A清0:CLRA ;(A)←0代碼:11100100 ;E4H⒉累加器A內(nèi)容求反:CPLA ;(A)←A代碼:11110100 F4H說明:把累加器A內(nèi)容求反后送入A中。不影響標(biāo)志位。⒊累加器A左右移位RLA①累加器A內(nèi)容循環(huán)左移:代碼:00100011 23H操作:(An+1)←(An);n=0~6(A0)←(A7)RLACA7A0②累加器A內(nèi)容連同進(jìn)位標(biāo)志C一起循環(huán)左移RLCA代碼:00110011 ;33H操作:(An+1)←(An);n=0~6(A0)←(C)(C)←(A7)RLCACA7A0③累加器A內(nèi)容循環(huán)右移RRA

代碼:00000011 ;03H操作:(An)←(An+1);n=0~6(A7)←(A0)RRACA7A0④累加器A內(nèi)容連同進(jìn)位標(biāo)志C一起循環(huán)右移RRCA代碼:00010011 ;13H操作:(An)←(An+1);n=0~6(C)←(A0)(A7)←(C)RRCACYA7A0左右移位指令,左移一位相當(dāng)于乘2,右移一位相當(dāng)于除2。由于左右移位指令的這一特點(diǎn),當(dāng)一個數(shù)要乘/除2的倍數(shù)時,而且這個倍數(shù)不大(如2、4、8、16),并且移位后結(jié)果不溢出的情況下,用左右移位指令要比乘/除法指令執(zhí)行的速度快。帶進(jìn)位位的移位可用于檢查一個字節(jié)中的各位的狀態(tài),或用于逐位輸出的情況。例3-12:8031的P2口中的P2.3~P2.6與譯碼器輸入端連接如下圖,欲使累加器A中的數(shù)送譯碼器,可編程如下(設(shè)最低位由P2.6輸出):8031P2.6P2.5P2.4P2.3A0A1A2A3譯碼器OUTP2: RRCA MOVP2.6,C RRCA MOVP2.5,C RRCA MOVP2.4,C RRCA MOVP2.3,C RET

3.4.2雙操作數(shù)指令⒈累加器A與立即數(shù)、內(nèi)部RAM間的邏輯操作邏輯與、或、異或三種操作指令的格式和尋址方式都是一樣的,放在一起介紹。這些指令的執(zhí)行不影響標(biāo)志位。例3-13:P1口中的P1.2,P1.3,P1.7位清0,其余位不變。ANLP1,#01110011B或ANLP1,#73H例3-14:選通用寄存器區(qū)0區(qū)作為工作區(qū)(PSW中的RS1,RS0)。

ANLPSW,#11100111B或ANLPSW,#0E7H例3-15:P1口中的P1.1、P1.4、P1.5置1。ORLP1,#00110010B或ANLP1,#32H例3-16:要求P1口中的0~4位受A中0~4位控制。ANLA,#00011111B ;屏蔽A7~5位ANLP1,#11100000B ;清P1.4~0位ORLP1,A ;按A4~0設(shè)P1.4~0例3-17:對內(nèi)部RAM中78H單元的1,3,5,7位求反。MOVA,#0AAH ;10101010BXRL78H,AWhy?⒉直接地址單元(內(nèi)部RAM,SFR)與累加器A、立即數(shù)間的邏輯操作說明:①當(dāng)direct為第二操作數(shù)時,若direct為端口P0~P3,數(shù)據(jù)來自端口的鎖存器;②當(dāng)direct為第一操作數(shù)時、A為第二操作數(shù)時,若direct為端口P0~P3,在程序運(yùn)行時用該指令可根據(jù)A的內(nèi)容動態(tài)地修改輸出口的內(nèi)容,是一條“讀→修改→寫”指令。③當(dāng)direct為第一操作數(shù)、立即數(shù)為第二操作數(shù)時,若direct為端口P0~P3,是一條“讀→修改→寫”指令。例3-18:設(shè)兩位用ASCII碼表示的數(shù)分別保存在40H、41H單元中,把其轉(zhuǎn)換成兩位BCD數(shù)據(jù),并以壓縮形式存入40H單元中。ANL40H,#0FH ;40H的ASCII碼變?yōu)锽CD碼MOVA,41HANLA,#0FH ;41H的ASCII碼變?yōu)锽CD碼SWAPAORL40H,A ;結(jié)果存入40H單元中3.5算術(shù)運(yùn)算類指令算術(shù)運(yùn)算類指令包括4種基本的算術(shù)操作指令,即加減乘除。這4種指令能對8位的無符號數(shù)進(jìn)行直接的運(yùn)算。借助于溢出標(biāo)志,可對帶符號數(shù)進(jìn)行補(bǔ)碼運(yùn)算。借助于進(jìn)位標(biāo)志,可以實(shí)現(xiàn)多精度的加、減和環(huán)移。借助于輔助進(jìn)位標(biāo)志,可以進(jìn)行BCD碼調(diào)整。算術(shù)運(yùn)算指令執(zhí)行的結(jié)果將使進(jìn)位CY、輔助進(jìn)位AC、溢出OV三種標(biāo)志置位或復(fù)位,但是加1或減1指令不影響這些標(biāo)志位。算術(shù)運(yùn)算類指令用到的助記符有ADD、ADDC、INC、DA、DEC、SUBB、MUL和DIV八種。影響標(biāo)志的指令

指令助記符影響標(biāo)志

COVAC指令助記符影響標(biāo)志COVAC

ADD

XXX

CLRC

0

ADDC

XXX

CPLC

X

SUBB

XXX

ANLC,bit

X

MUL

0X

ANLC,/bit

X

DIV

0X

ORLC,bit

X

DA

X

ORLC,/bit

X

RRC

X

MOVC,bit

X

RLC

X

CJNE

X

SETBC

1

算術(shù)運(yùn)算類指令功能操作碼助記符操作數(shù)備注加帶進(jìn)位加帶進(jìn)位減ADDADDCSUBB

表示做某種運(yùn)算乘除MULDIV

ABA

B積高字節(jié)在B,低字節(jié)在AA/B商在A,余數(shù)在B增量減量INCDECA,direct,@Ri,Rn,DPTRA,direct,@Ri,Rn不影響標(biāo)志位二-十進(jìn)制調(diào)整DAA

→ADA必須跟在加法指令后3.5.1加減運(yùn)算指令加減運(yùn)算中,以累加器A為第一操作數(shù),并存放操作后的中間結(jié)果,第二操作數(shù)可以是立即數(shù)、工作寄存器內(nèi)容、寄存器間接尋址或直接尋址字節(jié)。運(yùn)算結(jié)果將影響PSW中的OV、C、AC及奇偶標(biāo)志P。源操作數(shù)尋址方式為:寄存器尋址、直接尋址、間接尋址和立即數(shù)尋址四種。⒈加法指令①ADDA,#data ;(A)←(A)+data

代碼:00100100 ;24H立即數(shù)②ADDA,direct ;(A)←(A)+(direct)代碼:00100101 ;25Hdirect③ADDA,@Ri ;(A)←(A)+((Ri))代碼:0010011i ;26H,27H④ADDA,Rn ;(A)←(A)+(Rn)代碼:00101rrr 28H~2FH說明:這四條指令把源字節(jié)變量與A相加,結(jié)果仍存放在A中,并影響標(biāo)志位C、AC、OV、P。相加過程中若位3向位4有進(jìn)位,則輔助進(jìn)位標(biāo)志AC將置位,否則就復(fù)位;若位7有進(jìn)位,則進(jìn)位標(biāo)志C將置位,否則就復(fù)位。對于無符號數(shù)相加時,若C置位,說明結(jié)果溢出(即大于255)。當(dāng)位6和位7不同時有進(jìn)位時,溢出標(biāo)志OV將置位。利用OV可以判斷帶符號數(shù)相加時,和數(shù)是否溢出(即大于127或小于-128)。對于加法,溢出只能發(fā)生在兩個加數(shù)符號相同時。如120與100之和為220,大于127,此時位6有進(jìn)位而位7無進(jìn)位。符號位(位7)由0變1,結(jié)果變負(fù),實(shí)際上它成為和數(shù)的最高位,符號位移入進(jìn)位標(biāo)志。

011110000110010010011011+120100220例3-19: MOVA,#0C3H ADDA,#0AAH

1100001110101010101OV1CYAC10110110+0運(yùn)算后,CY=1,OV=1,AC=0,(PSW)=85H,(A)=6DH,P=1若加數(shù)為負(fù)數(shù),則結(jié)果為正溢出。若加數(shù)是正數(shù),則不需判斷OV。例3-20: MOVA,#54H ADDA,#27H運(yùn)算后,CY=0,OV=0,AC=0,(PSW)=00H,(A)=7BH,P=0

0101010000100111000OV0CYAC11011110+0⒉帶進(jìn)位加法指令①ADDCA,#data ;(A)←(A)+data+(C)代碼:00110100 ;34H立即數(shù)②ADDCA,direct ;(A)←(A)+(direct)+(C)代碼:00110101 ;35Hdirect③ADDCA,@Ri ;(A)←(A)+((Ri))+(C)代碼:0011011i ;36H,37H④ADDCA,Rn ;(A)←(A)+(Rn)+(C)代碼:00111rrr ;38H~3FH這一組命令,除了運(yùn)算時應(yīng)考慮進(jìn)位位外,其它與一般加法指令相同。當(dāng)進(jìn)位位C為0時,則帶進(jìn)位加法指令與不帶進(jìn)位加法指令結(jié)果相同。利用帶進(jìn)位加法指令可以進(jìn)行多字節(jié)加法運(yùn)算。例3-21:設(shè)雙字節(jié)加法中,被加數(shù)放在20H、21H單元,加數(shù)放在30H、31H單元,和存放在40H、41H單元。若高字節(jié)相加有進(jìn)位則轉(zhuǎn)OVER處理。編程如下:ADD2:MOVA,20H ;取被加數(shù)低字節(jié)ADDA,30H ;低字節(jié)相加MOV40H,A ;結(jié)果送40H單元MOVA,21H ;取被加數(shù)高字節(jié)ADDCA,31H;加高字節(jié)和低位來的進(jìn)位MOV41H,A ;結(jié)果送41H單元JCOVER ;有進(jìn)位去OVER處處理RETOVER:…⒊帶借位減法指令⑴SUBBA,#data ;(A)←(A)-data-(C)代碼:10010100 ;94H

立即數(shù)⑵SUBBA,direct ;(A)←(A)-(direct)-(C)代碼:10010101 ;95H direct⑶SUBBA,@Ri ;(A)←(A)-((Ri))-(C)代碼:1001011i ;96H、97H⑷SUBBA,Rn ;(A)←(A)-(Rn)-(C)代碼:10011rrr ;98H~9FH減法指令尋址方式、執(zhí)行過程與加法指令類似。SUBB指令從累加器的內(nèi)容中減去指定的一個字節(jié)和進(jìn)位標(biāo)志。夠減時,進(jìn)位標(biāo)志(表示借位)復(fù)位,不夠減時,發(fā)生借位,進(jìn)位標(biāo)志置位。當(dāng)位3發(fā)生借位時,AC置位,否則AC復(fù)位。當(dāng)位6及位7不同時發(fā)生借位時,OV置位,否則OV復(fù)位。OV置位表示發(fā)生了正數(shù)減去負(fù)數(shù)差為負(fù),或者是發(fā)生了負(fù)數(shù)減去正數(shù)差為正的情況。①當(dāng)運(yùn)算的兩個數(shù)為無符號數(shù)時,檢測是否溢出只用進(jìn)位標(biāo)志CY就可判別,OV表明帶符號數(shù)運(yùn)算時是否有溢出。②由于減法只有帶進(jìn)位減指令,所以在單字節(jié)相減時,必須先清除進(jìn)位標(biāo)志CY。③利用SUBB指令,借助進(jìn)位CY標(biāo)志,可以實(shí)現(xiàn)多精度(也即多字節(jié))減法。例3-22.兩字節(jié)數(shù)相減。被減數(shù)存放在20H、21H單元中,減數(shù)放在30H、31H單元中,差存放在40H、41H單元中。若高字節(jié)有借位轉(zhuǎn)OVER做相應(yīng)處理。編程如下:SUB2:MOVA,20H ;被減數(shù)送ACLRC ;低字節(jié)減無借位,CY清0SUBBA,30H ;低字節(jié)相減MOV40H,A ;結(jié)果送40H單元MOVA,21H ;被減數(shù)高字節(jié)送ASUBBA,31H ;高字節(jié)相減MOV41H,A ;結(jié)果送41H單元JCOVER ;有借位轉(zhuǎn)OVER處理RETOVER:…3.5.2乘除運(yùn)算指令⒈乘法指令:MULAB ;(B7~0)(A7~0)←(A)*(B)代碼:10100100 ;A4H實(shí)現(xiàn)8位無符號數(shù)的乘法操作,2個乘數(shù)分別放在累加器A和寄存器B中,乘積為16位,低8位放在A中,高8位放在B中。若積大于255,則溢出標(biāo)志位置1,否則清0,進(jìn)位標(biāo)志總是清0。例3-23.設(shè)(A)=80H,(B)=32H執(zhí)行MULAB后,積為1900H,(A)=00H,(B)=19H,(OV)=1,(CY)=0例3-24.利用MUL指令可進(jìn)行多字節(jié)乘法運(yùn)算。如兩個雙精度數(shù)相乘,可把被乘數(shù)(cd)和乘數(shù)(ef)分別表示為(cz+zd)和(ez+zf),c,d,e,f都是8位數(shù),z表示8位0。則積為:(cz+zd)(ez+zf)=cezz+zcfz+zdez+zzdf,其中ce,cf,de,df為相應(yīng)的2個8位數(shù)相乘,占16位,可用4次乘法指令求出。若把16位的數(shù)表示為:ceH,ceL,cfH,cfL,deH,deL,dfH,dfL,以H為后綴的是高八位、以L為后綴的為低八位。則積為:ceH

ceL

cfH

cfL

deH

deL+dfH

dfL按列求和,用3次8位數(shù)加法和3次帶進(jìn)位加法即得到積。編程如下:(R7R6)=被乘數(shù)(cd)(R5R4)=乘數(shù)(ef)(R0)=乘積的高位字節(jié)地址指針(R3R2)=部分積(R1)=進(jìn)位位暫存單元MULI:MOVA,R6;zzdf

MOVB,R4MULABMOV@R0,A;存dfL

MOVR3,B;暫存dfH

MOVA,R4;zcfz

MOVB,R7MULABADDA,R3;dfH+cfL

MOVR3,AMOVA,BADDCA,#00HMOVR2,A;暫存cfH

MOVA,R6;zdez

MOVB,R5MULABADDA,R3;dfH+cfL+deL

INCR0MOV@R0,A;存dfH+cfL+deL

MOVR1,#0MOVA,R2ADDCA,B;deH+cfH

MOVR2,A;暫存deH+cfH

JNCLAST;無進(jìn)位INCR1;置進(jìn)位LAST:MOVA,R7;cezz

MOVB,R5MULABADDA,R2;ceL+cfH+deH

INCR0MOV@R0,A;存ceL+cfH+deH

MOVA,BADDCA,R1;ceH+進(jìn)位INCR0MOV@R0,A;存ceH+進(jìn)位RET⒉除法指令:DIVAB ;(A)←(A)/(B)的商;(B)←(A)/(B)的余數(shù)代碼:10000100;84H;(C)←0,(OV)←0DIV實(shí)現(xiàn)8位無符號數(shù)除法,被除數(shù)放在A中,除數(shù)放在B中;指令執(zhí)行后,商放在A中,余數(shù)放在B中;當(dāng)除數(shù)為0時,執(zhí)行后結(jié)果為不定值,OV=1表明除法溢出;指令的執(zhí)行時間是四個機(jī)器周期,是MCS-51指令系統(tǒng)中執(zhí)行時間最長的二條指令之一。例3-25.編寫把A中的二進(jìn)制數(shù)轉(zhuǎn)換為3位BCD碼數(shù)的子程序。其中百位數(shù)放在21H單元中,十位、個位放在20H單元中。編程如下:BINBCD:MOVB,#100 ;被除數(shù)送BDIVAB;得到百位數(shù)MOV21H,AMOVA,#10XCHA,BDIVAB;得到十位數(shù)和個位數(shù)SWAPAADDA,B;組成壓縮的BCD碼MOV20H,ARET3.5.3增量、減量指令⒈增量指令代碼:00000100 ;04H⑴INCA ;(A)←(A)+1⑵INCdirect ;(direct)←(direct)+1代碼:00000101 ;05H direct⑶INC@Ri ;((Ri))←((Ri))+1代碼:0000011i ;06H、07H⑷INCRn ;(Rn)←(Rn)+1代碼:00001rrr ;08H~0FH⑸INCDPTR ;(DPTR)←(DPTR)+1代碼:10100011 ;A3HINC指令共使用3種尋址方式,即寄存器尋址、直接尋址和寄存器間接尋址。INC指令把所指定的變量加1,結(jié)果仍送回原地址單元,原來若為0FFH,加1后將變?yōu)?0H。運(yùn)算結(jié)果不影響任何標(biāo)志位。用本組指令使端口P0~P3內(nèi)容加1時,指令執(zhí)行過程中,首先讀入端口的內(nèi)容,然后在CPU中加1,繼而輸出到端口。應(yīng)注意的是:讀入內(nèi)容來自端口的鎖存器,而不是端口的引腳。該類指令具有“讀→修改→寫”的功能。INCDPTR是16位數(shù)加1指令,按216取模。指令首先對低8位指針DPL的內(nèi)容執(zhí)行加1的操作,當(dāng)產(chǎn)生溢出時,就對DPH的內(nèi)容進(jìn)行加1操作。例3-26.設(shè)R0的內(nèi)容為7EH,內(nèi)部RAM7EH及

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論