數(shù)據(jù)傳送類指令
數(shù)據(jù)傳送是單片機(jī)最基本的操作。數(shù)據(jù)傳送的一般功能是將源操作數(shù)傳送到指令所指定的目的操作數(shù),指令執(zhí)行后,源操作數(shù)不變。
數(shù)據(jù)傳送類指令一般不影響標(biāo)志位。數(shù)據(jù)傳送類指令共29條,可以分為兩大類。一是采用MOV操作符,稱為一般傳送指令,共16條;二是采用非MOV操作符,稱為特殊傳送指令,共13條。
一般傳送指令的匯編指令格式為:
MOV是傳送指令的操作助記符。其功能是將源操作數(shù)傳送到目的操作數(shù),源操作數(shù)內(nèi)容不變。
該類指令的助記符,操作數(shù),功能,字節(jié)數(shù)及執(zhí)行時(shí)長(zhǎng)(機(jī)器周期數(shù)),按目的操組數(shù)歸類如下。
1)內(nèi)部8位數(shù)據(jù)傳送指令
內(nèi)部RAM區(qū)是數(shù)據(jù)傳送最活躍的區(qū)域,8位內(nèi)部數(shù)據(jù)傳送指令共15條,用于單片機(jī)內(nèi)部的數(shù)據(jù)存儲(chǔ)器和寄存器之間的數(shù)據(jù)傳送。
有立即尋址,直接尋址,寄存器尋址及寄存器間接尋址等尋址方式。
2)16位數(shù)據(jù)傳送指令
該指令是80C51指令集中唯一的一條16位數(shù)據(jù)傳送指令,其作用是將外部存儲(chǔ)器某單元地址送到數(shù)據(jù)指針DPTR。
這個(gè)存儲(chǔ)單元可以是外部RAM也可以是外部ROM,也可以是擴(kuò)展的片外接口地址。
如果地址傳送到DPTR后用刀MOVC,則一定是ROM地址;用到的是MOVX,則一定是RAM地址或片外接口地址。
以上一般數(shù)據(jù)傳送指令中,可以用4種目的字節(jié)為基礎(chǔ)來(lái)構(gòu)造4類指令。
使用時(shí)請(qǐng)注意:除direct外,源字節(jié)尋址與目的字節(jié)方式是不相同的;Rn寄存器尋址與寄存器間接尋址間不相互傳送;只有以累加器A作為目的操作數(shù)的指令,才可能影響奇偶標(biāo)志P。
3)特殊傳送指令
特殊傳送指令包括:ROM查表,讀/寫外部RAM,堆棧操作和交換指令,共13條。
ROM中常數(shù)讀取指令
為了取出存放在程序存儲(chǔ)器中的表格數(shù)據(jù),80C51單片機(jī)提供了兩條查表指令,這兩條指令的操作碼助記符為MOVC(move code),表示操作對(duì)象是程序存儲(chǔ)器。
指令MOVC A, @A+PC 以PC為基址寄存器,A為變址寄存器,A中的8位無(wú)符號(hào)數(shù)與PC內(nèi)容(該指令的嚇一跳指令的起始地址)相加后得到一個(gè)16位ROM地址,然后將該地址單元的內(nèi)容取出送累加器A。
指令MOVC A, @A+DPTR 以DPTR 為基址寄存器,A為變址寄存器,A中的8位無(wú)符號(hào)數(shù)與DPTR 內(nèi)容相加后得到一個(gè)16位ROM地址,然后將該地址單元的內(nèi)容取出送累加器A。
片外RAM的讀/寫指令
使用MOV類指令,內(nèi)部RAM單元內(nèi)容可以有很多種靈活的數(shù)據(jù)傳送方式,而外部RAM數(shù)據(jù)的傳送只能與A進(jìn)行,且必須使用助記符為MOVX類的指令。
注意指令以Ri為間接尋址寄存器的,對(duì)外部RAM的尋址空間為256字節(jié)。而DPTR的尋址空間是整個(gè)64KB的片外RAM。
堆棧操作指令
堆棧操作是通過(guò)指令來(lái)完成的。將數(shù)據(jù)送入堆棧的過(guò)程稱為壓棧操作,而從堆棧中取出數(shù)據(jù)的過(guò)程稱為彈出(出棧)操作。
壓棧指令的功能是先將堆棧指針SP的內(nèi)容加1,然后將指令指定的直接尋址單元內(nèi)容傳送至棧頂單元。
出棧指令的功能是將當(dāng)前堆棧指針SP所指示的單元的內(nèi)容傳送到該指令指定的單元中,然后SP中的內(nèi)容減1。
數(shù)據(jù)交換指令
數(shù)據(jù)傳送都是源操作數(shù)傳送到目的操作數(shù),而源操作數(shù)不變,數(shù)據(jù)流是單方向的;數(shù)據(jù)交換類指令則是雙方向的,源和目的操作數(shù)都會(huì)發(fā)送改變。
XCH 為字節(jié)交換,XCHD為半字節(jié)交換(僅交換低4位數(shù)據(jù)),SWAP是自交換(高4位與低4位交換)。
算術(shù)運(yùn)算類指令
算術(shù)操作指令共有24條,可分為加減乘除和BCD碼調(diào)整指令,除加1減1指令外,算術(shù)運(yùn)算指令的執(zhí)行結(jié)果都將影響CY,AC,OV標(biāo)志。
1)不帶進(jìn)位加法指令及BCD碼加法調(diào)整指令
前4條指令都是兩個(gè)數(shù)相加后將結(jié)果送給A,參與運(yùn)算的都是兩個(gè)8位二進(jìn)制數(shù)。
對(duì)于微型計(jì)算機(jī)作加法時(shí),做的是純正的二進(jìn)制數(shù)相加,但對(duì)用戶來(lái)說(shuō),這些8位的二進(jìn)制數(shù),可能是無(wú)符號(hào)數(shù),有符號(hào)數(shù)的補(bǔ)碼,還可能是BCD碼。為此,微型計(jì)算機(jī)設(shè)計(jì)了若干個(gè)結(jié)果標(biāo)志或調(diào)整指令供用戶使用。
無(wú)符號(hào)數(shù)相加:若相加結(jié)果超8位,則CY為1,表示產(chǎn)生進(jìn)位,否則CY為0。
有符號(hào)數(shù)相加:8位二進(jìn)制數(shù)表示的十進(jìn)制范圍為-128~127,當(dāng)相加結(jié)果不在這個(gè)范圍時(shí),OV為1,表示溢出。OV為1表示加法運(yùn)算的結(jié)果不可用。
BCD碼相加:若兩個(gè)BCD數(shù)相加結(jié)果大于1001,則要加0110進(jìn)行調(diào)整;若兩個(gè)BCD數(shù)相加結(jié)果在本位上并不大與1001,但產(chǎn)生了進(jìn)位,相當(dāng)于計(jì)算結(jié)果大于9,那么也要加0110進(jìn)行調(diào)整。調(diào)整指令用專用這指令DA A。
2)帶進(jìn)位加法指令
這4條指令是將累加器A中的值與源操作數(shù)以及進(jìn)位CY中的值相加,結(jié)果送A。常用于多字節(jié)數(shù)的加法運(yùn)算中。
需要注意的是這里的CY是指令開(kāi)始執(zhí)行時(shí)的進(jìn)位標(biāo)志位,不是相加后產(chǎn)生的。
3)加1指令
加法仍按無(wú)符號(hào)二進(jìn)制數(shù)進(jìn)行,只有INC A影響就標(biāo)志P,其余指令不影響標(biāo)志位。
4)帶借位減法指令
這4條指令的操作是,將A與源操作數(shù)及進(jìn)位標(biāo)志相減,結(jié)果回送到A。
無(wú)符號(hào)數(shù)相減:CY為1表示D7位有錯(cuò)位,否則CY為0。CY為1就表示A < 源操作數(shù)。
有符號(hào)數(shù)相減:若OV為1,表明補(bǔ)碼減法運(yùn)算結(jié)果超出8位二進(jìn)制數(shù)表示范圍。
若要進(jìn)行不帶進(jìn)位的減法運(yùn)算,只要將CY清0即可。
5)減1指令
只有DEC A會(huì)影響奇偶標(biāo)志P。
6)乘除指令
兩個(gè)8位無(wú)符號(hào)數(shù)相乘結(jié)果為16位無(wú)符號(hào)數(shù),乘積的低8位存放在A,高8位存放在寄存器B。
如果乘積超過(guò)0FFH,則OV為1,否則清零。CY總為0,P仍按A中1的奇偶來(lái)確定。
兩個(gè)8位無(wú)符號(hào)數(shù)相除的商存放在A,余數(shù)存放在B。如果除數(shù)B為0,則OV為1。CY總為0,P仍按A中1的奇偶來(lái)確定。
邏輯運(yùn)算類指令
邏輯運(yùn)算指令共24條,包括邏輯與,或,異或,清零,取反,移位的指令。
1)邏輯與指令
2)邏輯或指令
3)邏輯異或指令
4)累加器清零指令
5)取反指令
6)移位指令
控制轉(zhuǎn)移類指令
通常情況下,微機(jī)是順序執(zhí)行程序的,但在有些情況下需要改變程序的走向,控制轉(zhuǎn)移類指令就是可以改變程序運(yùn)行走向的指令。
80C51共16條,包括無(wú)條件轉(zhuǎn)移指令,條件轉(zhuǎn)移指令以及子程序調(diào)用和返回指令。
1)無(wú)條件轉(zhuǎn)移指令
無(wú)條件轉(zhuǎn)移指令是當(dāng)程序執(zhí)行該指令時(shí),不需要任何條件,程序自動(dòng)轉(zhuǎn)移到該指令所指的目的地址運(yùn)行新的程序段。
AJMP 為短轉(zhuǎn)移指令,在譯成機(jī)器碼時(shí),只取目的地址的低11位,高5位使用PC地址的高5位。很明顯這是一條跳轉(zhuǎn)范圍為2KB的指令。
SJMP為相對(duì)轉(zhuǎn)移指令,雙字節(jié)指令,rel為有符號(hào)的補(bǔ)碼,所以轉(zhuǎn)移的目標(biāo)地址在SJMP指令前126B到后129B之間。
LJMP為長(zhǎng)轉(zhuǎn)移指令,該指令可以使程序從當(dāng)前地址轉(zhuǎn)移到64KB程序存儲(chǔ)器地址空間的任意地址。
JMP為散轉(zhuǎn)移指令,該指令以DPTR和A的內(nèi)容進(jìn)行無(wú)符號(hào)相加后作為PC的新目標(biāo)地址,可以實(shí)現(xiàn)64KB范圍內(nèi)的轉(zhuǎn)移。該指令的特點(diǎn)是根據(jù)A的值不同實(shí)現(xiàn)多分支轉(zhuǎn)移。
2)條件轉(zhuǎn)移指令
條件轉(zhuǎn)移指令是指在滿足指定條件時(shí)就進(jìn)行轉(zhuǎn)移,否則程序繼續(xù)執(zhí)行本指令的下一條指令。條件轉(zhuǎn)移指令都是相對(duì)轉(zhuǎn)移。
JZ指令是當(dāng)A的內(nèi)容為0就轉(zhuǎn)移,而JNZ相反。
CJNE指令比較轉(zhuǎn)移指令,是對(duì)兩個(gè)操作數(shù)進(jìn)行比較,然后根據(jù)比較結(jié)果來(lái)決定是否轉(zhuǎn)移到目的地址。若不相等就轉(zhuǎn)移,相等就順序執(zhí)行。
CJNE指令影響CY標(biāo)志位,若目的操作數(shù)大于源操作數(shù),則CY為0,反之為1。
DJNZ指令為減1非零轉(zhuǎn)移指令。對(duì)操作數(shù)減1,并保存結(jié)果,判斷值是否為0,為0就往下執(zhí)行,否則跳轉(zhuǎn)。
3)調(diào)用及返回指令
ACALL和LCALL會(huì)將斷點(diǎn)地址壓棧,RET會(huì)將斷點(diǎn)地址出棧,彈回PC。
RETI是從中斷服務(wù)子程序返回的指令,在RET的功能基礎(chǔ)上,它還要清除80C51單片機(jī)內(nèi)部的中斷優(yōu)先級(jí)狀態(tài)觸發(fā)器,使得已申請(qǐng)的同級(jí)或較低級(jí)的中斷申請(qǐng)可以得到響應(yīng)。
布爾變量操作指令
布爾變量即開(kāi)關(guān)量,是以位為基本單位來(lái)進(jìn)行運(yùn)算和操作的。80C51系統(tǒng)具有對(duì)位變量的處理能力,它有自己的累加器CY,稱為位累加器,有自己的位存儲(chǔ)空間,還有自己獨(dú)立的運(yùn)算處理硬件系統(tǒng)和軟件指令系統(tǒng),共17條。
為方便書寫,指令中的C代表CY。
1)位傳送指令
2)位置位指令
3)位運(yùn)算指令
4)位控制轉(zhuǎn)移指令
位控制轉(zhuǎn)移指令都是條件轉(zhuǎn)移指令,它是以CY或者位地址bit的內(nèi)容作為是否轉(zhuǎn)移的條件。
JC/JNC是當(dāng)CY為1/0時(shí)轉(zhuǎn)移的指令,該指令適用于比較兩個(gè)操作數(shù)大小的分支轉(zhuǎn)移。
JB/JBC/JNB是以位地址bit內(nèi)容判斷是否要轉(zhuǎn)移的。JB/JBC當(dāng)(bit)為1時(shí)轉(zhuǎn)移,而JNB為當(dāng)(bit)為0時(shí)轉(zhuǎn)移。JBC還具有將該bit清零的功能。
NOP為空操作,只消耗時(shí)間。
評(píng)論
查看更多