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

下載本文檔

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

文檔簡介

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

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

S、2S、4S。

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

表面上看起來符合MCS-51的指令形式,實際上是不正確的。因為82H是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ù)的絕對地址。該指令的功能很強,能實現(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中轉。例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⒋目標地址傳送:16位立即數(shù)送數(shù)據(jù)指針DPTR。MOVDPTR,#data16 ;(DPH)←#data15~#data8;(DPL)←#data7~#data0說明:這是整個指令系統(tǒng)中唯一的一條16位數(shù)據(jù)的傳送指令,用來設置地址指針。如:MOVDPTR,#2003H;執(zhí)行后,(DPH)=20H,(DPL)=03H。代碼:10011000 ;90H #data15~8 #data7~0

3.3.2外部數(shù)據(jù)存儲器(或外擴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口作分時復用的地址、數(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ù)據(jù)存儲器(2030H)=2AH,(5DH)=88H,累加器(A)=0F8H,工作寄存器(R0)=5DH,數(shù)據(jù)指針(DPTR)=2030H。則執(zhí)行如下指令時的結果為: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)生進位時,直接加到高位,并不影響標志位。⒉MOVCA,@A+DPTR ;(A)←((A)+(DPTR))代碼:10010011 93H這兩條指令主要用于查表,就是完成從程序存儲器讀取數(shù)據(jù)的功能。但是由于MOVCA,@A+PC以PC作為基址寄存器,在CPU執(zhí)行取完該指令操作碼時,PC值會自動加1,指向下一條指令的第一個字節(jié),這時PC中的值已經(jīng)不是該指令所在單元的值,而是PC+1。因為A中的內(nèi)容為8位無符號整數(shù),這使得查表范圍受到限制,只能在以PC當前值開始后的256個字節(jié)范圍內(nèi)。編程時還需進行偏移量的計算,計算公式為:偏移量=表首地址-(該指令所在地址+1)而MOVCA,@A+DPTR以DPTR作為基址寄存器,由于DPTR的內(nèi)容可以通過賦值改變,從而使得這條指令的應用范圍更為廣泛,表格常數(shù)可以設置在64KB程序存儲器的任何地址空間,而不必象MOVCA,@A+PC指令那樣只能把表格常數(shù)只設在PC指針以下的256個單元中。缺點是在DPTR已經(jīng)有別的用途時,在賦表首地址值之前,必須保護現(xiàn)場,執(zhí)行完查表指令后再對DPTR予以恢復。例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)容找到相應的數(shù)據(jù)值。這是因為當MOVCA,@A+PC執(zhí)行后,PC值已經(jīng)是ppqq+3,而不是ppqq+4,即不是DB所定義的四個值的區(qū)域開始處。例3-8:試編制根據(jù)累加器A中的數(shù)(0~9)查其平方表的子程序。COUNT:PUSHDPH ;保護DPTR內(nèi)容PUSHDPLMOVDPTR,#TABLE;賦表首址→DPTRMOVCA,@A+DPTR ;據(jù)A中內(nèi)容查表POPDPL ;恢復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:設(A)=57H,(20H)=68H,(R0)=30H,(30H)=39H則執(zhí)行時:代碼結果①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í)行后不影響標志位。⒉出棧操作:POPdirect代碼:11010000 ;D0H

直接地址

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

A

→A

