<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51手記之指令篇

          51手記之指令篇

          作者: 時間:2016-11-29 來源:網(wǎng)絡 收藏


          三、邏輯運算與循環(huán)類指令
          共有24條指令。邏輯運算指令主要包括邏輯"與"、"或"、"異或"、求反和清零;循環(huán)指令則都是對A的大循環(huán)操作,包括有左、右方向以及帶與不帶進位位的不同循環(huán)方式。
          1.與操作
          ANLA,Rn
          ANLA,dir
          ANLA,@Ri
          ANLA,#data
          執(zhí)行該指令后相與的記過保存在A中
          ANLdir,A
          ANLdir,#data
          2.或操作
          ORLA,Rn
          ORLA,dir
          ORLA,@Ri
          ORLA,#data
          執(zhí)行該指令后相與的記過保存在A中
          ORLdir,A
          ORLdir,#data



          例A=16H,指令RR A執(zhí)行后,A=0BH。
          綜合例:把R2R3中的16位補碼數(shù)(高位在R2中)右移一位,并不改變符號。
          MOVA,R2
          MOVC,ACC.7;把符號位存入進位位C
          RRCA
          MOVR2,A
          MOVA,R3
          RRCA
          MOVR3 , A
          SJMP$

          四、子程序調(diào)用與轉(zhuǎn)移類指令
          共有14條指令。子程序調(diào)用類有絕對調(diào)用和長調(diào)用兩種;轉(zhuǎn)移類分為無條件轉(zhuǎn)移和條件轉(zhuǎn)移兩組。無條件轉(zhuǎn)移包括絕對轉(zhuǎn)移、長轉(zhuǎn)移、短轉(zhuǎn)移和間接轉(zhuǎn)移;條件轉(zhuǎn)移包括結(jié)果為零、結(jié)果為非零、減一后結(jié)果為非零以及兩數(shù)不相等的轉(zhuǎn)移條件,它們?nèi)坎捎孟鄬D(zhuǎn)移的方式。
          絕對于程序調(diào)用和絕對轉(zhuǎn)移指令的機器碼形式比較特殊,操作碼不是在前面而是在中間,并且調(diào)用和轉(zhuǎn)移的范圍都只在2K地址范圍內(nèi),這在使用時應予以注意。
          1.絕對調(diào)用
          ACALL addrll;addrll一PC0-10,PC11-16不變
          說明:
          ①調(diào)用范圍:本指令在2K地址范圍內(nèi)的子程序調(diào)用。本指令實現(xiàn)的操作將不改變原PC的高5位(PC1l-15),僅把11位地址addrll送入PC的低11位(PC0-10),以此確定子程序的入口地址。由于整個64K程序存儲器空間被分成32個基本2K地址范圍(見表2.1),編程時,必須保證緊接AC從L指令后面的那一條指令的第一字節(jié)與被調(diào)用于程序的入口地址在同一2K范圍內(nèi),否則將不能使用ACALL指令實現(xiàn)這種調(diào)用。
          ②機器碼形式:本指令為二字節(jié)指令。設子程序入口地址addrll的各位是a10a9a8a7a6a5a4a3a2a1a。,則ACALL指令的二進制機器碼為a10a9a810001a7a6a5a4a3a2a1a0,其中10001為ACALL指令的操作碼。
          例:子程序調(diào)用指令ACALL在程序存儲器中的首地址為0100H,子程序入口地址為0250H。試確定能否使用ACALL指令實現(xiàn)調(diào)用?如果能使用,確定該指令的機器碼。
          解:因為ACALL指令的首地址在0100H,而ACALL是2字節(jié)指令,所以下一條指令的首地址在0102H。由表2.1可見,0102H和0250H在同一2K地址范圍內(nèi),故可用ACALL調(diào)用。調(diào)用入口地址為0250H的ACALL指令的機器碼形式為:0101000101010000B=5150H
          2.長調(diào)用
          LCALL addrl6;addrl6一PCo-l5
          說明:本指令為64K程序存儲器空間中的全范圍子程序調(diào)用指令,子程序入口地址可在64K地址空間中的任一處。本指令為3字節(jié)指令。
          3.無條件轉(zhuǎn)移指令
          (1)絕對轉(zhuǎn)移
          AJMP addrll;addrll一PC0-10
          說明:①轉(zhuǎn)移范圍:本指令為2K地址范圍內(nèi)的轉(zhuǎn)移指令。對轉(zhuǎn)移目的地址的要求與ACALL指令中對于程序入口地址的要求相同。
          ②機器碼形式:本指令為2字節(jié)指令。設addrll的各位是a10a9a8a7a6a5a4a3a2a1a0,則指令AJMP addrll的二進制機器碼為al0a9a800001a7a6a5a4a3a2ala0。


          例:絕對轉(zhuǎn)移指令AJMP在程序存儲器中的首地址為2500H,要求轉(zhuǎn)移到2250H地址處執(zhí)行程序,試確定能否使用AJMP指令實現(xiàn)轉(zhuǎn)移?如能實現(xiàn),其指令的機器碼形式是什么?
          解:因為AJMP指令的首址為2500H,其下一條指令的首址為2502H,由表2.1可見,2502H與轉(zhuǎn)移目的地址2250H在同一2K地址范圍內(nèi),故可用AJMP指令實現(xiàn)程序的轉(zhuǎn)移。指令的機器碼:0100000l01010000B=4150H
          (2)長轉(zhuǎn)移
          LJMP addrl6;addrl6一PC0-15
          說明:本指令為64K程序存儲器空間的全范圍轉(zhuǎn)移指令。轉(zhuǎn)移地址可為16位地址值中的任一值。本指令為3字節(jié)指令。
          (3)短轉(zhuǎn)移
          SJMP rel;PC十2十rel-PC
          說明:本指令為一頁地址范圍內(nèi)的相對轉(zhuǎn)移指令。因為rel為l字節(jié)補碼(偏移量),且SJMP rel指令為2字節(jié)指令,所以轉(zhuǎn)移范圍為一126D到十129D。
          (4)間接轉(zhuǎn)移
          JMP@A十DPTR;A十DPTR-PC
          例1:A=02H,DPTR=2000H,指令JMP@A十DPTR執(zhí)行后,PC=2002H。也就是說,程序轉(zhuǎn)移到2002H地址單元去執(zhí)行。
          例2:現(xiàn)有一段程序:
          MOVDPTR,#TABLE
          JMP@A十DPTR
          TABLE:AJMPRoUT0
          AJMPRoUTl
          AJMPRoUT2
          : :
          AJMP ROUTn
          根據(jù)JMP@A十DPTR指令的操作可知,當A=00H時,程序轉(zhuǎn)入到地址ROUT0處執(zhí)行;當A=02H時,轉(zhuǎn)到ROUTl處執(zhí)行……??梢娺@是一段多路轉(zhuǎn)移程序,進入的路數(shù)由A確定。因為AJMP指令是2字節(jié)指令,所以要求A必定為偶數(shù)。
          4.條件轉(zhuǎn)移指令
          (1)累加器為零(非零)轉(zhuǎn)移
          JZ rel;A=0則轉(zhuǎn)移(PC十2十rel一PC),A≠0程序順序執(zhí)行
          JNZ rel;A≠0則轉(zhuǎn)移(PC+2+rel-PC),A=0程序順序執(zhí)行
          (2)減一非零轉(zhuǎn)移
          DJNZ Rn,rel;Rn一1-Rn,Rn≠0,則轉(zhuǎn)移(PC十2十re- PC),Rn=0,程序順序執(zhí)行
          DJNZ dir,rel;(dir)一l-dir,(dir)≠0則轉(zhuǎn)移(PC十3十rel-PC),(dir)=0,程序順序執(zhí)行
          說明:UNZ Rn,rel是2字節(jié)指令,而DJNZ dir,rel是3字節(jié)指令,所以在滿足轉(zhuǎn)移的條件后,前者是PC十2十rel一PC,而后者是PC十3十rel一PC。
          例:試說明下列一段程序運行后A中的結(jié)果。
          MOV 23H,#0AH
          CLRA
          LOOP:ADDA,23H
          DJNZ23H,LOOP
          SJMP$
          根據(jù)程序可知,運算結(jié)果A=10+9+8+7+6+5+4+3+2+1=55D=37H
          (2)兩數(shù)不等轉(zhuǎn)移
          CJNEA,dir,rel
          CJNEA,#data,rel
          CJNERn,#data,rel
          CJNE@Ri,#data,rel
          說明:1CJNE指令都是3字節(jié)指令。
          2若第一操作數(shù)大于或等于第二操作數(shù),則影響標志C=0(如指令CJNE A,dir,rel中A>=(dir)等);若第一操作數(shù)小于第二操作數(shù),則C=l(如指令CJNE A,dir,rel中A<(d5r)等)。利用對C的判斷,可使這幾條指令實現(xiàn)兩操作數(shù)相等與否的判斷,還可完成兩數(shù)大小的比較。
          例1:R7=56H,指令CJNE R7,#34H,$十08H執(zhí)行后,程序轉(zhuǎn)移到放本條CJNE指令的首地址($)加08H后的地址單元去執(zhí)行。
          例2:安排程序,要求讀Pl端口上的信息,若不為55H則程序停著等待,只有到P1端口為55H時,程序往下順序執(zhí)行。
          程序為:MOVA,#55H
          CJNEA,P1,$
          5.相對偏移量rel的求法
          在短轉(zhuǎn)移和條件轉(zhuǎn)移中,用偏移量rel和轉(zhuǎn)移指令所處的地址值來計算轉(zhuǎn)移的目的地址。rel是1字節(jié)補碼值,如rel是正數(shù)的補碼,程序往前轉(zhuǎn)移;如rel是負數(shù)的補碼,程序往回轉(zhuǎn)移。下面介紹計算rel大小的方法。
          設本條轉(zhuǎn)移指令的首地址為ad--源地址,字節(jié)數(shù)為Bn-2字節(jié)或3字節(jié),要轉(zhuǎn)移到的地址為ad--目的地址,這三者之間的關(guān)系為:
          ad=as十Bn十rel補
          于是reI=(Ad-As一8n)補
          這就是在已知源地址,目的地址和指令的長度時,計算rel大小的公式。
          由于程序中的時、分、秒數(shù)是已經(jīng)作過十進制調(diào)正后的BCD數(shù),因此#60H,#60H,#24H雖以十六進制數(shù)出現(xiàn),但卻表示BCD數(shù)。
          在于程序調(diào)用與轉(zhuǎn)移指令中,由于絕對轉(zhuǎn)移和絕對調(diào)用指令AJMP和ACALL指令字節(jié)少,轉(zhuǎn)移范圍大,因而是常用的指令。但使用時應注意其機器碼形式及允許使用的條件。相對轉(zhuǎn)移類指令因本身長度有2字節(jié)和3字節(jié)之分,這會影響到偏移量大小的計算,因而也要十分注意。此外,條件轉(zhuǎn)移指令中,由于沒有結(jié)果為正和結(jié)果為負等轉(zhuǎn)移條件的指令,因而這些轉(zhuǎn)移的要求,只能由CJNE指令加上對進位位的判斷來實現(xiàn)。

          五、位操作類指令
          共有17條指令。其共同特點是對進位位C和直接位地址Nt的操作。其中包括清零、置1、求反、邏輯與、邏輯或、傳送以及判斷轉(zhuǎn)移。MCS-51單片機中這些豐富的位操作指令表現(xiàn)出其具有優(yōu)異的布爾處理能力
          1.清位
          CLRC;C=0
          CLRbit ;bit=0
          2.置位
          SETBC;C=1
          SETBbit ;bit=1
          3.位求反
          CPLC;C取反
          CPLbit ;bit取反
          4.位與
          ANLC,bit;C = bit and C
          5.位或
          ORLC,bit;C = C or bit
          6.位傳送
          MOVC,bit;C = bit
          MOVbit,C;bit = C

          上一頁 1 2 下一頁

          關(guān)鍵詞: 51手記指令

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();