51手記之指令篇
三、邏輯運算與循環(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
評論