處理指令
MCS-51共111條指令,
指令分類
1、按指令所占的位元組來分:
(1)單位元組指令(49條) 如MOV A,R2,(
機器碼11101010)
(2)雙位元組指令(46條) 如MOV A,#0BH,(
機器碼74H,
0BH)
(3)三位元組指令(16條) 如MOV 0BH, #0BH ,(
機器碼75H,
0BH,0BH)
(1) 1個
機器周期(64條) ,如MOV A,R2 MOV A,#0BH,
(2) 2個
機器周期(45條) ,如MOV 0BH, #0BH
2、
運算元:則是指令操作的對象,有可能是數據,也可能是地址
有單位元組指令、雙位元組指令、三位元組不同長度的指令,格式不同: (1)單位元組指令:
操作碼、
運算元同在一個位元組中。
如MOV A,#0BH,(機器碼74H,0BH),其中:
定址方式
訪問指令
如MOV A,Rn ;(Rn)→A,n=0~7
1、4組工作暫存區,共32個工作暫存器。
(1)用R0或R1作為間址
暫存器,
定址範圍為片外低256個位元組;
(2)用DPTR作為間址暫存器,定址範圍為片外64K。
a) MOVX A,@Ri ;i=0或1
若(Ri)=70H,把外部RAM中70H單元的內容送到A
b) MOVX A,@DPTR
若(DPTR)=2000H,把外部RAM中2000H單元的內容送到A
3、堆疊操作指令訪問堆疊區
堆疊專用操作指令PUSH(壓棧)和POP(
出棧)使用堆疊
指令PUSH(壓棧)和POP(
出棧),無前綴標誌“@”
運算元在指令中直接給出,需在運算元前面加前綴標誌“#”。
1、以DPTR或PC作基址暫存器,以
累加器A作為變址暫存器;
MOVC A,@A+DPTR
MOVC A,@A+PC
JMP @A+DPTR
後1條為散轉指令,屬於轉移類指令。
(注)
MOVC A,@A+DPTR
MOVC A,@A+PC
JMP @A+DPTR
如MOV C,40H是把位40H的值送到進位位C。
定址範圍:
1、內部RAM中的
位定址區(20H—2FH),有2種表示方法。
(1) 直接給出位地址,如MOV C,40H;
(2)
單元地址加位數,如MOV C,(28H).0,指的是28H單元中的最低位。
2、SFR中的可定址位(70H—FFH,共83位),有4種表示方法。
(1) 直接給出位地址,如MOV C,0D5H(PSW.5的位地址);
(2) 直接寫位名稱,如MOV C,F0;
(3)
單元地址加位數,如MOV C, (0D0H).5;
(4) SFR符號加位數,如MOV C, PSW.5。
在相對定址的轉移指令中,給出了地址
偏移量“rel”,即
把PC的當前值+ rel 就構成了程式轉移的目的地址。即
目的地址=轉移指令所在的地址+ 轉移指令的位元組數+ rel
偏移量rel是帶符號的8位二進制補碼數,範圍是:–128 ~ +127 ;
注意:PC的當前值是緊接在轉移指令後的下一條指令的PC值。
分類介紹
指令中符號意義:
addr11 11位目的地址
addr16 16位目的地址
(X)X中的內容。
((X))由X定址的單元中的內容。
Rn 當前
暫存器區的8個工作暫存器R0~R7(n=0~7)。
Ri 當前暫存器區中可作
間接定址暫存器的2個暫存器R0、R1
(i=0,1)。
地址。
rel相對轉移指令中的
偏移量,為8位的帶符號補碼數。
數據傳送類
格式:MOV或MOVX或MOVC <目的
運算元>,<源
運算元>
將源
運算元複製給目的運算元,源運算元不變,而不是“
搬家”。
數據傳送類指令不影響標誌位Cy、Ac和OV,影響奇偶標誌位P。
MOV A, Rn ; (Rn)→A,n=0~7
MOV A, @Ri ; ((Ri))→A,i=0,1
MOV A, direct ;(direct)→A
MOV A, #data ; #data→A
MOV Rn, A ; (A)→Rn, n=0~7
MOV Rn, direct ;(direct)→Rn, n=0~7
MOV Rn, #data ; #data→Rn, n=0~7
MOV direct, A ; (A)→direct
MOV direct, Rn ;(Rn)→direct, n=0~7
MOV direct1, direct2;
MOV direct, @Ri ;((Ri))→direct
MOV direct, #data ; #data→direct
直接地址之間可相互傳送數據。
定址範圍:
1、內部RAM的128個單元(00-7FH)
2、
特殊功能暫存器(80-FFH) ,注意SFR區單元除了以
單元地址的形式外,還可用暫存器符號的形式給出,如:
MOV A,80H 與 MOV A,P0是等價的。
MOV @Ri, A ;(A)→((Ri)),i=0,1
MOV @Ri, direct ;(direct)→((Ri))
MOV @Ri, #data ; #data→((Ri))
五、16位數傳送指令
MOV DPTR, #data16 ; #data16→DPTR
唯一的16位數據的傳送指令,
六、堆疊操作指令
內部RAM中可以設定一個後進先出(LIFO-Last In First Out)的區域稱作
堆疊,
堆疊指針SP始終指向堆疊的
棧頂位置。
先將棧
指針SP加1,然後把direct中的內容送到SP指示的內部RAM單元中
SP指示的棧頂(內部RAM單元)內容送入direct位元組單元
中,棧指針SP減1
MOVX A, @DPTR ;((DPTR))→A,讀外部RAM/IO
MOVX A, @Ri ;((Ri))→A,讀外部RAM/IO
MOVX@DPTR, A ;(A)→((DPTR)),寫外部RAM/IO
MOVX@Ri, A ;(A)→((Ri)),寫外部RAM/IO
功能:A與外部RAM
存儲器傳送數據,RD*(P3.7)或WR*(P3.6)信號有效。
1、採用DPTR
間接定址時,高8位地址(DPH)由P2口輸出,低8位地址(DPL)由P0口輸出。
2、採用Ri(i=0,1)
間接定址時,可定址片外256個單元的數據
存儲器。Ri內容(地址)由P0口輸出。
3、數據均由P0口輸出。
用於讀
程式存儲器(內外)中的表格數據的指令,僅兩條
1、MOVC A,@A+PC
(2) 兩暫存器的內容相加,得到一個16位的地址;
(3) 取出此地址中的數據,傳送給ACC。
注意:PC中的內容為下一條指令的起始地址,PSEN信號有效(作用同RD*、WR*)。
2、MOVC A,@A+DPTR
(1) 以DPTR 作為基址暫存器,A為變址暫存器;
(2) 兩暫存器的內容相加,得到一個16位的地址;
(3) 取出此地址中的數據,傳送給ACC。
如 (DPTR)=8100H (A)=40H 執行指令
MOVC A, @A+DPTR
本指令的執行結果只和
指針DPTR及
累加器A的內容有關,
與該指令存放的地址及常數表格存放的地址無關,因此表格的
為各個程式塊公用。
功能指令
一、位元組交換指令
XCH A, Rn
若(A)=80H,(R7)=08H,執行後(A)=08H,(R7)=80H
XCH A, direct
若(A)=80H,(40H)=F0H,執行後(A)=F0H ,(40H)= 80H
XCH A, @Ri
若(A)=80H , (R0)=6AH, (6AH)=0FH ,
執行後(A)=0FH,(6AH)=80H
XCHD A, @Ri
累加器的低4位與內部RAM低4位交換
SWAP A
四、算術運算指令
加、減、乘、除指令,都是針對8位二進制無符號數。執行
的結果對Cy、Ac、OV等標誌位有影響,但增1和減1指令不影
響上述標誌。
ADD A, Rn ;(A)+(Rn)→A,n=0~7
ADD A, direct ;(A)+(direct)→A
ADD A, @Ri ;(A)+((Ri))→A,i=0,1
ADD A, #data ;(A)+#data→A
注意運算結果對各個標誌位的影響:
(1)、如果位7有進位,則進位標誌Cy置“1”,否則清0;
(2)、如果位3有進位,則
輔助進位標誌Ac置“1”,否則清0;
(3)、溢出標誌位OV:
如果位6有進位,而位7沒有進位;或者位7有進位,而位6 沒有,則溢出標誌位OV置“1”,否則清0。
OV狀態,只有在帶符號數加法運算時才有意義。
當兩個帶符號數相加時,OV=1,表示加法運算超出了
累加器A所能表示的帶符號數的有效範圍。
2、帶進位加法指令
標誌位Cy參加運算,因此是三個數相加。共4條:
ADDC A, Rn ;(A)+(Rn)+C→A,n=0~7 ADDC A, direct ;(A)+(direct)+C→A
ADDC A, @Ri ;(A)+(Ri)+C→A,i=0,1
ADDC A, #data ;(A)+#data+C→A
3、增1(加1)指令(C語言的++ )
INC A
INC Rn ;n=0~7
INC direct
INC @Ri ;i=0,1
(1)、不影響PSW中的任何標誌(除了INC A 外)。
(2)、INC DPTR
該指令是16位數增1指令。指令首先對低8位指針DPL的內容執行加1的操作,當產生溢出時,就對DPH的內容進行加1操作,不影響標誌Cy的狀態。
4、DA A,十進制調整指令
用於對BCD碼加法運算結果的修正。
兩個BCD碼按二進制相加之後,必須經本指令的調整才能
得到正確的壓縮BCD碼的和數。
調整方法:十進制調整修正,即結果加6調整。具體為:
a)
累加器低4位大於9或輔助進位位Ac=1,則進行低4位加6修正;
b)
累加器高4位大於9或進位位Cy=1,則進行高4位加6修正;
c)
累加器高4位大於9, 低4位大於9, 則高4位和低4位分別加6修正;是否加6是通過執行指令 DA A 來自動實現的。
5、帶借位的減法指令(注意:減法只有帶借位的)
SUBB A, Rn ;(A)-(Rn)- Cy→A,n=0~7
SUBB A, direct ; (A)-(direct)- Cy→A
SUBB A, @Ri ;(A)-((Ri))- Cy→A, i=0,1
SUBB A, #data ;(A)-#data - Cy→A
A的內容減去源
運算元和進位標誌Cy的值,結果存在A中。
1、如果位7需借位,則Cy置1,否則清0;
2、如果位3需借位,則Ac置1 ,否則清0;
3、如果位6需借位而位7不需要借位,或者位7需借位,位6
不需借位,則溢出標誌位OV置1,否則清0。
6、減1指令(C語言的--)
DEC A ;(A)-1→A
DEC Rn ;(Rn)-1→Rn,n=0~7
DEC direct ;(direct)-1→direct
DEC @Ri ;((Ri))-1→(Ri),i=0,1
1、減1指令不影響標誌位。
2、增1/加1指令有INC DPTR,減1無DEC DPTR指令。
7、乘法指令
MUL AB ;A×B→BA
1、積的高位元組在B中,低位元組在A中;
2、如果積大於255,則置“1”溢出標誌位OV
8、除法指令
DIV AB ;A/B→A(商),餘數→B
如果B的內容為“0”(即除數為“0”),則存放結果的A、B中的內容不定,並置“1”溢出標誌位OV。
五、左環移指令RL A
累加器A的內容向左環移一位,Acc.7移入Acc.0 ,不影響標誌。
六、帶進位左環移指令RLC A
累加器A的內容和進位標誌位Cy一起向左環移一位,Acc.7移入進位位Cy,Cy移入Acc.0,不影響其它標誌。
七、右環移指令RR A
累加器A的內容向右環移一位,Acc.0移入Acc.7,不影響標誌。
八、帶進位環移指令RRC A
累加器A的內容和進位標誌Cy一起向右環移一位,Acc.0移入Cy,Cy移入Acc.7。不影響其它標誌。
九、邏輯與指令
ANL A, Rn ; (A)∧(Rn)→A,n=0~7
ANL A, direct ; (A)∧(direct)→A
ANL A, #data ; (A)∧#data→A
ANL A, @Ri ; (A)∧((Ri))→A,i=0~1
ANL direct, A ; (direct)∧(A)→direct
ANL direct, #data ; (direct)∧#data→direct
ORL A, Rn ;(A) ∨(Rn)→A ,n=0~7
ORL A, direct ;(A) ∨(direct)→A
ORL A, #data ;(A) ∨data→A
ORL A, @Ri ;(A) ∨((Ri))→A,i=0,1
ORL direct, A ;(direct) ∨(A)→direct
ORL direct, #data ;(direct) ∨#data→direct
十一、邏輯異或指令
XRL A, Rn ;(A) ⊕(Rn)→A
XRL A, direct ;(A) ⊕(direct)→A
XRL A, @Ri ;(A) ⊕((Ri))→A ,i=0,1
XRL A, #data ;(A) ⊕#data→A
XRL direct, A ;(direct) ⊕(A)→direct
XRL direct, #data ;(direct) ⊕#data →direct
與1相與取反,與0相與不變。
控制轉移類
一、
無條件轉移指令 AJMP addrll (2位元組指令)
64K
程式存儲器空間分為32個區,每區2K位元組,轉移的目標地址必須與AJMP下一條指令的地址高5位
地址碼A15-A11相同。
指令執行時,先PC加2,然後把addrll送入PC.10~PC.0,
PC.15~PC.11保持不變,程式轉移到目標地址。
注意:轉移目標首地址必須在AJMP指令下一條指令地址(PC+2)的2KB範圍內。
二、長跳轉指令 LJMP addr16 (3
位元組指令)
指令執行時,把指令的第二和第三
位元組分別裝入PC的高位和低位位元組中,無條件地轉向addr16指出的目標地址。
目標地址可以在64K程式存儲器地址空間的任何位置。
注意:短跳轉、長跳轉指令中addrll、addr16直接寫上要轉向的目標地址標號(即符號地址)就可以。
三、相對轉移指令 SJMP rel (雙位元組)
rel為8位帶符號二進制補碼數(-128~+127),實現程式的雙向轉移。
在編寫程式時,直接寫上要轉向的目標地址標號就可以。
四、間接跳轉(散轉)指令JMP @A+DPTR (三
位元組)
由A中8位無符號數與DPTR的16位數內容之和來確定。以DPTR內容作為基址,A的內容作
變址。
五、條件轉移指令 (雙位元組)
JZ rel ; 如果累加器為“0”,則轉移
六、比較不相等轉移指令(3位元組指令)
CJNE A, direct, rel
CJNE A, #data, rel
CJNE Rn, #data, rel
CJNE @Ri, #data, rel
2、如果第一
運算元小於第二運算元, 則Cy標誌位置1, 否則清0。
如常把CJNE 第一
運算元, 第二運算元, $+3
和JNC rel或JC rel 寫在一塊來判別2個數的大小。
$:本條指令在程式存儲單元的首地址;
$+3:CJNE指令的下一條指令,即JNC rel或JC rel
七、減1不為0轉移指令
DJNZ Rn, rel ;n=0~7
DJNZ direct, rel
將源
運算元內容減1,結果回送到Rn暫存器或direct中去。如果源
運算元內容不為0則轉移,為0則
順序執行下一條指令。
主要用於控制程式循環。
1、把
暫存器Rn或內部RAM的direct單元用作程式循環計數器
2、以減1後是否為“0”作為轉移條件,實現按次數控制循環
1、短調用指令 ACALL addr11 (雙位元組)
2、長調用指令 LCALL addr16 (三位元組)
執行本指令時:
(1)斷點地址(調用指令的下一條指令的首地址PC+2或PC+3)
保護
(SP)+1→SP,然後PCL →(SP)
(SP)+1→SP,然後PCH →(SP)
斷點地址恢復
(SP) →PCH,(SP) - 1→SP
(SP) →PCL ,(SP) - 1→SP
功能:從
堆疊中退出PC的高8位和低8位位元組,把棧指針減2,從PC值開始繼續執行程式。不影響標誌位。
子程式是編程時就已確定的固定位置調用,而中斷服務子程式是由
中斷系統控制在特定條件下隨機調用的。
位操作指令
MOV C,bit
MOV bit,C
如MOV C,06H ;(20H).6→Cy
06H是內部RAM 20H位元組位6的位地址。
MOV P1.0,C ;Cy→P1.0
可定址位的具體定義:從20H單元的第一位開始一直到2FH單元的最後一位分別為00H~7FH以及
特殊功能暫存器中80H~F7H。
二、位變數修改指令
CLR C ;清“0”Cy
CLR bit ;清“0”bit位
CPL C ;Cy求反
CPL bit ;bit位求反
SETB C ;置“1” Cy
SETB bit ;置“1”bit位
三、位變數邏輯與指令
ANL C,bit ;bit ∧Cy →Cy
ANL C,/bit; ;/ bit ∧Cy →Cy
ORL C,bit ;bit ∨ Cy →Cy
ORL C,/bit ;/ bit ∨ Cy →Cy
五、條件轉移類指令
JC rel ;如果進位位Cy=1,則轉移
JNC rel ;如果進位位Cy=0,則轉移
JB bit,rel ;如果
直接定址位=1,則轉移
JNB bit,rel ;如果
直接定址位=0,則轉移
JBC bit,rel ;如果
直接定址位=1,則轉移,並對bit位清0