壹、無條件轉移指令 AJMP addrll (2字節指令)
2K(地址211)字節範圍內的無條件跳轉指令。
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字節指令)
64K字節範圍內的無條件跳轉指令。
指令執行時,把指令的第二和第三字節分別裝入PC的高位和低位字節中,無條件地轉向addr16指出的目標地址。
目標地址可以在64K程序存儲器地址空間的任何位置。
註意:短跳轉、長跳轉指令中addrll、addr16直接寫上要轉向的目標地址標號(即符號地址)就可以。
三、相對轉移指令 SJMP rel (雙字節)
rel為8位帶符號二進制補碼數(-128~+127),實現程序的雙向轉移。
在編寫程序時,直接寫上要轉向的目標地址標號就可以。
四、間接跳轉(散轉)指令JMP @A+DPTR (三字節)
由A中8位無符號數與DPTR的16位數內容之和來確定。以DPTR內容作為基址,A的內容作變址。
五、條件轉移指令 (雙字節)
JZ rel ; 如果累加器為“0”,則轉移
JNZ rel; 如果累加器非“0”,則轉移
六、比較不相等轉移指令(3字節指令)
CJNE A, direct, rel
CJNE A, #data, rel
CJNE Rn, #data, rel
CJNE @Ri, #data, rel
1、比較前面兩個操作數(無符號整數)的大小,如果不相等則
轉移,若相等則順序執行下壹條指令。
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 (雙字節)
2K範圍內的子程序調用。
2、長調用指令 LCALL addr16 (三字節)
64K範圍內的子程序調用。
執行本指令時:
(1)斷點地址(調用指令的下壹條指令的首地址PC+2或PC+3)
保護
(SP)+1→SP,然後PCL →(SP)
(SP)+1→SP,然後PCH →(SP)
(2)將子程序首地址送入PC,執行子程序
3、子程序返回指令 RET
斷點地址恢復
(SP) →PCH,(SP) - 1→SP
(SP) →PCL ,(SP) - 1→SP
功能:從堆棧中退出PC的高8位和低8位字節,把棧指針減2,從PC值開始繼續執行程序。不影響標誌位。
4、中斷返回指令 RETI
與RET指令相似,不同之處在於斷點地址恢復,清除中斷響應時被置“1”的51內部中斷優先級寄存器的優先級狀態。
子程序是編程時就已確定的固定位置調用,而中斷服務子程序是由中斷系統控制在特定條件下隨機調用的。
九、空操作指令 NOP,消耗1個機器周期的時間