單片機(jī)的指令系統(tǒng)
一、數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令主要負(fù)責(zé)把數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲單元中。這類指令共有29條,可分為以下3大類:基本數(shù)據(jù)傳送指令,數(shù)據(jù)交換指令,棧操作指令。
執(zhí)行數(shù)據(jù)傳送指令時,除以累加器A為目的操作數(shù)的指令會對奇偶標(biāo)志位P有影響外,其余指令執(zhí)行時均不會影響任何標(biāo)志位。
1. 基本數(shù)據(jù)傳送指令
根據(jù)數(shù)據(jù)取自何方和傳到何方,MOV指令有著許多不同的形式。
(1)以累加器A為目的操作數(shù)類指令
這組指令的作用是把源操作數(shù)指向的內(nèi)容送到累加器A。有立即數(shù)、直接、寄存器和寄存器間接尋址方式:
MOV A, #data ; data→(A)
MOV A, direct ;(direct)→(A)
MOV A, Ri ;(Ri)→(A)
MOV A, @Rj ;((Rj))→(A)
(2) 以寄存器Ri為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)指定的內(nèi)容送到所選定的工作寄存器Ri中。有立即、直接和寄存器尋址方式:
(3)以直接地址為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)指定的內(nèi)容送到由直接地址direct所選定的片內(nèi)RAM中。有立即、直接、寄存器和寄存器間接4種尋址方式:
(4)以間接地址為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)指定的內(nèi)容送到以Rj中的內(nèi)容為地址的片內(nèi)RAM中。有立即、直接和寄存器3種尋址方式
(5) 查表指令
這組指令的功能是對存放于程序存儲器中的數(shù)據(jù)表格進(jìn)行查找傳送,使用變址尋址方式:
MOVC A, @A+DPTR ;((A)+(DPTR))→(A)
MOVC A, @A+PC ;((PC))+1→(PC),((A)+(PC))→(A)
(6) 累加器A與片外數(shù)據(jù)存儲器RAM傳送指令
這組指令的作用是累加器A與片外RAM間的數(shù)據(jù)傳送。使用寄存器尋址方式:
MOVX @DPTR, A ;(A)→((DPTR))
MOVX A, @DPTR ;((DPTR))→(A)
MOVX A, @Rj ;((Rj))→(A)
MOVX @Rj,A ;(A)→((Rj))
(7)16位數(shù)據(jù)傳送指令
這條指令的功能是把16位常數(shù)送入數(shù)據(jù)指針寄存器。
MOV DPTR, #data16 ; dataH→(DPH),dataL→(DPL)
2. 交換指令
MOV指令主要完成從一處到另一處的拷貝,XCH指令則可實現(xiàn)數(shù)據(jù)的雙向傳送。所有的操作都涉及到累加器A,可以把把累加器A中的內(nèi)容與源操作數(shù)所指的數(shù)據(jù)相互交換。
XCH A, direct ;(A)←→(direct)
XCH A, Ri ;(A)←→(Ri)
XCH A, @Rj ;(A)←→((Rj))
XCHD A, @Rj ;(A3-0)←→((Rj)3-0)
SWAP A ;(A3-0)←→(A7-4)
3. 入棧/出棧指令
這類指令的作用是把直接尋址單元的內(nèi)容傳送到堆棧指針SP所指的單元中,以及把SP所指單元的內(nèi)容送到直接尋址單元中。
⑴ PUSH指令
堆棧的入棧指令,該指令可以把某片內(nèi)RAM單元(低128字節(jié))或某專用寄存器的內(nèi)容入棧。
PUSH direct ;(SP)+1→(SP),(direct)→(SP)
⑵ POP指令
堆棧的出棧指令,該指令用于恢復(fù)某片內(nèi)RAM單元(低128字節(jié))或某專用寄存器的內(nèi)容。
POP direct ;(SP)→(direct),(SP)-1→(SP)
二、算術(shù)運(yùn)算指令在51系列單片機(jī)的指令系統(tǒng)中,提供了完備的加、減、乘、除算術(shù)運(yùn)算指令及增量(加1)、減量(減1)運(yùn)算,可處理不帶符號或帶符號的8/16二進(jìn)制數(shù)。除加1和減1指令外,算術(shù)運(yùn)算指令會影響進(jìn)位、半進(jìn)位和溢出位三個標(biāo)志位。
1. 不帶進(jìn)位的加法指令
這組指令的作用是把立即數(shù),直接地址、工作寄存器及間接地址內(nèi)容與累加器A的內(nèi)容相加,運(yùn)算結(jié)果存在A中。
ADD A, #data ;(A)+ data→(A)
ADD A, direct ;(A)+(direct)→(A)
ADD A, Ri ;(A)+(Ri)→(A)
ADD A, @Rj ;(A)+((Rj))→(A)
本組指令的執(zhí)行將影響標(biāo)志位AC、CY、OV、P。當(dāng)和的第3、7位有進(jìn)位時,分別將AC,CY標(biāo)志位置位;否則復(fù)位。對于無符號數(shù),進(jìn)位標(biāo)志位CY=1,表示溢出;CY=0表示無溢出。帶符號數(shù)運(yùn)算的溢出取決于第6、7位,若這2位中有一位產(chǎn)生進(jìn)位,而另一位不產(chǎn)生進(jìn)位,則溢出標(biāo)志位OV置位,否則被復(fù)位。
2. 帶進(jìn)位加法指令
這組指令的作用是把立即數(shù),直接地址、工作寄存器及間接地址內(nèi)容與累加器A的內(nèi)容以及進(jìn)位位C相加,運(yùn)算結(jié)果存在A中。
本組指令執(zhí)行對標(biāo)志位AC、CY、OV、P的影響與ADD指令相同。
3. 增量指令
這組指令的的功能均為原寄存器的內(nèi)容加1,結(jié)果送回原寄存器。這組指令共有直接、寄存器、寄存器間接尋址等尋址方式:
INC A ;(A)+1→(A)
INC direct ;(direct)+1→(direct)
INC Ri ;(Rn)+1→(Ri)
INC @Rj ;((Rj))+1→((Rj))
INC DPTR ;(DPTR)+1→(DPTR)
增量指令不會對任何標(biāo)志有影響。
4. 帶借位減法指令
這組指令包含立即數(shù)、直接地址、間接地址及工作寄存器與累加器A連同借位位C內(nèi)容相減,結(jié)果送回累加器A中。
SUBB A, #data ;(A)- data -(C)→(A)
SUBB A, direct ;(A)-(direct) - (C)→(A)
SUBB A, Ri ;(A)-(Ri) -(C)→(A)
SUBB A, @Rj ;(A)-((Rj)) -(C)→(A)
本指令執(zhí)行將影響標(biāo)志位AC、CY、OV、P。若第七位有借位,則將CY置位,否則CY復(fù)位。若第3位有錯位,則置位輔助進(jìn)位標(biāo)志AC,否則 AC復(fù)位。若第7和第6位中有一位需借位,而另一位不借位,則置位溢出標(biāo)志OV。
當(dāng)在進(jìn)行單字節(jié)或多字節(jié)減法前,不知道進(jìn)位標(biāo)志位CY的值,則應(yīng)在減法指令前先將CY復(fù)位清“0”。
5. 減量指令
這組指令的作用是把所指的寄存器內(nèi)容減1,結(jié)果送回原寄存器,這組指令共有直接、寄存器、寄存器間接尋址等尋址方式:
DEC A ;(A)-1→(A)
DEC direct ;(direct)-1→(direct)
DEC Ri ;(Ri)-1→(Ri)
DEC @Rj ;((Rj))-1→((Rj))
運(yùn)算結(jié)果不影響任何標(biāo)志位。
6. 乘法指令
這條指令的作用是把累加器A和寄存器B中的8位無符號數(shù)相乘,所得到的是16位乘積,這個結(jié)果低8位存在累加器A,而高8位存在寄存器B中。
MUL AB ;(A)×(B)→(B)和(A)
乘法指令需要4個機(jī)器周期。
如果乘積大于255(0FFH),即B的內(nèi)容不為0時,則置位溢出標(biāo)志位OV,否則OV復(fù)位。進(jìn)位標(biāo)志位CY總是復(fù)位為0。
7. 除法指令
這條指令的作用是把累加器A的8位無符號整數(shù)除以寄存器B中的8位無符號整數(shù),所得到的商存在累加器A,而余數(shù)存在寄存器B中。
DIV AB ;(A)÷(B)→(A)和(B)
除法指令需要4個機(jī)器周期。
本指令總是將CY和OV標(biāo)志位復(fù)位。當(dāng)除數(shù)(B中內(nèi)容)為00H時,那么執(zhí)行結(jié)果將為不定值,則置位溢出標(biāo)志位OV。
8. 十進(jìn)制調(diào)整指令
在進(jìn)行BCD碼運(yùn)算時,這條指令總是跟在ADD或ADDC指令之后,其功能是將執(zhí)行加法運(yùn)算后存于累加器A中的結(jié)果進(jìn)行調(diào)整和修正。
DA A
三、邏輯運(yùn)算指令在51系列單片機(jī)的指令系統(tǒng)中提供的邏輯運(yùn)算指令主要包括ANL(與),ORL(或),XRL(異或)等指令。
1. 邏輯與指令A(yù)NL
這組指令的功能是在指出的變量之間以位為基礎(chǔ)的邏輯與操作。操作數(shù)有寄存器尋址、直接尋址、寄存器間接尋址和立即尋址等尋址方式:
ANL A, #data ;(A)∧ data →(A)
ANL A, direct ;(A)∧ (direct) →(A)
ANL A, Ri ;(A)∧ (Ri)→(A)
ANL A, @Rj ;(A)∧ ((Rj))→(A)
ANL direct, #data ;(direct)∧ data →(direct)
ANL direct, A ;(direct)∧ (A) →(A)
2. 邏輯或指令ORL
這組指令的功能是在所指出的變量之間執(zhí)行以位為基礎(chǔ)的邏輯或操作,結(jié)果存到目的變量中去。操作數(shù)有立即尋址、直接尋址、寄存器尋址和寄存器間接尋址方式:
3. 邏輯異或指令XRL
這組指令的功能是在所指出的變量之間執(zhí)行以位為基礎(chǔ)的邏輯異或操作,結(jié)果存放到目的變量中去。操作數(shù)有立即尋址、直接尋址、寄存器尋址和寄存器間接尋址方式:
4. 循環(huán)移位指令
這4條指令的作用是將累加器中的內(nèi)容循環(huán)左或右移一位,后兩條指令是連同進(jìn)位位CY一起移位。
RL A ; 累加器A中的內(nèi)容左移一位。
RR A ; 累加器A中的內(nèi)容右移一位。
RLC A ; 累加器A中的內(nèi)容連同進(jìn)位位CY左移一位。
RRC A ; 累加器A中的內(nèi)容連同進(jìn)位位CY右移一位。
5. 求反指令
這條指令將累加器中的內(nèi)容按位取反。
CPL A ; 累加器中的內(nèi)容按位取反。
6. 清零指令
這條指令將累加器中的內(nèi)容清0。
CLR A ; 0→(A),累加器中的內(nèi)容清0。
四、位操作類指令MCS-51單片機(jī)內(nèi)部有一個布爾處理機(jī),對位地址空間具有豐富的位操作指令。
1. 位傳送指令
這2條指令的功能是把由源操作數(shù)指出的布爾變量送到目的操作數(shù)指定的位中去。其中一個操作數(shù)必須為進(jìn)位標(biāo)志,另一個可以是任何直接尋址位。
MOV C, bit ; bit→CY,某位數(shù)據(jù)送CY。
MOV bit, C ; CY→bit,CY數(shù)據(jù)送某位。
本組指令不影響其他寄存器和標(biāo)志位。
2. 位變量修改指令
這些指令對CY及可尋址位進(jìn)行置位或復(fù)位操作
CLR C ; 0→CY,復(fù)位CY。
CLR bit ; 0→bit,復(fù)位某一位。
SETB C ; 1→CY,置位CY。
SETB bit ; 1→bit,置位某一位。
本組指令不影響其他標(biāo)志。
3. 位變量邏輯指令
位運(yùn)算都是邏輯運(yùn)算,有與、或、非三種指令
ANL C,bit ; (CY)∧(bit)→CY
ANL C, /bit ; (CY)∧()→CY
ORL C,bit ; (CY)∨(bit)→CY
ORL C,/bit ; (CY)∧()→CY
CPL C ; ()→CY
CPL bit ; ()→bit
4. 位變量條件轉(zhuǎn)移指令
位變量條件轉(zhuǎn)移指令是以位的狀態(tài)作為實現(xiàn)程序轉(zhuǎn)移的判斷條件:
JC rel ; (CY)=1轉(zhuǎn)移,(PC)+2+rel→PC,否則程序往下執(zhí)行,(PC)+2→PC。
JNC rel ; (CY)=0轉(zhuǎn)移,(PC)+2+rel→PC,否則程序往下執(zhí)行,(PC)+2→PC。
JB bit, rel ;位狀態(tài)為1轉(zhuǎn)移。
JNB bit, rel ;位狀態(tài)為0轉(zhuǎn)移。
JBC bit, rel ;位狀態(tài)為1轉(zhuǎn)移,并使該位清“0”。
五、控制轉(zhuǎn)移指令一般情況下指令是順序執(zhí)行的逐條執(zhí)行的,但實際上程序不可能全部順序執(zhí)行而經(jīng)常需要改變程序的執(zhí)行流程,常用的控制轉(zhuǎn)移指令有:
1. 無條件轉(zhuǎn)移指令
這組指令執(zhí)行完后,程序就會無條件轉(zhuǎn)移到指令所指向的地址上去。長轉(zhuǎn)移指令訪問的程序存儲器空間為16地址64kB,絕對轉(zhuǎn)移指令訪問的程序存儲器空間為11位地址2kB空間。
LJMP addr16 ; addr16→(PC)
AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)
SJMP rel ;(PC)+ 2 + rel→(PC)
JMP @A+DPTR ;(A)+(DPTR)→(PC)
2. 條件轉(zhuǎn)移指令
條件轉(zhuǎn)移指令是依某種特定條件轉(zhuǎn)移的指令。條件滿足時轉(zhuǎn)移(相當(dāng)于一條相對轉(zhuǎn)移指令),條件不滿足時則順序執(zhí)行下面的指令。目的地址在下一條指令的起始地址為中心的256個字節(jié)范圍中(-128~+127)。當(dāng)條件滿足時,先把PC指向指向下一條指令的第一個字節(jié)地址,再把有符號的相對偏移量加到PC上,計算出轉(zhuǎn)向地址。
JZ rel ; A=0,(PC)+ 2 + rel→(PC)
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC)
3. 比較不相等轉(zhuǎn)移指令
這組指令的功能是比較前面兩個操作數(shù)的大小。如果它們的值不相等則轉(zhuǎn)移。在PC指向下一條指令的起始地址后,通過把指令最后一個字節(jié)的有符號的相對偏移量加到PC上,并計算出轉(zhuǎn)向地址。操作數(shù)有寄存器尋址、直接尋址,寄存器間接尋址和立即尋址等方式。
CJNE A, direct, rel ; A≠(direct),(PC)+ 3 + rel→(PC)
CJNE A, #data, rel ; A≠data,(PC)+ 3 + rel→(PC)
CJNE Ri, #data, rel ; A≠data,(PC)+ 3 + rel→(PC)
CJNE @Rj, #data, rel ; A≠data,(PC)+ 3 + rel→(PC)
4. 減1不為0轉(zhuǎn)移指令
這組指令把源操作數(shù)減1,結(jié)果回送到源操作數(shù)中去,如果結(jié)果不為0則轉(zhuǎn)移,跳到標(biāo)號rel處執(zhí)行,等于0就執(zhí)行下一條指令。源操作數(shù)有寄存器尋址和直接尋址方式。該指令通常用于實現(xiàn)循環(huán)計數(shù)。
DJNZ Ri, rel ;(Ri)-1→(Ri),(Ri)≠0,(PC)+ 2 + rel→(PC)
DJNZ direct, rel ;(direct)-1→(direct),(direct)≠0,(PC)+ 2 + rel→(PC)
5. 子程序返回指令
編程時一般都把需要反復(fù)執(zhí)行的一些程序編寫成子程序,當(dāng)需要用它們時,就用一個調(diào)用命令使程序按調(diào)用的地址去執(zhí)行,這就需要子程序的調(diào)用指令和返回指令。
LCALL addr16 ;長調(diào)用指令,可在64kB空間調(diào)用子程序。此時(PC)+ 3→(PC),(SP)+ 1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr16→(PC),即分別從堆棧中彈出調(diào)用子程序時壓入的返回地址。
ACALL addr11 ;絕對調(diào)用指令,可在2kB空間調(diào)用子程序,此時(PC)+ 2→(PC),(SP)+ 1→(SP),(PC7-0)→(SP),(SP)+ 1→(SP),(PC15-8)→(SP),addr11→(PC10-0)。
RET ; 子程序返回指令。此時(SP)→(PC15-8),(SP)- 1→(SP),(SP)→(PC7-0),(SP)- 1→(SP)RET指令通常安排在子程序的末尾,使程序能從子程序返回到主程序。
RETI ; 中斷返回指令,除具有RET功能外,還具有恢復(fù)中斷邏輯的功能,需注意的是,RETI指令不能用RET代替 。
空操作也是CPU控制指令,它沒有使程序轉(zhuǎn)移的功能,一般用于軟件延時。指令為:NOP
編輯:admin 最后修改時間:2018-05-08