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

編輯:admin 最后修改時間:2018-05-08


