指令系統(tǒng)的分類
一、數(shù)據(jù)傳遞類指令
數(shù)據(jù)傳送指令包括數(shù)據(jù)的傳送、交換、堆棧數(shù)據(jù)的壓入與彈出,是最基本、使用率最高的一類指令。助記符有MOV、MOVX、MOVC、XCH、XCHD、SWAP、PUSH、POP共八種。
1.MOV類指令及功能(16條)
這類指令的功能是從源操作數(shù)到目的操作數(shù)的數(shù)據(jù)傳送。
MOV A, Rn ;Rn→A,寄存器Rn的內(nèi)容送到累加器A
MOV A, direct ;(direct)→A,直接地址中的內(nèi)容送A
MOV A, @Ri ;(Ri)→A,Ri間址的內(nèi)容送A
MOV A, #data ;data→A,立即數(shù)送A
MOV Rn,, A ;A→Rn,累加器A中的內(nèi)容送寄存器Rn
MOV Rn, direct ;(direct)→Rn;直接地址中的內(nèi)容送Rn
MOV Rn, #data ;data→Rn;立即數(shù)送Rn
MOV direct, A ;A→(direct),A中的內(nèi)容送入直接地址中
MOV direct, Rn ;Rn→(direct),寄存器內(nèi)容送入直接地址中
MOV direct, direct ;(direct) →(direct),源操作數(shù)直接地址的內(nèi)容送入目的操作數(shù)的直接地址中
MOV direct, @Ri ;(Ri)→(direct),Ri間址內(nèi)容送入直接地址中
MOV direct, #data ;data→(direct),立即數(shù)送入直接地址中
MOV @Ri, A ;A→(Ri),A中內(nèi)容送到Ri間址單元中
MOV @Ri, direct ;(direct)→(Ri),直接地址中內(nèi)容送入Ri間址單元中
MOV @Ri, #data ;data→(Ri),立即數(shù)送入Ri間址單元中
MOV DPTR, #data16 ;data16→DPTR,16位常數(shù)送入數(shù)據(jù)指針DPTR中,高8位送入DPH,低8位送入DPH,低8位送入DPL中
從上述指令可以看出目的操作數(shù)有A累加器、Rn寄存器、直接地址direct及間接地址@Ri,源操作數(shù)除此之外還多一種立即數(shù)data。
例1 R0中有常數(shù)30H,而30H地址中有常數(shù)50H
執(zhí)行MOV A, R0后,A=30H,R0不變。
執(zhí)行MOV A, @R0后A=50H,而不是30H,這條指令的功能是把R0中內(nèi)容為地址的單元的書送入A,R0中是30H也就是把30H地址中內(nèi)容50H送入A。
例2 若(40H)=20H,(50H)=30H
執(zhí)行MOV 40H, 50H; (50H) →(40H)
結(jié)果:(40H)=30H,50H地址中內(nèi)容仍為30H。
例3 若A=40H,R0=30H,
執(zhí)行MOV @R0, A ;A→(R0)
結(jié)果:(30H)=40H,A與R0皆不變,即A=40H,R0=30H。
該指令功能是把A中內(nèi)容送入R0間址單元即R0中內(nèi)容為地址的單元。
例4 執(zhí)行MOV DPTR, #2040H ;2040H→DPTR
結(jié)果:DPH=20H, DPL=40H
DPTR是片外RAM地址指針,只有這一條指令是傳送16位數(shù)據(jù)。
2.MOVC類指令及功能(2條)
MOVC A, @A+PC ;PC+1→PC, (A+PC) →A
MOVC A, @A+DPTR ;(A+DPTR) →A
功能:該類屬于查表指令,利用這兩條指令很方便地查找放在程序存儲器中數(shù)據(jù)表格的內(nèi)容。
例1 程序
1000H MOV A, #10H ;10H→A
1002H MOVC A, @A+PC ;PC+1→PC,PC=1003H,(A+PC)=(10H+1003H)→A
...
1010H 02H
1011H 04H
1012H 06H
1013H 08H
程序執(zhí)行結(jié)果:A=08H
用MOVC A, @A+PC指令需注意兩點:
1)指令中的PC是執(zhí)行完本條指令后的PC值,即PC等于本條指令地址加1。
2)A是修正值,它等于查表指令和欲查數(shù)據(jù)相間隔字節(jié)數(shù)。A的范圍是0~255,一次該指令只能查找本指令后的256B范圍內(nèi)的表格,故稱為近程查表。
例2 程序
1000H MOV A, #01H ;01H→A
1002H MOV DPTR, #6000H ;6000H→DPTR
1005H MOVC A,@A+DPTR ;(A+DPTR)=(01H+6000H)=(6001H) →A
...
6001H 0AH
6002H 0BH
6003H 0CH
6004H 0DH
程序執(zhí)行結(jié)果:A=0AH,查到了地址為6001H單元中的數(shù)據(jù)。
用MOVC A, @A+DPTR指令查表特點:A, DPTR都可以改變,因此可在64KB范圍內(nèi)查表,故稱為遠(yuǎn)程查表。這條指令更方便。
3.MOVX類指令(4條)
MOVX A, @DPTR ;(DPTR) →A,DPTR間址單元內(nèi)容送A
MOVX @DPTR, A ;A→(DPTR), A 中內(nèi)容送入DPTR間址單元
MOVX A, @Ri ;(Ri) →A,Ri間址單元內(nèi)容送A
MOVX @Ri, A ;A→(Ri), A中內(nèi)容送Ri間址單元
MOVX類指令功能:這四條指令專門用來與外部數(shù)據(jù)存儲區(qū)傳送數(shù)據(jù)。CPU與外部RAM傳送數(shù)據(jù)時只能用間接尋址方式。
例1 把外部數(shù)據(jù)存儲單元2000H中的數(shù)據(jù)送到4000H單元中,設(shè)2000H中有數(shù)據(jù)30H。
程序 各條指令執(zhí)行結(jié)果
MOV DPTR, #2000H ;2000H DPTR, DPTR=2000H
MOVX A, @DPTR ;(DPTR) A即(2000) A,A=30H
MOV DPTR, #4000H ;4000H→DPTR, DPTR=4000H
MOVX @DPTR, A ;A→(DPTR)即A→(4000H), (4000H)=30H
例2 把內(nèi)部RAM50H單元數(shù)據(jù)送到片外20H單元,設(shè)50H中單元存有數(shù)據(jù)10H。
程序 各條指令執(zhí)行結(jié)果
MOV A,50H ;(50H) 各條指令執(zhí)行結(jié)果A, A=10H
MOV R0,#20H ;20H→R0, R0=20H
MOVX @R0, A ;A→(R0)即A→(20H)則20H=10H
注意:與外部RAM傳送數(shù)據(jù)時,地址小于256B用Ri間址,大于256B時用DPTR間址。
4.交換指令
XCH A, Rn ;Rn A, Rn與A內(nèi)容交換
XCH A,direct ;(direct) A, 直接地址內(nèi)容與A內(nèi)容交換
XCH A, @Ri ;(Ri) A,Ri間址內(nèi)容與A內(nèi)容交換
XCHD A, @Ri ;(Ri.3~Ri.0) A.3~A.0, Ri間址內(nèi)容低4
位與A中低4 位內(nèi)容交換
SWAP A ;A.3~A.0 A.7~A.4, A中高4位與低4位
交換
例 若R0=30H, A=F0H, (30H)=46H
執(zhí)行 XCH A, R0 ;結(jié)果:A=30H,R0=F0H, R0與A 內(nèi)容交換
執(zhí)行 XCH A, @R0 ;結(jié)果:A=46H, (30H)=F0H, R0中不變,
;實際上是(R0) A即(30H) A
若執(zhí)行 XCHD A, @R0 ;結(jié)果:A=F6H,(30)H=40H
;A與(30H)中低4位交換,高4位不變
執(zhí)行 SWAP A ;結(jié)果:A=0FH, 高低4位互換
5.堆棧操作指令(2條)
PUSH、POP屬堆棧操作指令,其功能是把直接地址中的內(nèi)容壓入堆棧保存,或從堆棧中取出(彈出)數(shù)據(jù)到直接地址中。
PUSH direct ;SP+1→SP, (direct) →(SP)
;直接地址內(nèi)容壓入堆棧頂
POP direct ;(SP)→(direct), SP-1→SP
;堆棧棧頂內(nèi)容彈出到直接地址
注意:堆棧是用戶自己設(shè)定的內(nèi)部RAM中的一塊專用存儲區(qū),使用堆棧時一定先設(shè)堆棧指針。堆棧遵循后進(jìn)先出的原則安排數(shù)據(jù)。壓入數(shù)據(jù)時SP先加1,再壓入;彈出時,先彈出數(shù)據(jù),SP再減1。
例 設(shè)堆棧指針為30H,為保護(hù)現(xiàn)場把A和B中的內(nèi)容壓入堆棧保護(hù),然后根據(jù)需要再把兩者彈出。設(shè)A中為30H,B中為01H。
程序 執(zhí)行結(jié)果
MOV SP, #30H ;30H→SP, SP=30H設(shè)堆棧指針為30H
PUSH ACC ;SP+1→SP=31H, A→(SP)即A→(31H),(31H)=30H
PUSH B ;SP+1→SP=32H, B→(SP)即B→(32H),(32H)=01H
POP B ;SP→B即(32H)→B, B=01H, SP-1→SP=31H
POP ACC ;SP→A即(31H)→A, A=30H, SP-1→SP=30H
從此例可以看出壓入、彈出過程SP的變化規(guī)律
下頁我們將總結(jié)——算術(shù)運(yùn)算指令