數(shù)據(jù)傳送類指令是編程時使用最頻繁的一類指令。一般數(shù)據(jù)傳送類指令的助記符為“MOV”,通用的格式如下:
MOV,數(shù)據(jù)傳送類指令是把源操作數(shù)傳送到目的操作數(shù)。指令執(zhí)行后,源操作數(shù)不改變,目的操作數(shù)修改為源操作數(shù)。所以數(shù)據(jù)傳送類操作屬“復制”性質,而不是“搬家”。
數(shù)據(jù)傳送類指令不影響標志位,這里所說的標志位是指Cy、Ac和OV,但不包括檢驗累加器奇偶標志位P。
1.以累加器為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)的內(nèi)容送人累加器A,源操作數(shù)有寄存器尋址、直接尋址、間接尋址和立即數(shù)尋址等方式,例如指令:
2.以Rn為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)的內(nèi)容送入當前工作寄存器區(qū)的RO~R7中的某一個寄存器。
3.以直接地址direct為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)送入直接地址指定的存儲單元。direct指的是內(nèi)部RAM或SFR地址。
4.以寄存器間接地址為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)內(nèi)容送入RO或Rl指定的存儲單元中。
5. 16位數(shù)傳送指令
這條指令的功能是把16位立即數(shù)送入DPTR,用來設置數(shù)據(jù)存儲器的地址指針。AT89S51中設有兩個DPTR,通過設置特殊功能寄存器AUXR1中的DPS位來選擇。當DPS-I,則指令中的DPTR即為DPTR1,DPTRO被屏蔽,反之亦然。DPTR既是一個16位的數(shù)據(jù)指針,又可分為DPH和DPL兩個8位寄存器進行操作,十分靈活、方便。設有兩個DPTR后,可避免頻繁地出入堆棧操作。
對于所有MOV類指令,累加器A是一個特別重要的8位寄存器,CPU對它具有其他寄存器所沒有的操作指令。后面將要介紹的加、減、乘、除指令都是以A作為目的操作數(shù)的。Rn為CPU當前所選擇的寄存器組中的RO~R7,直接地址指定的存儲單元為內(nèi)部RAM的OOH~7FH和特殊功能寄存器(地址范圍為80H~FFH)。在間接地址中,用RO或Rl作為內(nèi)部RAM的地址指針,可訪問內(nèi)部RAM的OOH~7FH共128個單元。
6.堆棧操作指令
在AT89S51的內(nèi)部RAM中可以設定一個后進先出(LIFO,Last In First Out)的區(qū)域,稱為堆棧。在特殊功能寄存器中有一個堆棧指針SP,它指定堆棧的棧頂位置。堆棧操作有進棧和出棧兩種,因此,在指令系統(tǒng)中相應有兩條堆棧操作指令。
(1)進棧指令
這條指令的功能是,首先將棧指針SP加1,然后把direct中的內(nèi)容送到棧指針SP指示的內(nèi)都RAM單元中。
例如,當(SP)=60H,(A)=30H,(B)=70H時,執(zhí)行下列指令
結果為(61H)=30H,(62H)=70H,(SP)=62H。
(2)出棧指令
這條指令的功能是,將棧指針SP指示的棧頂(內(nèi)部RAM單元)內(nèi)容送入direct字節(jié)單元中,棧指針SP減1。
例如,當(SP)=62H,(62H)=70H,(61H)=30H時,執(zhí)行下列指令:
結果為(DPTR)=7030H,(SP)=60H。
7.累加器A與外部數(shù)據(jù)存儲器RAM/IO傳送指令
上述4條指令的助記符是在MOV的后面加“X”,“X”表示AT89S51單片機訪問的是片外RAM存儲器或I/O口,是讀外部RAM存儲器或I/O口中的一個字節(jié)的數(shù)據(jù)到累加器A中,或將累加器A中的一個字節(jié)的數(shù)據(jù)寫入外部RAM存儲器或I/O口中。所以在執(zhí)行前兩條指令時,RD(的反)(P3.7)有效;執(zhí)行后兩條指令時,WR(P3.6)有效。
采用16位的DPTR進行間接尋址,可尋址整個64KB片外數(shù)據(jù)存儲器空間,高8位地址(DPH)由P2口輸出,低8位地址(DPL)由PO口輸出。
采用Ri(i=0.1)進行間接尋址,可尋址片外256個單元的數(shù)據(jù)存儲器。8位地址由PO口輸出,鎖存在地址鎖存器中,然后PO口再作為8位數(shù)據(jù)口。
8.查表指令
這類指令共兩條,均為單字節(jié)指令,這是AT89S51指令系統(tǒng)中僅有的兩條讀程序存儲器中表格數(shù)據(jù)的指令。由于對程序存儲器只能讀不能寫,因此其數(shù)據(jù)的傳送都是單向的,即從程序存儲器中讀出數(shù)據(jù)到累加器中。兩條查表指令均采用基址寄存器加變址寄存器間接尋址方式。
這條指令以PC作為基址寄存器,A的內(nèi)容作為無符號整數(shù)和PC的當前值(下一條指令的起始地址)相加后得到一個新的16位地址,把該地址指定的程序存儲單元的內(nèi)容送到累加器A。
例如:當(A)=30H時,執(zhí)行地址1000H處的指令
該指令占用一個字節(jié),下一條指令的地址為1001H,(PC)=1001H再加上A中的30H,得1031H,結果是將程序存儲器中1031H的內(nèi)容送入累加器A。
這條指令的優(yōu)點是不改變特殊功能寄存器及PC的狀態(tài),根據(jù)A的內(nèi)容就可以取出表格中的常數(shù)。缺點是表格只能存放在該條查表指令所在地址的+256個單元之內(nèi),表格的大小受到限制,而且表格只能被一段程序所利用。
這條指令以DPTR作為基址寄存器,A的內(nèi)容作為無符號數(shù)和DPTR的內(nèi)容相加得到一個16位地址,把由該地址指定的程序存儲器單元的內(nèi)容送到累加器A。
例如:(DPTR)=8100H,(A)=40H,執(zhí)行指令
結果是將程序存儲器中8140H單元內(nèi)容送入累加器A中。
這條查表指令的執(zhí)行結果只與指針DPTR及累加器A的內(nèi)容有關,與該指令存放的地址及常數(shù)表格存放的地址無關,因此表格的大小和位置可以在64KB程序存儲器空間中任意安排,一個表格可以為各個程序塊公用。
上述兩條指令的助記符都是在MOV的后面加“C”,“C”是CODE的第一個字母,即表示程序存儲器中的代碼。執(zhí)行上述兩條指令時,單片機的PSEN引腳信號(程序存儲器讀)有效。
9.字節(jié)交換指令
這組指令的功能是將累加器A的內(nèi)容和源操作數(shù)的內(nèi)容相互交換。源操作數(shù)有寄存器尋址、直接尋址和寄存器間接尋址等方式。例如:
執(zhí)行下列指令:
結果為(A)=OFH,(R7)=80H,(40H)=08H,(30H)=FOH。
10.半字節(jié)交換指令
這條指令的功能是,累加器的低4位與內(nèi)部RAM低4位交換。例如:(RO)=60H,(60H)=3EH,(A)=59H,執(zhí)行完“XCHD A,@RO”指令,則(A)=5EH,(60H)=39H。
評論