表示某種運算"→"表示送到目的地址雙操作數(shù):與或異或ANLORLXRL3.4.1對累加器A進行的邏輯操作(單操作數(shù)指令)⒈對累加器A清0:CLRA ;(A)←0代碼:11100100 ;E4H⒉累加器A內(nèi)容求反:CPLA ;(A)←A代碼:11110100 F4H說明:把累加器A內(nèi)容求反后送入A中。不影響標志位。⒊累加器A左右移位RLA①累加器A內(nèi)容循環(huán)左移:代碼:00100011 23H操作:(An+1)←(An);n=0~6(A0)←(A7)RLACA7A0②累加器A內(nèi)容連同進位標志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)容連同進位標志C一起循環(huán)右移RRCA代碼:00010011 ;13H操作:(An)←(An+1);n=0~6(C)←(A0)(A7)←(C)RRCACYA7A0左右移位指令,左移一位相當于乘2,右移一位相當于除2。由于左右移位指令的這一特點,當一個數(shù)要乘/除2的倍數(shù)時,而且這個倍數(shù)不大(如2、4、8、16),并且移位后結果不溢出的情況下,用左右移位指令要比乘/除法指令執(zhí)行的速度快。帶進位位的移位可用于檢查一個字節(jié)中的各位的狀態(tài),或用于逐位輸出的情況。例3-12:8031的P2口中的P2.3~P2.6與譯碼器輸入端連接如下圖,欲使累加器A中的數(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í)行不影響標志位。例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設P1.4~0例3-17:對內(nèi)部RAM中78H單元的1,3,5,7位求反。MOVA,#0AAH ;10101010BXRL78H,AWhy?⒉直接地址單元(內(nèi)部RAM,SFR)與累加器A、立即數(shù)間的邏輯操作說明:①當direct為第二操作數(shù)時,若direct為端口P0~P3,數(shù)據(jù)來自端口的鎖存器;②當direct為第一操作數(shù)時、A為第二操作數(shù)時,若direct為端口P0~P3,在程序運行時用該指令可根據(jù)A的內(nèi)容動態(tài)地修改輸出口的內(nèi)容,是一條“讀→修改→寫”指令。③當direct為第一操作數(shù)、立即數(shù)為第二操作數(shù)時,若direct為端口P0~P3,是一條“讀→修改→寫”指令。例3-18:設兩位用ASCII碼表示的數(shù)分別保存在40H、41H單元中,把其轉換成兩位BCD數(shù)據(jù),并以壓縮形式存入40H單元中。ANL40H,#0FH ;40H的ASCII碼變?yōu)锽CD碼MOVA,41HANLA,#0FH ;41H的ASCII碼變?yōu)锽CD碼SWAPAORL40H,A ;結果存入40H單元中3.5算術運算類指令算術運算類指令包括4種基本的算術操作指令,即加減乘除。這4種指令能對8位的無符號數(shù)進行直接的運算。借助于溢出標志,可對帶符號數(shù)進行補碼運算。借助于進位標志,可以實現(xiàn)多精度的加、減和環(huán)移。借助于輔助進位標志,可以進行BCD碼調(diào)整。算術運算指令執(zhí)行的結果將使進位CY、輔助進位AC、溢出OV三種標志置位或復位,但是加1或減1指令不影響這些標志位。算術運算類指令用到的助記符有ADD、ADDC、INC、DA、DEC、SUBB、MUL和DIV八種。影響標志的指令

指令助記符影響標志

COVAC指令助記符影響標志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ù)備注加帶進位加帶進位減ADDADDCSUBB

表示做某種運算乘除MULDIV

ABA

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

→ADA必須跟在加法指令后3.5.1加減運算指令加減運算中,以累加器A為第一操作數(shù),并存放操作后的中間結果,第二操作數(shù)可以是立即數(shù)、工作寄存器內(nèi)容、寄存器間接尋址或直接尋址字節(jié)。運算結果將影響PSW中的OV、C、AC及奇偶標志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相加,結果仍存放在A中,并影響標志位C、AC、OV、P。相加過程中若位3向位4有進位,則輔助進位標志AC將置位,否則就復位;若位7有進位,則進位標志C將置位,否則就復位。對于無符號數(shù)相加時,若C置位,說明結果溢出(即大于255)。當位6和位7不同時有進位時,溢出標志OV將置位。利用OV可以判斷帶符號數(shù)相加時,和數(shù)是否溢出(即大于127或小于-128)。對于加法,溢出只能發(fā)生在兩個加數(shù)符號相同時。如120與100之和為220,大于127,此時位6有進位而位7無進位。符號位(位7)由0變1,結果變負,實際上它成為和數(shù)的最高位,符號位移入進位標志。

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

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

