目錄
一.一般傳送指令,即mov指令
1.16位傳送(僅1條)
2.8位傳送
(1)目的字節為A(累加器)
(2)目的字節為Rn(工作寄存器)
(3)目的字節為direct
(4)目的字節為@Ri
二.特殊傳送指令
1.讀ROM中常數表的表項指令MOVC
(1)以DPTR內容為基址
(2)以PC內容為基址
2.讀片外RAM及接口單元數據的指令MOVX
3.堆棧操作指令PUSH和POP
4.數據交換指令:XCH,XCHD和SWAP
(1)字節交換指令XCH
(2)半字節交換指令
看此篇文章前 ,建議回顧一下這篇文章(7種尋址方式):
http://t.csdnimg.cn/pzV8q
數據傳送類指令是指計算機指令集中用于在寄存器之間或者內存和寄存器之間傳輸數據的指令。這些指令通常用于將數據從一個位置移動到另一個位置,或者從內存中加載數據到寄存器,反之亦然。
數據傳送類指令通常不會直接影響標志寄存器的狀態。這意味著當執行數據傳送指令時,標志寄存器中的條件碼通常不會被修改。
標志寄存器通常包含了一些用于控制程序執行流程的條件標志,比如零標志、進位標志、符號標志等。這些標志在執行算術運算或者邏輯運算時會被設置或清除,用于后續的條件分支或者其他操作。
而數據傳送指令,比如將數據從一個寄存器復制到另一個寄存器,或者將數據從內存加載到寄存器中,這些操作并不直接涉及算術或邏輯運算,因此一般不會修改標志寄存器的狀態。
傳送類指令分為兩類:一般傳送,特殊傳送
一.一般傳送指令,即mov指令
1.16位傳送(僅1條)
將16位的立即數,送到DPTR中,并且覆蓋原來DPTR中的內容
MOV DPTR, #data16
例:執行指令MOV DPTR,#1234H后,(DPH)=?,(DPL)=?
(DPTR)=#1234H,其中(DPH)=#12H (DPL)=#34H
2.8位傳送
通用格式:MOV <目的字節>,<源字節>;其中目的字節可以是A(累加器),Rn(工作寄存器),direct(寄存器的直接地址),@Ri(工作寄存器的間接尋址)
(1)目的字節為A(累加器)
其中“;”表示這條指令的注釋,例如MOV A,Rn ; A<-(Rn)表示把Rn的內容復制一份,放到A中,覆蓋A中原來的內容。
(2)目的字節為Rn(工作寄存器)
例1:執行指令? MOV R6,#50H后,(R6)=?
將立即數50H,放到R6中,并覆蓋R6中原來的內容,所以(R6)=#50H
例2:編程實現將R3中的內容送入R4中
這句話不能翻譯為MOV R3, R4,因為這句話目的字節是Rn時,原字節不能是工作寄存器
所以應該先將寄存器R3中的內容放到寄存器A中,再將A中的內容放到R4中
MOV A,R3
MOV R4,A
(3)目的字節為direct
例:若(R1)=#50和H,(50H)=#18H,執行指令MOV 40H,@R1后,(40H)=?
MOV 40H,@R1==MOV 40H,50H,所以(40H)=#18H
(4)目的字節為@Ri
例:若(R1)=#30H,(A)=#20H,執行指令MOV @R1,A后,(30H)=?
MOV @R1,A == MOV 30H,A,所以將A中的內容放到30H,將30H中原來的內容覆蓋,所以(30H)=#20H
二.特殊傳送指令
1.讀ROM中常數表的表項指令MOVC
(1)以DPTR內容為基址
MOVC A,@A+DPTR;A<-((A)+(DPTR))
答案:B?
(2)以PC內容為基址
MOVC A ,@A+PC; A<-((A)+(PC))
1000H:MOVC A,@A+PC,表示程序存儲器ROM中地址為1000H的存儲單元存儲的是MOVC A,@A+PC?
A的內容是30H,而PC是下一條從程序存儲器中取出指令的地址,所以PC=1001H,所以
MOVC A,@A+PC==MOVC A, 1031H,將地址為1031H的內容放到A中,覆蓋A中的原來的內容
所以把程序存儲器1031H單元的內容送入累加器A中
2.讀片外RAM及接口單元數據的指令MOVX
注:用@Ri尋址時,高8位地址由P2口提供
關于讀片外RAM:
MOV DPTR,#2040H:(DPTR)=#2040H
MOVX A,@DPTR:等價于MOVX A,2040H,表示將片外RAM,地址為2040H的內容,放到片內的累加寄存器A中,并且覆蓋A中原來的內容。這就是讀片外RAM
MOV 60H,A:把A中的內容復制一份,送到地址是60H的存儲單元中,覆蓋60H原來的內容
這個程序的功能:將片外RAM,地址是2040H的存儲單元的數據,傳送到了單片機內部地址是60H的存儲單元中,并且覆蓋了其原本的內容。
關于寫片外RAM:
MOV A,40H:把40H中的內容復制一份,放到A中,并且覆蓋A原本的內容
MOV?DPTR ,#2560H:(DPTR)=#2560H
MOVX @DPTR,A:等價于MOVX 2560H,A ,表示把A的內容復制一份,放入片外RAM,地址為2560H的存儲單元,并把其原來的內容覆蓋,這就是寫片外RAW
這個程序的功能:?將40H存儲單元的數據,傳送到片外RAM,地址為2560H的存儲單元中,覆蓋其原來的內容。
例:把外部數據存儲器2040H單元中的數據傳送到外部數據存儲器2560H單元中去,試用匯編語言編寫程序
思路:將片外RAM存儲器2040H單元中的數據傳送到累加寄存器A中,再從累加寄存器中寫數據到片外RAM中
MOV DPTR ,#2040H
MOVX?A,@DPTR
MOV DPTR,#2560H
MOVX @DPTR,A
注:不能寫為 MOVX #2560H,#2040H
MOVX訪問的是片外RAM,地址是16位二進制,P0口送低第八位,P2口送高八位,答案是B
(P2)=#20H,(R0)=#00H,MOVX A,@R0:表示讀片外RAM,片外RAM地址高八位由P2提供,第八位地址由Ri提供,所以這個指令可以表示將片外RAM 2000H中的內容送到A中,所以(A)=2000H中的內容=#80H
3.堆棧操作指令PUSH和POP
堆棧用于子程序調用時保護返回地址或老用于保護子程序調用之前的某些重要數據(即保護現場),還可以用于數據交換。
堆棧是一片存儲區,遵循“后進先出”原則,棧頂由SP指示。80C51的堆棧設在片內RAM低端的128個單元。
入棧指令:單片機先將SP的內容+1,再把寄存器的內容送到SP指向的內存單元中
執行PUSH A時,先將SP的內容+1((SP)=#61H),再將A的內容送入SP所指向的內存單元(61H):(61H)=#30H
執行PUSH A時,先將SP的內容+1((SP)=#62H),再將B的內容送入SP所指向的內存單元(62H):(62H)=#70H
所以SP的內容是62H,61H單元的內容是#30H,62H單元的內容是#70H
出棧指令:先將SP指向的單元的內容賦給寄存器,將SP的內容-1,賦給SP
由上題可知:SP的內容是62H,61H單元的內容是#30H,62H單元的內容是#70H
執行POP A,首先將SP指向的存儲單元的內容送給A,所以(A)=#70H,SP的內容-1,所以(SP)=#61H
執行POP B,首先將SP指向的存儲單元的內容送給B,所以(B)=#30H,SP的內容-1,所以(SP)=#60H
所以(SP)=#60H,(A)=#70H,(B)=#30H
可以看到單片機執行完這4條語句后,A,B的內容互換了
4.數據交換指令:XCH,XCHD和SWAP
(1)字節交換指令XCH
例:若(R0) = #80H,(A)= #20H。執行指令 XCH A,R0?后,(A)=? (R0) = ?
R0與A的內容呼喚,即(A)=#80H,(R0)=#20H
例:編程實現將內部數據存儲器30H和31H單元的內容互換
思路:將30H存儲單元的內容賦給A,再將A的內容與31H存儲單元的內容呼喚,最后將A的內容賦給30H單元。
MOV A,30H
XCH A,31H
MOV 30H,A
(2)半字節交換指令
XCHD是間址操作數的低半字節與A的低半字節互換。
XCHD A,@R0==XCHD A, 30H,因為(A)=#20H,其中2表示高半字節,0表示低半字節
執行XCHD,操作數的低半字節與A的低半字節互換,即(30H)=#60H,(A)=#27H
SWAP是累加器的高半字節和低半字節互換
(A)=03H