單片機數(shù)據(jù)傳送類指令和控制轉(zhuǎn)移指令講解
一、傳送類指令(1)片內(nèi)數(shù)據(jù)傳送指令 (16條)
此類指令參入的源操作數(shù)和目的操作數(shù)有 #data/A/Rn/@Ri/direct 五個,其不同組合,共有 15 條指令
(2)片外數(shù)據(jù)傳送指令 (4條)
當你想把一個數(shù)送到單片機外部擴展 RAM 的某個單元或外部擴展 I/O 口某個端口,或者你想從該 單元、端口將數(shù)據(jù)取回到單片機內(nèi)部的時候,就要用到片外數(shù)據(jù)傳送指令。
MOVX A , @Ri ; A ← ((Ri)) 片外
MOVX @Ri , A ; (Ri) 片外← A
MOVX A , @DPTR ; A ← ((DPTR)) 片外
MOVX @DPTR , A ; (DPTR) 片外← A
單片機與外部數(shù)據(jù)存儲器數(shù)據(jù)傳送采用兩種尋址方式,這兩種尋址形式都是間接尋址。一種是單字節(jié)尋址 @Ri ,一種是雙字節(jié)尋址 @DPTR ,另一個操作數(shù)是 A . 共有 4 條指令。
(3)數(shù)據(jù)交換指令(5條)
、 指令: XCH A ,〈 byte 〉
功能:交換累加器與字節(jié)變量中的數(shù)據(jù)。
XCH 指令把指定字節(jié)的內(nèi)容裝入累加器 A 中,同時把累加器中原來的內(nèi)容寫入指定的字節(jié)中。源操作數(shù)有 Rn/direct/@Ri, 目的操作數(shù)是 A, 共三條指令。
例 2.5 設(shè) RO 寄存器內(nèi)容為 20H ,累加器 A 內(nèi)容為 3FH ,內(nèi)部 RAM 的 20H 單元內(nèi)容為
75H ,若執(zhí)行指令: XCH A , @RO 則結(jié)果為:( 20 ) =3FH ,( A ) =75H
、 指令: XCHD A, @Ri
功能:低半字節(jié)數(shù)據(jù)交換,執(zhí)行操作( A3-0 )←→(( Ri ) 3-0 )
說明:累加器 A 中的低 4 位與由指定的寄存器間接尋址的內(nèi)部 RAM 單元的低 4 位數(shù)據(jù)進行交換。該指令不影響各寄存器的高 4 位,也不影響標志位。
例 設(shè) RO 內(nèi)容為 20H ,累加器內(nèi)容為 36H ,內(nèi)部 RAM 的 20H 單元內(nèi)容為 75H ,若執(zhí)行指令 XCHD A , @RO
其結(jié)果為 ( 20H ) =0111011=76H
( A ) =00110101B=35H
③ 指令: SWAP A
A 的高四位和其低四位交換,
如 : 當 A 內(nèi)容為 36H 時執(zhí)行 SWAP A 后 A 為 63H
(3)堆棧指令
① 指令 PUSH direct 功能:把程序的中間數(shù)據(jù)送入堆棧,稱為進棧。
說明:首先棧指針自動加 1 ,執(zhí)行( SP )←( SP ) +1 將棧指針移向堆棧中的無數(shù) 據(jù)字節(jié),然后將直接地址( direct )單元的內(nèi)容送入 SP 所指向的棧單元中,執(zhí)行( SP )←( direct ),不影響標志位。
例 設(shè)堆棧指針為 09H ,數(shù)據(jù)指針內(nèi)容為 0123H ,試分析下列指令的執(zhí)行結(jié)果。
PUSH DPL
PUSH DPH
執(zhí)行結(jié)果為:( 0AH ) =23H ,
。 0BH ) =01H ,( SP ) =0BH
② 指令: POP direct 功能:把堆棧中的中間數(shù)據(jù)送入目的字節(jié),稱為出棧。
說明:讀出由棧指針尋址的內(nèi)部 RAM 單元內(nèi)容。送到指定的直接尋址的字節(jié)單元,然后棧指針自動減 1 ,即執(zhí)行操作:
( direct )← ((SP)),(SP) ← (SP)-1; 指令執(zhí)行不影響標志位。
例 設(shè)( SP ) =32H ,內(nèi)部 RAM 的 31H ,32H 單元中的內(nèi)容分別為 23H , 01H ,試分析下列指令的執(zhí)行結(jié)果。
POP DPH
POP DPL
執(zhí)行結(jié)果為( DPTR ) =0123H,
(SP) =30H 。
二、控制轉(zhuǎn)移指令
(1)長轉(zhuǎn)移指令
LJMP 目標語句
說明:目標語句可以是程序存儲器 64KB 空間的任何地方。
(2)絕對轉(zhuǎn)移指令
AJMP 目標語句
例: 4002H LJMP MM
……
4600H MM : MOV A , #00H
注意:目標語句必須和當前語句同頁。在 51 單片機中, 64KB 程序存儲器分成 32 頁,每頁 2KB(7FFH) 。
(3)短跳轉(zhuǎn)指令
SJMP 目標語句 (rel)
例:
4060H SJMP LOOP
……
4090H LOOP : MOV A , #0FFH
……
注意:短跳轉(zhuǎn)的目標語句地址必須在當前語句向前 127 ( 7FH )字節(jié),向后 128 ( 80H )字節(jié),否則在進行程序編譯時會出錯。
(4)減 1 條件轉(zhuǎn)移指令組
DJNZ Rn ,目標地址 (rel) ;如果 (Rn)-1 ≠ 0 ,則程序跳轉(zhuǎn)到目標語句,否則順序執(zhí)行下一條語句。
DJNZ direct, 目標地址 (rel) ;如果 (direct)-1 ≠ 0 ,則程序跳轉(zhuǎn)到目標語句,否則順序執(zhí)行下一條語句。
例 : 將 8031 內(nèi)部 RAM 的 40H~4FH 單元置初值 A0H~AFH 。程序為:
MOV RO , #40H ; RO 賦值,指向數(shù)據(jù)單元
MOV R2 , #10H ; R2 賦值,為傳送字節(jié)數(shù)
MOV A , #0A0H ; A 賦值
LOOP : MOV @ RO , A ;開始傳送
INC , RO ;修改地址指針
INC A ;修改傳送數(shù)據(jù)
DJNZ R2 , LOOP ;未傳送完,繼續(xù)循環(huán)傳送
RET ;否則,傳送結(jié)束
編輯:admin 最后修改時間:2018-05-08