0101010000100111000OV0CYAC11011110+0⒉帶進位加法指令①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這一組命令,除了運算時應考慮進位位外,其它與一般加法指令相同。當進位位C為0時,則帶進位加法指令與不帶進位加法指令結果相同。利用帶進位加法指令可以進行多字節(jié)加法運算。例3-21:設雙字節(jié)加法中,被加數(shù)放在20H、21H單元,加數(shù)放在30H、31H單元,和存放在40H、41H單元。若高字節(jié)相加有進位則轉OVER處理。編程如下:ADD2:MOVA,20H ;取被加數(shù)低字節(jié)ADDA,30H ;低字節(jié)相加MOV40H,A ;結果送40H單元MOVA,21H ;取被加數(shù)高字節(jié)ADDCA,31H;加高字節(jié)和低位來的進位MOV41H,A ;結果送41H單元JCOVER ;有進位去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é)和進位標志。夠減時,進位標志(表示借位)復位,不夠減時,發(fā)生借位,進位標志置位。當位3發(fā)生借位時,AC置位,否則AC復位。當位6及位7不同時發(fā)生借位時,OV置位,否則OV復位。OV置位表示發(fā)生了正數(shù)減去負數(shù)差為負,或者是發(fā)生了負數(shù)減去正數(shù)差為正的情況。①當運算的兩個數(shù)為無符號數(shù)時,檢測是否溢出只用進位標志CY就可判別,OV表明帶符號數(shù)運算時是否有溢出。②由于減法只有帶進位減指令,所以在單字節(jié)相減時,必須先清除進位標志CY。③利用SUBB指令,借助進位CY標志,可以實現(xiàn)多精度(也即多字節(jié))減法。例3-22.兩字節(jié)數(shù)相減。被減數(shù)存放在20H、21H單元中,減數(shù)放在30H、31H單元中,差存放在40H、41H單元中。若高字節(jié)有借位轉OVER做相應處理。編程如下:SUB2:MOVA,20H ;被減數(shù)送ACLRC ;低字節(jié)減無借位,CY清0SUBBA,30H ;低字節(jié)相減MOV40H,A ;結果送40H單元MOVA,21H ;被減數(shù)高字節(jié)送ASUBBA,31H ;高字節(jié)相減MOV41H,A ;結果送41H單元JCOVER ;有借位轉OVER處理RETOVER:…3.5.2乘除運算指令⒈乘法指令:MULAB ;(B7~0)(A7~0)←(A)*(B)代碼:10100100 ;A4H實現(xiàn)8位無符號數(shù)的乘法操作,2個乘數(shù)分別放在累加器A和寄存器B中,乘積為16位,低8位放在A中,高8位放在B中。若積大于255,則溢出標志位置1,否則清0,進位標志總是清0。例3-23.設(A)=80H,(B)=32H執(zhí)行MULAB后,積為1900H,(A)=00H,(B)=19H,(OV)=1,(CY)=0例3-24.利用MUL指令可進行多字節(jié)乘法運算。如兩個雙精度數(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為相應的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次帶進位加法即得到積。編程如下:(R7R6)=被乘數(shù)(cd)(R5R4)=乘數(shù)(ef)(R0)=乘積的高位字節(jié)地址指針(R3R2)=部分積(R1)=進位位暫存單元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;無進位INCR1;置進位LAST:MOVA,R7;cezz

MOVB,R5MULABADDA,R2;ceL+cfH+deH

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

MOVA,BADDCA,R1;ceH+進位INCR0MOV@R0,A;存ceH+進位RET⒉除法指令:DIVAB ;(A)←(A)/(B)的商;(B)←(A)/(B)的余數(shù)代碼:10000100;84H;(C)←0,(OV)←0DIV實現(xiàn)8位無符號數(shù)除法,被除數(shù)放在A中,除數(shù)放在B中;指令執(zhí)行后,商放在A中,余數(shù)放在B中;當除數(shù)為0時,執(zhí)行后結果為不定值,OV=1表明除法溢出;指令的執(zhí)行時間是四個機器周期,是MCS-51指令系統(tǒng)中執(zhí)行時間最長的二條指令之一。例3-25.編寫把A中的二進制數(shù)轉換為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,結果仍送回原地址單元,原來若為0FFH,加1后將變?yōu)?0H。運算結果不影響任何標志位。用本組指令使端口P0~P3內(nèi)容加1時,指令執(zhí)行過程中,首先讀入端口的內(nèi)容,然后在CPU中加1,繼而輸出到端口。應注意的是:讀入內(nèi)容來自端口的鎖存器,而不是端口的引腳。該類指令具有“讀→修改→寫”的功能。INCDPTR是16位數(shù)加1指令,按216取模。指令首先對低8位指針DPL的內(nèi)容執(zhí)行加1的操作,當產(chǎn)生溢出時,就對DPH的內(nèi)容進行加1操作。例3-26.設R0的內(nèi)容為7EH,內(nèi)部RAM7EH及

溫馨提示

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

評論

0/150

提交評論