色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          51手記之指令篇

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


          三、邏輯運(yùn)算與循環(huán)類指令
          共有24條指令。邏輯運(yùn)算指令主要包括邏輯"與"、"或"、"異或"、求反和清零;循環(huán)指令則都是對A的大循環(huán)操作,包括有左、右方向以及帶與不帶進(jì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位補(bǔ)碼數(shù)(高位在R2中)右移一位,并不改變符號。
          MOVA,R2
          MOVC,ACC.7;把符號位存入進(jìn)位位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)移指令的機(jī)器碼形式比較特殊,操作碼不是在前面而是在中間,并且調(diào)用和轉(zhuǎn)移的范圍都只在2K地址范圍內(nèi),這在使用時(shí)應(yīng)予以注意。
          1.絕對調(diào)用
          ACALL addrll;addrll一PC0-10,PC11-16不變
          說明:
          ①調(diào)用范圍:本指令在2K地址范圍內(nèi)的子程序調(diào)用。本指令實(shí)現(xiàn)的操作將不改變原PC的高5位(PC1l-15),僅把11位地址addrll送入PC的低11位(PC0-10),以此確定子程序的入口地址。由于整個(gè)64K程序存儲器空間被分成32個(gè)基本2K地址范圍(見表2.1),編程時(shí),必須保證緊接AC從L指令后面的那一條指令的第一字節(jié)與被調(diào)用于程序的入口地址在同一2K范圍內(nèi),否則將不能使用ACALL指令實(shí)現(xiàn)這種調(diào)用。
          ②機(jī)器碼形式:本指令為二字節(jié)指令。設(shè)子程序入口地址addrll的各位是a10a9a8a7a6a5a4a3a2a1a。,則ACALL指令的二進(jìn)制機(jī)器碼為a10a9a810001a7a6a5a4a3a2a1a0,其中10001為ACALL指令的操作碼。
          例:子程序調(diào)用指令A(yù)CALL在程序存儲器中的首地址為0100H,子程序入口地址為0250H。試確定能否使用ACALL指令實(shí)現(xiàn)調(diào)用?如果能使用,確定該指令的機(jī)器碼。
          解:因?yàn)锳CALL指令的首地址在0100H,而ACALL是2字節(jié)指令,所以下一條指令的首地址在0102H。由表2.1可見,0102H和0250H在同一2K地址范圍內(nèi),故可用ACALL調(diào)用。調(diào)用入口地址為0250H的ACALL指令的機(jī)器碼形式為: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指令中對于程序入口地址的要求相同。
          ②機(jī)器碼形式:本指令為2字節(jié)指令。設(shè)addrll的各位是a10a9a8a7a6a5a4a3a2a1a0,則指令A(yù)JMP addrll的二進(jìn)制機(jī)器碼為al0a9a800001a7a6a5a4a3a2ala0。


          例:絕對轉(zhuǎn)移指令A(yù)JMP在程序存儲器中的首地址為2500H,要求轉(zhuǎn)移到2250H地址處執(zhí)行程序,試確定能否使用AJMP指令實(shí)現(xiàn)轉(zhuǎn)移?如能實(shí)現(xiàn),其指令的機(jī)器碼形式是什么?
          解:因?yàn)锳JMP指令的首址為2500H,其下一條指令的首址為2502H,由表2.1可見,2502H與轉(zhuǎn)移目的地址2250H在同一2K地址范圍內(nèi),故可用AJMP指令實(shí)現(xiàn)程序的轉(zhuǎn)移。指令的機(jī)器碼: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)移指令。因?yàn)閞el為l字節(jié)補(bǔ)碼(偏移量),且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指令的操作可知,當(dāng)A=00H時(shí),程序轉(zhuǎn)入到地址ROUT0處執(zhí)行;當(dāng)A=02H時(shí),轉(zhuǎn)到ROUTl處執(zhí)行……。可見這是一段多路轉(zhuǎn)移程序,進(jìn)入的路數(shù)由A確定。因?yàn)锳JMP指令是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。
          例:試說明下列一段程序運(yùn)行后A中的結(jié)果。
          MOV 23H,#0AH
          CLRA
          LOOP:ADDA,23H
          DJNZ23H,LOOP
          SJMP$
          根據(jù)程序可知,運(yùn)算結(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ù),則影響標(biāo)志C=0(如指令CJNE A,dir,rel中A>=(dir)等);若第一操作數(shù)小于第二操作數(shù),則C=l(如指令CJNE A,dir,rel中A<(d5r)等)。利用對C的判斷,可使這幾條指令實(shí)現(xiàn)兩操作數(shù)相等與否的判斷,還可完成兩數(shù)大小的比較。
          例1:R7=56H,指令CJNE R7,#34H,$十08H執(zhí)行后,程序轉(zhuǎn)移到放本條CJNE指令的首地址($)加08H后的地址單元去執(zhí)行。
          例2:安排程序,要求讀Pl端口上的信息,若不為55H則程序停著等待,只有到P1端口為55H時(shí),程序往下順序執(zhí)行。
          程序?yàn)椋篗OVA,#55H
          CJNEA,P1,$
          5.相對偏移量rel的求法
          在短轉(zhuǎn)移和條件轉(zhuǎn)移中,用偏移量rel和轉(zhuǎn)移指令所處的地址值來計(jì)算轉(zhuǎn)移的目的地址。rel是1字節(jié)補(bǔ)碼值,如rel是正數(shù)的補(bǔ)碼,程序往前轉(zhuǎn)移;如rel是負(fù)數(shù)的補(bǔ)碼,程序往回轉(zhuǎn)移。下面介紹計(jì)算rel大小的方法。
          設(shè)本條轉(zhuǎn)移指令的首地址為ad--源地址,字節(jié)數(shù)為Bn-2字節(jié)或3字節(jié),要轉(zhuǎn)移到的地址為ad--目的地址,這三者之間的關(guān)系為:
          ad=as十Bn十rel補(bǔ)
          于是reI=(Ad-As一8n)補(bǔ)
          這就是在已知源地址,目的地址和指令的長度時(shí),計(jì)算rel大小的公式。
          由于程序中的時(shí)、分、秒數(shù)是已經(jīng)作過十進(jìn)制調(diào)正后的BCD數(shù),因此#60H,#60H,#24H雖以十六進(jìn)制數(shù)出現(xiàn),但卻表示BCD數(shù)。
          在于程序調(diào)用與轉(zhuǎn)移指令中,由于絕對轉(zhuǎn)移和絕對調(diào)用指令A(yù)JMP和ACALL指令字節(jié)少,轉(zhuǎn)移范圍大,因而是常用的指令。但使用時(shí)應(yīng)注意其機(jī)器碼形式及允許使用的條件。相對轉(zhuǎn)移類指令因本身長度有2字節(jié)和3字節(jié)之分,這會影響到偏移量大小的計(jì)算,因而也要十分注意。此外,條件轉(zhuǎn)移指令中,由于沒有結(jié)果為正和結(jié)果為負(fù)等轉(zhuǎn)移條件的指令,因而這些轉(zhuǎn)移的要求,只能由CJNE指令加上對進(jìn)位位的判斷來實(shí)現(xiàn)。

          五、位操作類指令
          共有17條指令。其共同特點(diǎn)是對進(jìn)位位C和直接位地址Nt的操作。其中包括清零、置1、求反、邏輯與、邏輯或、傳送以及判斷轉(zhuǎn)移。MCS-51單片機(jī)中這些豐富的位操作指令表現(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)閉