一、數(shù)據(jù)傳送指令
數(shù)據(jù)傳送指令主要負(fù)責(zé)把數(shù)據(jù)、地址或立即數(shù)傳送到寄存器或存儲(chǔ)單元中。這類指令共有29條,可分為以下3大類:基本數(shù)據(jù)傳送指令,數(shù)據(jù)交換指令,棧操作指令。
執(zhí)行數(shù)據(jù)傳送指令時(shí),除以累加器a為目的操作數(shù)的指令會(huì)對(duì)奇偶標(biāo)志位p有影響外,其余指令執(zhí)行時(shí)均不會(huì)影響任何標(biāo)志位。
1.基本數(shù)據(jù)傳送指令
根據(jù)數(shù)據(jù)取自何方和傳到何方,mov指令有著許多不同的形式。
(1)以累加器a為目的操作數(shù)類指令
這組指令的作用是把源操作數(shù)指向的內(nèi)容送到累加器a。有立即數(shù)、直接、寄存器和寄存器間接尋址方式:
mova,#data ;data→(a)
mova,direct ;(direct)→(a)
mova,ri ;(ri)→(a)
mova,@rj ;((rj))→(a)
(2)以寄存器ri為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)指定的內(nèi)容送到所選定的工作寄存器ri中。有立即、直接和寄存器尋址方式:
(3)以直接地址為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)指定的內(nèi)容送到由直接地址direct所選定的片內(nèi)ram中。有立即、直接、寄存器和寄存器間接4種尋址方式:
(4)以間接地址為目的操作數(shù)的指令
這組指令的功能是把源操作數(shù)指定的內(nèi)容送到以rj中的內(nèi)容為地址的片內(nèi)ram中。有立即、直接和寄存器3種尋址方式
(5)查表指令
這組指令的功能是對(duì)存放于程序存儲(chǔ)器中的數(shù)據(jù)表格進(jìn)行查找傳送,使用變址尋址方式:
movca,@a+dptr ;((a)+(dptr))→(a)
movca,@a+pc ;((pc))+1→(pc),((a)+(pc))→(a)
(6)累加器a與片外數(shù)據(jù)存儲(chǔ)器ram傳送指令
這組指令的作用是累加器a與片外ram間的數(shù)據(jù)傳送。使用寄存器尋址方式:
movx@dptr,a ;(a)→((dptr))
movxa,@dptr ;((dptr))→(a)
movxa,@rj ;((rj))→(a)
movx@rj,a ;(a)→((rj))
(7)16位數(shù)據(jù)傳送指令
這條指令的功能是把16位常數(shù)送入數(shù)據(jù)指針寄存器。
movdptr,#data16 ;datah→(dph),datal→(dpl)
2.交換指令
mov指令主要完成從一處到另一處的拷貝,xch指令則可實(shí)現(xiàn)數(shù)據(jù)的雙向傳送。所有的操作都涉及到累加器a,可以把把累加器a中的內(nèi)容與源操作數(shù)所指的數(shù)據(jù)相互交換。
xcha,direct ;(a)←→(direct)
xcha,ri ;(a)←→(ri)
xcha,@rj ;(a)←→((rj))
xchda,@rj ;(a3-0)←→((rj)3-0)
swapa ;(a3-0)←→(a7-4)
3.入棧/出棧指令
這類指令的作用是把直接尋址單元的內(nèi)容傳送到堆棧指針sp所指的單元中,以及把sp所指單元的內(nèi)容送到直接尋址單元中。
⑴push指令
堆棧的入棧指令,該指令可以把某片內(nèi)ram單元(低128字節(jié))或某專用寄存器的內(nèi)容入棧。
pushdirect ;(sp)+1→(sp),(direct)→(sp)
⑵pop指令
堆棧的出棧指令,該指令用于恢復(fù)某片內(nèi)ram單元(低128字節(jié))或某專用寄存器的內(nèi)容。
popdirect ;(sp)→(direct),(sp)-1→(sp)
二、算術(shù)運(yùn)算指令
在51系列單片機(jī)的指令系統(tǒng)中,提供了完備的加、減、乘、除算術(shù)運(yùn)算指令及增量(加1)、減量(減1)運(yùn)算,可處理不帶符號(hào)或帶符號(hào)的8/16二進(jìn)制數(shù)。除加1和減1指令外,算術(shù)運(yùn)算指令會(huì)影響進(jìn)位、半進(jìn)位和溢出位三個(gè)標(biāo)志位。
1.不帶進(jìn)位的加法指令
這組指令的作用是把立即數(shù),直接地址、工作寄存器及間接地址內(nèi)容與累加器a的內(nèi)容相加,運(yùn)算結(jié)果存在a中。
adda,#data ;(a)+data→(a)
adda,direct ;(a)+(direct)→(a)
adda,ri ;(a)+(ri)→(a)
adda,@rj ;(a)+((rj))→(a)
本組指令的執(zhí)行將影響標(biāo)志位ac、cy、ov、p。當(dāng)和的第3、7位有進(jìn)位時(shí),分別將ac,cy標(biāo)志位置位;否則復(fù)位。對(duì)于無(wú)符號(hào)數(shù),進(jìn)位標(biāo)志位cy=1,表示溢出;cy=0表示無(wú)溢出。帶符號(hào)數(shù)運(yùn)算的溢出取決于第6、7位,若這2位中有一位產(chǎn)生進(jìn)位,而另一位不產(chǎn)生進(jìn)位,則溢出標(biāo)志位ov置位,否則被復(fù)位。
2.帶進(jìn)位加法指令
這組指令的作用是把立即數(shù),直接地址、工作寄存器及間接地址內(nèi)容與累加器a的內(nèi)容以及進(jìn)位位c相加,運(yùn)算結(jié)果存在a中。
本組指令執(zhí)行對(duì)標(biāo)志位ac、cy、ov、p的影響與add指令相同。
3.增量指令
這組指令的的功能均為原寄存器的內(nèi)容加1,結(jié)果送回原寄存器。這組指令共有直接、寄存器、寄存器間接尋址等尋址方式:
inca ;(a)+1→(a)
incdirect ;(direct)+1→(direct)
incri ;(rn)+1→(ri)
inc@rj ;((rj))+1→((rj))
incdptr ;(dptr)+1→(dptr)
增量指令不會(huì)對(duì)任何標(biāo)志有影響。
4.帶借位減法指令
這組指令包含立即數(shù)、直接地址、間接地址及工作寄存器與累加器a連同借位位c內(nèi)容相減,結(jié)果送回累加器a中。
subba,#data ;(a)-data-(c)→(a)
subba,direct ;(a)-(direct)-(c)→(a)
subba,ri ;(a)-(ri)-(c)→(a)
subba,@rj ;(a)-((rj))-(c)→(a)
本指令執(zhí)行將影響標(biāo)志位ac、cy、ov、p。若第七位有借位,則將cy置位,否則cy復(fù)位。若第3位有錯(cuò)位,則置位輔助進(jìn)位標(biāo)志ac,否則ac復(fù)位。若第7和第6位中有一位需借位,而另一位不借位,則置位溢出標(biāo)志ov。
當(dāng)在進(jìn)行單字節(jié)或多字節(jié)減法前,不知道進(jìn)位標(biāo)志位cy的值,則應(yīng)在減法指令前先將cy復(fù)位清“0”。
5.減量指令
這組指令的作用是把所指的寄存器內(nèi)容減1,結(jié)果送回原寄存器,這組指令共有直接、寄存器、寄存器間接尋址等尋址方式:
deca ;(a)-1→(a)
decdirect ;(direct)-1→(direct)
decri ;(ri)-1→(ri)
dec@rj ;((rj))-1→((rj))
運(yùn)算結(jié)果不影響任何標(biāo)志位。
6.乘法指令
這條指令的作用是把累加器a和寄存器b中的8位無(wú)符號(hào)數(shù)相乘,所得到的是16位乘積,這個(gè)結(jié)果低8位存在累加器a,而高8位存在寄存器b中。
mulab ;(a)×(b)→(b)和(a)
乘法指令需要4個(gè)機(jī)器周期。
如果乘積大于255(0ffh),即b的內(nèi)容不為0時(shí),則置位溢出標(biāo)志位ov,否則ov復(fù)位。進(jìn)位標(biāo)志位cy總是復(fù)位為0。
7.除法指令
這條指令的作用是把累加器a的8位無(wú)符號(hào)整數(shù)除以寄存器b中的8位無(wú)符號(hào)整數(shù),所得到的商存在累加器a,而余數(shù)存在寄存器b中。
divab;(a)÷(b)→(a)和(b)
除法指令需要4個(gè)機(jī)器周期。
本指令總是將cy和ov標(biāo)志位復(fù)位。當(dāng)除數(shù)(b中內(nèi)容)為00h時(shí),那么執(zhí)行結(jié)果將為不定值,則置位溢出標(biāo)志位ov。
8.十進(jìn)制調(diào)整指令
在進(jìn)行bcd碼運(yùn)算時(shí),這條指令總是跟在add或addc指令之后,其功能是將執(zhí)行加法運(yùn)算后存于累加器a中的結(jié)果進(jìn)行調(diào)整和修正。
daa
三、邏輯運(yùn)算指令
在51系列單片機(jī)的指令系統(tǒng)中提供的邏輯運(yùn)算指令主要包括anl(與),orl(或),xrl(異或)等指令。
1.邏輯與指令anl
這組指令的功能是在指出的變量之間以位為基礎(chǔ)的邏輯與操作。操作數(shù)有寄存器尋址、直接尋址、寄存器間接尋址和立即尋址等尋址方式:
anla,#data;(a)∧data→(a)
anla,direct ;(a)∧(direct)→(a)
anla,ri ;(a)∧(ri)→(a)
anla,@rj ;(a)∧((rj))→(a)
anldirect,#data ;(direct)∧data→(direct)
anldirect,a ;(direct)∧(a)→(a)
2.邏輯或指令orl
這組指令的功能是在所指出的變量之間執(zhí)行以位為基礎(chǔ)的邏輯或操作,結(jié)果存到目的變量中去。操作數(shù)有立即尋址、直接尋址、寄存器尋址和寄存器間接尋址方式:
3.邏輯異或指令xrl
這組指令的功能是在所指出的變量之間執(zhí)行以位為基礎(chǔ)的邏輯異或操作,結(jié)果存放到目的變量中去。操作數(shù)有立即尋址、直接尋址、寄存器尋址和寄存器間接尋址方式:
4.循環(huán)移位指令
這4條指令的作用是將累加器中的內(nèi)容循環(huán)左或右移一位,后兩條指令是連同進(jìn)位位cy一起移位。
rla ;累加器a中的內(nèi)容左移一位。
rra ;累加器a中的內(nèi)容右移一位。
rlca ;累加器a中的內(nèi)容連同進(jìn)位位cy左移一位。
rrca ;累加器a中的內(nèi)容連同進(jìn)位位cy右移一位。
5.求反指令
這條指令將累加器中的內(nèi)容按位取反。
cpla ;累加器中的內(nèi)容按位取反。
6.清零指令
這條指令將累加器中的內(nèi)容清0。
clra ;0→(a),累加器中的內(nèi)容清0。
四、位操作類指令
mcs-51單片機(jī)內(nèi)部有一個(gè)布爾處理機(jī),對(duì)位地址空間具有豐富的位操作指令。
1.位傳送指令
這2條指令的功能是把由源操作數(shù)指出的布爾變量送到目的操作數(shù)指定的位中去。其中一個(gè)操作數(shù)必須為進(jìn)位標(biāo)志,另一個(gè)可以是任何直接尋址位。
movc,bit ;bit→cy,某位數(shù)據(jù)送cy。
movbit,c ;cy→bit,cy數(shù)據(jù)送某位。
本組指令不影響其他寄存器和標(biāo)志位。
2.位變量修改指令
這些指令對(duì)cy及可尋址位進(jìn)行置位或復(fù)位操作
clrc ;0→cy,復(fù)位cy。
clrbit ;0→bit,復(fù)位某一位。
setbc ;1→cy,置位cy。
setbbit ;1→bit,置位某一位。
本組指令不影響其他標(biāo)志。
3.位變量邏輯指令
位運(yùn)算都是邏輯運(yùn)算,有與、或、非三種指令
anlc,bit ;(cy)∧(bit)→cy
anlc,/bit;(cy)∧()→cy
orlc,bit ;(cy)∨(bit)→cy
orlc,/bit ;(cy)∧()→cy
cplc ;()→cy
cplbit ;()→bit
4.位變量條件轉(zhuǎn)移指令
位變量條件轉(zhuǎn)移指令是以位的狀態(tài)作為實(shí)現(xiàn)程序轉(zhuǎn)移的判斷條件:
jcrel ;(cy)=1轉(zhuǎn)移,(pc)+2+rel→pc,否則程序往下執(zhí)行,(pc)+2→pc。
jncrel ;(cy)=0轉(zhuǎn)移,(pc)+2+rel→pc,否則程序往下執(zhí)行,(pc)+2→pc。
jbbit,rel ;位狀態(tài)為1轉(zhuǎn)移。
jnbbit,rel;位狀態(tài)為0轉(zhuǎn)移。
jbcbit,rel ;位狀態(tài)為1轉(zhuǎn)移,并使該位清“0”。
五、控制轉(zhuǎn)移指令
一般情況下指令是順序執(zhí)行的逐條執(zhí)行的,但實(shí)際上程序不可能全部順序執(zhí)行而經(jīng)常需要改變程序的執(zhí)行流程,常用的控制轉(zhuǎn)移指令有:
1.無(wú)條件轉(zhuǎn)移指令
這組指令執(zhí)行完后,程序就會(huì)無(wú)條件轉(zhuǎn)移到指令所指向的地址上去。長(zhǎng)轉(zhuǎn)移指令訪問(wèn)的程序存儲(chǔ)器空間為16地址64kb,絕對(duì)轉(zhuǎn)移指令訪問(wèn)的程序存儲(chǔ)器空間為11位地址2kb空間。
ljmpaddr16 ;addr16→(pc)
ajmpaddr11 ;(pc)+2→(pc),addr11→(pc10-0)
sjmprel ;(pc)+2+rel→(pc)
jmp@a+dptr;(a)+(dptr)→(pc)
2.條件轉(zhuǎn)移指令
條件轉(zhuǎn)移指令是依某種特定條件轉(zhuǎn)移的指令。條件滿足時(shí)轉(zhuǎn)移(相當(dāng)于一條相對(duì)轉(zhuǎn)移指令),條件不滿足時(shí)則順序執(zhí)行下面的指令。目的地址在下一條指令的起始地址為中心的256個(gè)字節(jié)范圍中(-128~+127)。當(dāng)條件滿足時(shí),先把pc指向指向下一條指令的第一個(gè)字節(jié)地址,再把有符號(hào)的相對(duì)偏移量加到pc上,計(jì)算出轉(zhuǎn)向地址。
jzrel ;a=0,(pc)+2+rel→(pc)
jnzrel ;a≠0,(pc)+2+rel→(pc)
3.比較不相等轉(zhuǎn)移指令
這組指令的功能是比較前面兩個(gè)操作數(shù)的大小。如果它們的值不相等則轉(zhuǎn)移。在pc指向下一條指令的起始地址后,通過(guò)把指令最后一個(gè)字節(jié)的有符號(hào)的相對(duì)偏移量加到pc上,并計(jì)算出轉(zhuǎn)向地址。操作數(shù)有寄存器尋址、直接尋址,寄存器間接尋址和立即尋址等方式。
cjnea,direct,rel ;a≠(direct),(pc)+3+rel→(pc)
cjnea,#data,rel ;a≠data,(pc)+3+rel→(pc)
cjneri,#data,rel ;a≠data,(pc)+3+rel→(pc)
cjne@rj,#data,rel ;a≠data,(pc)+3+rel→(pc)
4.減1不為0轉(zhuǎn)移指令
這組指令把源操作數(shù)減1,結(jié)果回送到源操作數(shù)中去,如果結(jié)果不為0則轉(zhuǎn)移,跳到標(biāo)號(hào)rel處執(zhí)行,等于0就執(zhí)行下一條指令。源操作數(shù)有寄存器尋址和直接尋址方式。該指令通常用于實(shí)現(xiàn)循環(huán)計(jì)數(shù)。
djnzri,rel;(ri)-1→(ri),(ri)≠0,(pc)+2+rel→(pc)
djnzdirect,rel;(direct)-1→(direct),(direct)≠0,(pc)+2+rel→(pc)
5.子程序返回指令
編程時(shí)一般都把需要反復(fù)執(zhí)行的一些程序編寫成子程序,當(dāng)需要用它們時(shí),就用一個(gè)調(diào)用命令使程序按調(diào)用的地址去執(zhí)行,這就需要子程序的調(diào)用指令和返回指令。
lcalladdr16 ;長(zhǎng)調(diào)用指令,可在64kb空間調(diào)用子程序。此時(shí)(pc)+3→(pc),(sp)+1→(sp),(pc7-0)→(sp),(sp)+1→(sp),(pc15-8)→(sp),addr16→(pc),即分別從堆棧中彈出調(diào)用子程序時(shí)壓入的返回地址。
acalladdr11 ;絕對(duì)調(diào)用指令,可在2kb空間調(diào)用子程序,此時(shí)(pc)+2→(pc),(sp)+1→(sp),(pc7-0)→(sp),(sp)+1→(sp),(pc15-8)→(sp),addr11→(pc10-0)。
ret ;子程序返回指令。此時(shí)(sp)→(pc15-8),(sp)-1→(sp),(sp)→(pc7-0),(sp)-1→(sp)ret指令通常安排在子程序的末尾,使程序能從子程序返回到主程序。
reti ;中斷返回指令,除具有ret功能外,還具有恢復(fù)中斷邏輯的功能,需注意的是,reti指令不能用ret代替。
空操作也是cpu控制指令,它沒有使程序轉(zhuǎn)移的功能,一般用于軟件延時(shí)。指令為:nop