版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第三章單片機(jī)指令系統(tǒng)3.1指令系統(tǒng)簡介3.2尋址方式
3.3數(shù)據(jù)傳送指令3.5邏輯運(yùn)算類指令3.6控制轉(zhuǎn)移指令
3.4算術(shù)運(yùn)算類指令3.7位操作指令3.1指令系統(tǒng)的簡介MCS-51共有111條指令,指令的長度和執(zhí)行時(shí)間因不同的指令而各不相同。3.1.1指令格式3.1.2指令的三種表示形式3.1.3指令的字節(jié)數(shù)3.1.4指令的分類繼續(xù)3.1.1指令格式指令格式:既指令的結(jié)構(gòu)形式。OPDATA或ADDRESS操作碼操作數(shù)或操作數(shù)地址舉例:MOVA,#0FFHADDA,R0(1)二進(jìn)制的表示形式:(以“累加器的內(nèi)容+08H”為例)00100100B操作碼OP(加法)00001000B操作數(shù)DATA(08H)3.1.2指令的三種表示形式(2)十六進(jìn)制表示方式:它是對(duì)二進(jìn)制形式的一種簡化。00100100B24H00001000B08H(3)指令的“助記符”方式(“匯編格式”):
00100100B24H00001000B08HADDA,#08H
1)是一種由英文單詞或字母、數(shù)字來表征指令功能形式。2)“匯編”格式的指令必須把它“翻譯”為二進(jìn)制形式“機(jī)器碼”后才能為CPU所識(shí)別。3)三種不同的表示方法適用于不同的場合。
二進(jìn)制表示形式十六進(jìn)制表示匯編格式3.1.3指令的字節(jié)數(shù)#7
分為單字節(jié)、雙字節(jié)和三字節(jié)。一、單字節(jié)指令(49條):
無操作數(shù):如INCDPTR;10100011B INCA;00000100B【特點(diǎn)】:操作數(shù)隱含在操作碼中。
含有操作數(shù)寄存器名稱的單字節(jié)指令:
如:MOVA,R011101000B
MOVA,R1
11101001B
【特點(diǎn)】:寄存器名以三位數(shù)代碼的形式在指令的后三位。二、雙字節(jié)指令(46條):
指令的操作碼和操作數(shù)各占一個(gè)字節(jié)。如:
MOVA,#data;01110100Bdata程序存儲(chǔ)器01110100datan+1MOVA,#data雙字節(jié)指令在程序存儲(chǔ)器的存放示意圖
三、三字節(jié)指令(16條)
(1)指令中的操作數(shù)為雙字節(jié)。如:MOVDPTR,#data16;(2)指令中分別包含1個(gè)字節(jié)的操作數(shù)和1個(gè)字節(jié)的操作數(shù)地址。如:
MOVdirect,#data
舉例:MOV20H,#0FFH
10010000data15-8data8-0
MOVdirect,#dataOP(75H)direct(20H)data(FFH)MOVDPTR,#data16三字節(jié)指令在存儲(chǔ)器中存放的方式示意圖指令的字節(jié)數(shù)與指令的運(yùn)行時(shí)間指令的字節(jié)多是否意味著指令周期就長?指令字節(jié)數(shù)周期數(shù)指令說明MOVA,R011R0內(nèi)容送累加器AMOVA,#0FFH21立即數(shù)FFH送AMOV20H,#30H32立即數(shù)30H送內(nèi)存20h單元MULAB14乘法指令I(lǐng)NCDPTR1116位寄存器DPTR加一從表中可見,指令的字節(jié)數(shù)與指令周期不是對(duì)等的關(guān)系3.1.4指令的分類(41頁)
(1)數(shù)據(jù)傳送類指令:完成數(shù)據(jù)在單片機(jī)內(nèi)部之間的傳送。分為8位數(shù)和16位兩種。
(2)算術(shù)運(yùn)算指令:用于操作數(shù)之間的加、減、乘除運(yùn)算?!咎攸c(diǎn)】:多數(shù)情況下:操作數(shù)之一在累加器A中,結(jié)果也保留在A中,運(yùn)算結(jié)果要影響PSW(進(jìn)位標(biāo)志、奇偶和溢出標(biāo)志等)。
(3)邏輯操作和循環(huán)移位指令:操作數(shù)之間的邏輯加、邏輯與、取反和異或等操作。多數(shù)情況下一個(gè)操作數(shù)在A中,結(jié)果也存于A。(4)控制轉(zhuǎn)移類指令:條件轉(zhuǎn)移、無條件轉(zhuǎn)移,調(diào)用和返回。
【特點(diǎn)】:通過修改程序指針PC的內(nèi)容,使CPU轉(zhuǎn)到另一處執(zhí)行,從而改變程序的流向。(5)位操作指令:
位傳送、位置位、位運(yùn)算和位控制轉(zhuǎn)移等操作。
【特點(diǎn)】:按位操作而不是按字節(jié)的操作。位控轉(zhuǎn)移的判斷不是檢測某一個(gè)字節(jié)而是對(duì)某一個(gè)位進(jìn)行檢測并決定是否進(jìn)行程序轉(zhuǎn)移。
3.2尋址方式在指令的操作數(shù)位置上,用于表征、尋找操作數(shù)的方式定義為“尋址方式”。在MCS-51單片機(jī)中,共使用了七種尋址方式。分別是:(1)立即數(shù)尋址(5)變址尋址;(2)直接尋址(6)相對(duì)尋址;(3)寄存器尋址(7)位尋址。(4)寄存器間接尋址繼續(xù)3.2.1立即尋址指令本身直接含有所需要的8位或16位的操作數(shù)。將此數(shù)稱為“立即數(shù)”(使用#標(biāo)明)。如:
MOVA,#5FH;將(8位)立即數(shù)送累加器A
MOVDPTR,#2000H;16位立即數(shù)送DPTR寄存器5FH74Hnn+1ROM累加器A00H20H90HROMDPTR3.2.2直接尋址指令直接給出了操作數(shù)的地址。如:
MOVA,3AH;將RAM3AH單元內(nèi)容送累加器直接尋址的指令長度是兩個(gè)或三個(gè)字節(jié)。3AHOP程序ROMnn+1操作數(shù)x數(shù)據(jù)RAM3AH累加器A直接尋址示意圖3.2.3寄存器尋址當(dāng)所需要的操作數(shù)在內(nèi)部某一個(gè)寄存器Rn中時(shí),將此寄存器名Rn直接寫在指令的操作數(shù)的位置上。如:MOVA,R0 MOV20H,R0INCR1ADDA,R3
注意:寄存器尋址方式的指令大多是單字節(jié)指令。指令本身并不帶有操數(shù),而是含有存放操作數(shù)的寄存器的3位代碼。以MOVA,Rn為例,使用R7寄存器,所以rrr=111,既指令的機(jī)器碼為:0EFH11101rrr返回3.2.4寄存器間接尋址指令中含有保存操作數(shù)地址的寄存器Ri。MOVA,@Ri如:MOVR0,#3AH;立即數(shù)送R0寄存器MOVA,@R0;從RAM的H單元取數(shù)送累加器A11100000ROM3AHxRAM3AHR000H累加器A1233.2.5變址尋址指令使用DPTR或PC中的內(nèi)容作為基地址,再與累加器A的內(nèi)容相加,和作為操作數(shù)地址。如:
MOVXA,@A+PC;PC內(nèi)容與A的內(nèi)容相加得操作數(shù)地址并將此操作數(shù)送A
MOVXA,@A+DPTR;DPTR內(nèi)容與A的內(nèi)容相加得操作數(shù)地址并將此操作數(shù)送A變址指令適用于對(duì)ROM存儲(chǔ)器得訪問,查表。【舉例】:已知ROM中0302H單元有一個(gè)數(shù)x,現(xiàn)要把它送到累加器A中,試編程。MOVDPTR,#0300H;立即數(shù)送DPTRMOVA,#02H;立即數(shù)送累加器A
MOVCA,@A+DPTR;從ROM的0302單元取數(shù)送A變址尋址示意圖02H0300HROM
XALU0302H累加器ADPTR0300H+02H0302HMOVCA,@A+DPTR3.2.6相對(duì)尋址相對(duì)轉(zhuǎn)移指令在執(zhí)行中是將PC值與指令中的8位偏移量進(jìn)行相加,形成指令要轉(zhuǎn)移的目標(biāo)地址。
SJMPrel由指令中有一個(gè)8位偏移量rel為帶符號(hào)位的補(bǔ)碼,所以控制程序轉(zhuǎn)移的范圍為+127~-128。例如:SJMP54H;(80H、54H)54H2002HALU累加器APC2002H+54H2056H
54H80H程序存儲(chǔ)器ROM2056H操作碼偏移量2000H2002H(LOOP1)PC2000H3.2.7位尋址在位尋址指令(位操作指令)中使用的位地址。單片機(jī)在控制、檢測的應(yīng)用中,系統(tǒng)的輸入、輸出數(shù)據(jù)有很多屬于開關(guān)量信號(hào)。這些開關(guān)量信號(hào)以bit---“位”的形式進(jìn)行各種運(yùn)算、處理和存儲(chǔ)的。MCS-51單片機(jī)控制、檢測系統(tǒng)驅(qū)動(dòng)器電動(dòng)機(jī)外設(shè)1外設(shè)2狀態(tài)信號(hào)狀態(tài)信號(hào)控制信號(hào)
【舉例】:SETB20H;將位地址為20H的位置1SETB90H;將P1口的d0位置1第二例中,完全可以使用下面的指令格式:
SETBP1.0;將P1口的d0位置1類似還有:
MOVC,ACC.7;將累加器中的d7位送PSW的cy
3.3數(shù)據(jù)傳送指令3.3.0傳送指令的特點(diǎn)3.3.1內(nèi)部數(shù)據(jù)傳送類指令3.3.2外部數(shù)據(jù)傳送類指令3.3.3堆棧操作指令3.3.4數(shù)據(jù)交換指令功能是將數(shù)據(jù)在累加器、片內(nèi)的RAM、SFR及片外ROM、RAM之間進(jìn)行傳送。必須指定被傳送數(shù)據(jù)的源地址和目標(biāo)地址。在傳送過程中,源地址的內(nèi)容不被改變。傳送類指令除了以累加器A為目標(biāo)的傳送對(duì)PSW的P有影響外,其余的傳送類指令對(duì)PWS一概無影響。操作碼數(shù)據(jù)的目標(biāo)地址數(shù)據(jù)的源地址【舉例】:MOVA,R0;將R0寄存器中的數(shù)據(jù)送累加器A中(注意尋址方式)指令通式:MOV<dest>,<src>3.3.0傳送指令的特點(diǎn)3.3.1內(nèi)部數(shù)據(jù)傳送類指令(1)以累加器為目的操作數(shù)的指令(2)以寄存器Rn為目的操作數(shù)的指令(4)以寄存器間接地址為目的字節(jié)傳送指令(3)以直接地址為目的操作數(shù)的指令(5)16位數(shù)據(jù)傳送指令(1)以累加器為目的操作數(shù)的指令(4條)
MOVA,Rn;Rn→A MOVA,direct;(direct)→A MOVA,@Ri ;(Ri)→A
MOVA,#data;data→A
(2)以寄存器Rn為目的操作數(shù)的指令(3條)MOVRn,AMOVRn,directMOVRn,#data
(3)以寄存器間接地址為目的字節(jié)傳送指令(3條)
MOV@Ri,A;A→(Ri)
MOV@Ri,direct;(direct)→(Ri)
MOV@Ri,#data ;data→(Ri)
例:MOV@R0,A MOV@R1,20H MOV@R0,#34H(4)以直接地址為目的操作數(shù)的指令(5條)
MOVdirect,A
MOVdirect,Rn MOVdirect1,direct2 MOVdirect,@Ri MOVdirect,#data
這組指令功能是把源操作數(shù)指定的內(nèi)容送入由直接地址指出的片內(nèi)存儲(chǔ)單元。例:MOV20H,A MOV20H,R1 MOV20H,30H MOV20H,@R1 MOVA0H,#34H MOVP2,#34H(5)16位數(shù)據(jù)傳送指令(1條)MCS-51指令系統(tǒng)唯一的16位數(shù)據(jù)傳送指令。
MOVDPTR,#data16DPTR是單片機(jī)內(nèi)部SFR中的兩個(gè)寄存器DPH、DPL組合而成。其中DPH為高八位,DPL為低八位。DPTR是一個(gè)專門用于訪問外部存儲(chǔ)器的間址寄存器。尋址能力為64K(0~65535)。(6)內(nèi)部數(shù)據(jù)傳送類指令的使用①在使用傳送指令時(shí),可以根據(jù)實(shí)際情況選用恰當(dāng)尋址方式。但不能根據(jù)主觀意愿去“創(chuàng)造”指令。例如:要將R0中數(shù)據(jù)傳送到R1中。如何使用指令去完成上面操作?
MOVR1,R0是否可以?只能使用:
1,MOVA,R0或:2,MOV01H,00H
MOVR1,AMCS-51內(nèi)部數(shù)據(jù)傳送類指令方式圖累加器Adirect直接尋址@Ri間址Rn寄存器Data立即數(shù)返回上一次②以累加器A為目的寄存器的傳送指令會(huì)影響PSW中的奇偶位P,而其余的指令對(duì)PSW均無影響。③要會(huì)正確地估計(jì)指令的字節(jié)。
【舉例】:
MOVA,@RI()個(gè)字節(jié)MOVA,DIRECT()個(gè)字節(jié)MOVDIRECT,DATA()個(gè)字節(jié)MOVDIRECT2,DIRECT1()個(gè)字節(jié)④在學(xué)習(xí)指令系統(tǒng)和編程時(shí)開始就要養(yǎng)成一個(gè)好的、合理的編程習(xí)慣。⑤注意給程序進(jìn)行正確的注釋,這對(duì)于閱讀、編寫和修改程序都是非常重要的。下面就是一些注釋的例子:MOVA,30H;(30h)→AMOVA,R0;R0→AMOV40H,30H;(30h)→40hMOVA,@Ri;(Ri)→A(7)內(nèi)部傳送類指令舉例試編出把30h和40h單元內(nèi)容進(jìn)行交換。
MOVA,30H
;(30h)→A
MOV30H,40H
;(40h)→30h
MOV40H,A
;A→40h累加器AXRAM30H40HY1233.3.2外部RAM數(shù)據(jù)傳送類指令MOVXA,@RiMOVX@Ri,AMOVXA,@DPTRMOVX@DPTR,A外部RAM的字節(jié)傳送指令舉例已知外部RAM的2040H單元有一個(gè)數(shù)x,試編程將x送外部RAM的2560H單元?!窘狻浚和獠縍AM中的數(shù)據(jù)是不能直接傳送的,因此必須使用兩次MOVX指令完成此操作。 ORG2000H MOVDPTR,#2040H;為16位指針賦值MOVXA,@DPTR;取x到累加器A MOVDPTR,#2560H;為16位指針賦值 MOVX@DPTR,A
;x送RAM2560h單元 SJMP$;停機(jī) END3.3.3數(shù)據(jù)交換指令格式:XCHA,Rn;A?RnXCHA,direct;A?(direct) XCHA,@Ri;A?(Ri)
XCHDA,@Ri;A3~0?((Ri))3~0
SWAPA數(shù)據(jù)交換指令舉例(一)舉例:已知片外RAM20H單元、內(nèi)部RAM20H單元分別有數(shù)X和Y,試編程互將兩數(shù)相交換。MOVR1,#20H;指針賦初值MOVXA,@R1;X→AXCHA,20H;交換A?(20H),Y→AMOVX@R1,A;Y→(20H)片外RAM片內(nèi)RAMy
(x)片外RAMx
(y)(y)
x20h20h累加器A123數(shù)據(jù)交換指令舉例(二)已知:RAM的50H單元有一個(gè)0~9的數(shù),試編程將它變成相應(yīng)的ASCII碼。
【解】:0~9的ASCII碼是30H~39H,兩者相差30H。 MOVR0,#50H;指針賦值 MOVA,#30H;30H→A XCHDA,@R0;A3~0?(R0)3~0, MOV@R0,A;A中的ASCII送回50H單元0000010150H00110000(A)=30H0011010100110101思考:另一種方法實(shí)現(xiàn)本題,試編程實(shí)現(xiàn)?123.3.4查表指令(2條)
MOVCA,@A+DPTR;A←(A+DPTR)MOVCA,@A+PC;PC←PC+1,
A←(A+PC)該指令也稱為“查表”指令。在ROM中建立一個(gè)數(shù)據(jù)表,可以使用DPTR、PC作為數(shù)據(jù)表格的基地址。
舉例
已知累加器A中存有0~9范圍內(nèi)的數(shù),試用查表指令編寫出查找出該數(shù)平方的程序。(1)采用DPTR作基址寄存器:MOV A,40HMOV DPTR,#LABMOVC A,@A+DPTR……LAB:DB0,1,8,27,64……若(40H)為2,查表得8并存于A中
(2)采用PC作基址寄存器:ROM01491625364964812000H2009h2008h2007h2006h2005h2004h2003h2002h2001H
ORG1FFBH1FFBH74DATA
ADDA,#DATA
;(DATA=02H)?1FFDH83H
MOVCA,@A+PC;(PC=1FFEH)?1FFEH80FEH
SJMP$2000H00H
DB0;平方表首址2001H01H
DB12002H04H
DB42003H09H
DB92004H10H
DB162005H19H
DB25
:::2009H51H
DB81
ENDDATA為MOVC指令首地址與表頭地址之間的單元數(shù)。思考:如果在查表指令的后面增加:NOPNOP此時(shí),DATA的值如何?3.3.5堆棧操作指令堆棧:一個(gè)用來保存程序斷點(diǎn)、數(shù)據(jù)的特殊的存儲(chǔ)區(qū)域。在MCS-51單片機(jī)中,棧區(qū)是占用片內(nèi)RAM的存儲(chǔ)空間,具體棧位置由指針SP來確定。
1.進(jìn)棧操作:PUSHdirect
;(SP)+1→SP,(direct)→SP2.出棧操作:POPdirect
;(SP)→direct,(SP)-1→SP【注意】:①尋址方式為直接尋址或者寄存器尋址,但PUSHA是錯(cuò)誤的,應(yīng)當(dāng)是PUSHACC或PUSH0E0H,同理:PUSHR0也錯(cuò)誤。②進(jìn)棧是堆棧向上“生長”的過程,即SP+1;出棧則相反。③系統(tǒng)上電時(shí),(SP)
=07H。SP的值可以根據(jù)需要進(jìn)行修改,以適應(yīng)具體編程的需要。在確定棧區(qū)位置時(shí)要考慮對(duì)數(shù)據(jù)區(qū)的影響,以避免數(shù)據(jù)區(qū)與棧區(qū)沖突。堆棧操作指令舉例例2:設(shè)片內(nèi)RAM的30H單元存有x,40H單元存有y。試將兩個(gè)單元內(nèi)容互換。
PUSH30H PUSH40H
POP30H POP40H棧底xy
yxxyRAMSP=07h40H30H繼續(xù)3.4算術(shù)運(yùn)算#10
功能:完成算術(shù)運(yùn)算三大功能。特點(diǎn):大多指令都要由累加器A來存放一個(gè)源操作數(shù),并把操作結(jié)果放回累加器A中。3.4.1:算術(shù)運(yùn)算指令1,加法指令:帶進(jìn)位的加法指令(ADC)不帶進(jìn)位的加法指令(ADD)
加1指令(INC)十進(jìn)制調(diào)整指令(DAA)2,減法指令:帶進(jìn)位的減法指令(SUBB)減1指令(DEC)3,乘法指令:(MUL)4,除法指令:(MUL)1.加法指令(1)不帶進(jìn)位的加法指令格式: ADDA,Rn ;A+Rn→A ADDA,direct;A+(direct)→A ADDA,@Ri;A+(Ri)→A ADDA,#data;A+data→A【注意】:結(jié)果影響PSW。根據(jù)編程者的需要,8位數(shù)據(jù)可以是無符號(hào)數(shù)(0~255),也可以是有符號(hào)數(shù)(-128~+127)。不論編程者使用的數(shù)據(jù)是有符號(hào)數(shù)還是無符號(hào)數(shù),CPU都將它們視為有符號(hào)數(shù)(補(bǔ)碼)進(jìn)行運(yùn)算并影響PSW。不帶進(jìn)位的加法指令舉例試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOVA,#19H ADDA,#66H
25A=00011001+102data=01100110B127001111111B
Cy=0;AC=0;OV=CP?CS=0;P=1(2)帶進(jìn)位的加法指令格式:ADDCA,Rn ;A+Rn+Cy→A ADDCA,direct ;A+(direct)+Cy→A ADDCA,@Ri ;A+(Ri)+Cy→A ADDCA,#data ;A+data+Cy→A
【注意】:這里的Cy是指令執(zhí)行前的Cy;對(duì)PSW的影響同ADD指令。(3)加1指令(增量指令)格式: INCA;累加器A加一 INCRn;Rn+1→Rn INCdirect;內(nèi)存單元數(shù)據(jù)加一 INC@Ri;內(nèi)存單元數(shù)據(jù)加一 INCDPTR;dptr+1→dptr【注意】:
(1),除了第一條對(duì)PSW的P有影響外,其余對(duì)PSW均無影響。
(2),INC主要用于修改數(shù)據(jù)指針控制、循環(huán)語句中使用。編程舉例已知M1、M2單元中存有兩個(gè)16位無符號(hào)數(shù)X1、X2(低位在前)。試寫出X1+X2,并將結(jié)果放入M1、M1+1單元(低8位在M1單元)。設(shè)兩數(shù)之和不會(huì)超過16位(65535)。【 解】:MOVR0,#M1;x1指針賦初值MOVR1,#M2;x2指針賦初值
MOVA,@R0
;取x1低8位送A
ADDA,@R1
;x1與x2低8位相加MOV@R0,a;低8位和送m1單元INCR0 INCR1 ;修改指針MOVA,@R0;取x1的高8位送A
ADDCA,@R1
;x1與x2的高8位和Cy相加MOV@R0,A;結(jié)果送M1+1單元X1data0~7X1data8~15X2data0~7X2data8~15RAMM1M1+1M2M2+1(4)十進(jìn)制調(diào)整指令在CPU進(jìn)行BCD碼運(yùn)算時(shí),必須在運(yùn)算后進(jìn)行十進(jìn)制調(diào)整,(CPU在加法運(yùn)算時(shí)是按二進(jìn)制加法)。舉例:試寫出完成85+59的BCD碼的加法程序。
MOVA,#85H ADDA,#59H
85A=10000101B+59dtat=01011001B
正確的結(jié)果所得結(jié)果是(DEH)請(qǐng)比較兩個(gè)結(jié)果?為什么?
格式:DAA
;若AC=1或A3~0>9,則A+06h→A;若Cy=1或A7~4>9,則A+60h→A
【注意】:1,DAA指令必須緊跟在加法指令之后;2,DAA指令只適用于加法指令的調(diào)整。十進(jìn)制調(diào)整指令應(yīng)用舉例
舉例:試寫出完成85+59的BCD碼的加法程序。
MOVA,#85H ADDA,#59H
DAA
85A=10000101B+59data=01011001B1441101111
0B低4位〉9,所以加06h
+00000110B
11100100B高4位〉9,所以加60h
01100000B
101000100B結(jié)果為144h3.4.2減法指令(帶進(jìn)位的減法指令)格式:SUBBA,Rn ;A–Rn–Cy→A SUBBA,direct;A–(direct)–Cy→A SUBBA,@Ri ;A–(Ri)–Cy→A SUBBA,#data;A–data–Cy→A使用減法指令要注意的幾個(gè)問題在單片機(jī)內(nèi)部,減法指令實(shí)際上是采用補(bǔ)碼的加法實(shí)現(xiàn)的。無論相減兩數(shù)是無符號(hào)數(shù)還是有符號(hào)數(shù),減法操作總是按有符號(hào)數(shù)來處理、影響PSW中相關(guān)的標(biāo)志。在MCS-51的指令系統(tǒng)中沒有不帶Cy的減法,所以在使用SUBB指令前必須使用一條清除Cy的指令:CLRC。減一指令格式: DECA;累加器A減1 DECRn;Rn-1→Rn DECdirect;內(nèi)存單元數(shù)據(jù)減1 DEC@Ri;內(nèi)存單元數(shù)據(jù)減1【注意】:
除了第一條對(duì)PSW的P有影響外,其余對(duì)PSW均無影響。
主要用于修改數(shù)據(jù)指針在控制、循環(huán)語句中使用)。3.4.3乘法指令格式: MUL
AB;
低八位放A,高八位存于B中
【注意】:
若乘積大于(0FFH)則OV=1,否則,OV=0;
該指令執(zhí)行完后,CY=0;3.4.4除法指令格式: DIV
AB;
商存于A,余數(shù)存于B中
【注意】:
若除數(shù)B=0,則OV=1,否則,OV=0;
該指令執(zhí)行完后,CY=0;3.5邏輯運(yùn)算指令#11
1,邏輯與運(yùn)算指令(ANL) 2,邏輯或運(yùn)算指令(ORL) 3,邏輯異或指令(XRL) 4,累加器清零和取反指令(CLR&CPL)
5,移位指令1.邏輯與運(yùn)算指令可以分為兩類:1,以累加器A為目標(biāo)寄存器的邏輯運(yùn)算指令;2,以內(nèi)存單元為目標(biāo)的邏輯運(yùn)算指令。格式ANLA,Rn;A∧Rn→AANLA,direct;A∧(direct)→A ANLA,@Ri ;A∧(Ri)→A ANLA,#data ;A∧data→A ANLdirect,A ;(direct)∧A→direct ANLdirect,#data
;(direct)∧data→direct應(yīng)用舉例已知R0=30H和(30H)=0AAH,試問執(zhí)行下列指令后累加器A和30H單元中內(nèi)容是什么? 1.MOVA,#0FFH2.MOVA,#0F ANLA,R0 ANLA,30H
(A)=30H,(A)=0AH,(30H)=0AAH(30H)=0AAH很明顯:ANL操作可以從某個(gè)存儲(chǔ)單元中取出某幾位,而把其它的為屏蔽掉(清零)。2.邏輯或運(yùn)算指令格式:ORLA,Rn;A∨Rn→AORLA,direct;A∨(direct)→A ORLA,@Ri ;A∨(RI)→AORLA,#data;A∨data→A ORLdirect,A;(direct)∨A→direct ORLdirect,#data
;(direct)∨data→direct應(yīng)用舉例設(shè)累加器A=0AAH,P1口=0FFH。試編程將累加器A中的第四位送P1口低四位,而P1口高四位不變。解:MOVR0,A;累加器A中的數(shù)據(jù)暫存 ANLA,#0FH ;屏蔽A的高4位 ANLP1,#0F0H;屏蔽P1口的低4位 ORLP1,A;在P1口組裝 MOVA,R0;恢復(fù)累加器A的數(shù)據(jù)【小結(jié)】:與運(yùn)算可以“屏蔽”某些位;
或運(yùn)算可以“置位”某些位。3.邏輯異或運(yùn)算指令格式:XRLA,Rn ;A⊕Rn→AXRLA,direct ;A⊕(direct)→A XRLA,@Ri ;A⊕(RI)→A XRLA,#data ;A⊕data→A XRLdirect,A ;(direct)⊕A→direct XRLdirect,#data
;(direct)⊕data→direct特點(diǎn):按位運(yùn)算,相同時(shí)為0,不同時(shí)為1。使用異或可以實(shí)現(xiàn)將某個(gè)字節(jié)的數(shù)據(jù)或?qū)?shù)據(jù)的某幾位變反。舉例已知:外部RAM30H單元中有一個(gè)數(shù)AAH,現(xiàn)要將其高4位不變,低4位取反,試編程。解:
MOVDPTR,#0030H10101010
MOVXA,@DPTR⊕00001111 XRLA,#0FH10100101
MOVX@DPTR,A4.累加器清零和取反指令格式: CLRA;累加器清零 CPLA;累加器取反
舉例:已知30H單元中有數(shù)x,寫出對(duì)它求補(bǔ)的程序。 MOVA,30H CPLA INCA MOV30H,A邏輯運(yùn)算指令應(yīng)用舉例設(shè)X、Y和Z分別存在X、Y和Z單元。試編出能實(shí)現(xiàn)此電路功能的程序,并將結(jié)果送入F單元。解:MOVA,X
ANLA,Y ;X∧Y→A MOVR1,A;送R1暫存 MOVA,Y XRLA,Z ;Y∨Z→A CPLA ;A取反 ORLA,R1;(X∧Y) MOVF,A ;A→F⊕+XYZF∨(Y∨Z)→A5移位指令#12
格式:
RLA RRA RLCA RRCA
SWAPAA7←A0A7→A0A7←A0CyCyA7→A0
A3A0
A7A4A6←A0A70000000100000010舉例(一)已知:在M1和M1+1單元有一個(gè)16位數(shù)(M1存低8位),試編程將其擴(kuò)大2倍(設(shè)結(jié)果小于65535)。解:擴(kuò)大2倍可以用左移一位來實(shí)現(xiàn)。
dataH=00101100
01011001dataL=11001111
10011110M1M1+1110011110001011001110011110001011001程序清單
ORG1000HCLRC ;清除Cy位 MOVR1,#M1 ;指針賦值 MOVA,@R1 ;取低8位數(shù)據(jù) RLCA ;循環(huán)左移,Cy進(jìn)低位,高位進(jìn)Cy MOV@R1,A ;移位后數(shù)據(jù)回送 INCR1 ;指針加一 MOVA,@R1 ;取高8位數(shù)據(jù) RLCA ;循環(huán)左移Cy進(jìn)低位 MOV@R1,A ;數(shù)據(jù)回送END3.6控制轉(zhuǎn)移指令
3.6.1,無條件轉(zhuǎn)移指令 3.6.2,條件轉(zhuǎn)移指令 3.6.3,子程序調(diào)用和返回 3.6.4,空操作指令
3.6.1無條件轉(zhuǎn)移指令1.短轉(zhuǎn)移指令(絕對(duì)轉(zhuǎn)移指令)AJMPaddr11;絕對(duì)轉(zhuǎn)移,尋址范圍2K;指令中的11位地址,確定了地址的轉(zhuǎn)移范圍在2K以內(nèi),所以AJMP也稱“頁內(nèi)轉(zhuǎn)移”指令。101
0000110100101
XXXX
X10110100101A10a9a8
操作碼a7~a0AJMP指令PC程序計(jì)數(shù)器a10~800001a7~a0MCS-15的ROM系統(tǒng)是以2K為一頁來劃分程序存儲(chǔ)器,這樣對(duì)于4K的片內(nèi)ROM存儲(chǔ)器可以分為2頁;片外64K的ROM可以分為32頁。在執(zhí)行AJMP指令時(shí),PC的高5位決定了ROM中的頁地址;而AJMP指令的低11位地址用來選擇頁內(nèi)地址。在一般情況下,AJMP指令應(yīng)當(dāng)與目標(biāo)地址在同一頁內(nèi)。更具體的說:目標(biāo)地址應(yīng)當(dāng)與AJMP指令取出后的PC值(PC=PC+2)在同一頁內(nèi)。否則轉(zhuǎn)移將會(huì)出現(xiàn)錯(cuò)誤。ROM的64K存儲(chǔ)空間的頁面(部分)劃分表頁面PC高5位頁內(nèi)地址頁面PC高5位頁內(nèi)地址0頁000000000H~07FFH8頁010004000H~47FFH1頁000010800H~0FFFH9頁010014800H~4FFFH2頁000101000H~17FFH10頁010105000H~57FFH3頁000111800H~1FFFH11頁010115800H~5FFFH4頁001002000H~27FFH12頁011006000H~67FFH5頁001012800H~2FFFH13頁011016800H~6FFFH6頁001103000H~37FFH14頁011107000H~77FFH7頁001113800H~3FFFH15頁011117800H~7FFFHROM的64K存儲(chǔ)空間的頁面示意圖00000111
11111110PC值00001000
00000000PC+2值A(chǔ)JMP指令中的11位地址::::AAA:MOVA,R0MOVR1,A::AJMPAAA原本AJMP指令要轉(zhuǎn)到本頁的0100H單元但是由于PC的高5位頁面地址發(fā)生了變化使AJMP指令實(shí)際轉(zhuǎn)到下一頁0900H單元。00001001
00000000
最后PC值0100H07FEH發(fā)生跨頁錯(cuò)誤為什么?AJMP轉(zhuǎn)一指令是用來做頁內(nèi)2K范圍的轉(zhuǎn)移,如果使用不當(dāng),會(huì)發(fā)生錯(cuò)誤的“跨頁”操作。產(chǎn)生跨頁的原因是AJMP指令處于每一頁的最后兩個(gè)單元的結(jié)果,所以避免這種現(xiàn)象的方法就是不要在每一頁的最后兩個(gè)單元使用AJMP指令。如果目標(biāo)地址與AJMP地址不再同一頁內(nèi),建議使用LJMP指令替代AJMP。使用AJMP指令時(shí),11位的絕對(duì)地址可以用符號(hào)地址取代正確使用AJMP轉(zhuǎn)移指令2.相對(duì)轉(zhuǎn)移指令SJMPrel;尋址范圍256B;轉(zhuǎn)移范圍(+127~-128);80Hrel3.長轉(zhuǎn)移指令格式:LJMPaddr16;長轉(zhuǎn)移指令,尋址范圍65535;用法:
指令執(zhí)行時(shí),將指令碼中的addr16送入PC中,使程序無條件的轉(zhuǎn)向addr16所指向地址執(zhí)行程序。
【舉例】:
已知某單片機(jī)的監(jiān)控程序地址為A080H,試問用什么方法使單片機(jī)開機(jī)后自動(dòng)的轉(zhuǎn)向該監(jiān)控程序?
【解】:因?yàn)閱纹瑱C(jī)上電時(shí),PC=0000H,所以在0000H單元存放一條LJMP0A080H的指令即可。ROM4.散轉(zhuǎn)指令(變址轉(zhuǎn)移)格式:JMP@A+DPTR單字節(jié)操作碼為73H特點(diǎn):轉(zhuǎn)移地址由累加器A的內(nèi)容與DPTR相加形成。用途:用來制作一個(gè)多分支的轉(zhuǎn)移結(jié)構(gòu)?!九e例】:ORG2000HMOVDPTR,#TABLE;指針賦表頭地址
RLA JMPA,@A+DPTR;
TABLE: AJMPROUT0 ;多分支轉(zhuǎn)移表 AJMPROUT1 AJMPROUT2: :思考:如果該指令換成LJMP指令A(yù)應(yīng)如何處理?3.6.2,條件轉(zhuǎn)移指令#13
(1)累加器A判零轉(zhuǎn)移指令(雙字節(jié)指令) JZrel ;若A=0,則PC=PC+2+rel
;若A≠0,則PC=PC+2JNZrel ;若A≠0,則PC=PC+2+rel
;若A=0,則PC=PC+2(2)比較不相等條件轉(zhuǎn)移指令(3字節(jié)) (A)=data時(shí):PC+3→PC,Cy=0 CJNEA,#data,rel(A)>data時(shí):PC+3+rel,Cy=0 CJNERn,#data,rel(A)<data時(shí):PC+3+rel,Cy=1 CJNEA,direct,rel CJNE@Ri,#data,rel
【注意】:1,4條指令都是3字節(jié)指令,所以執(zhí)行時(shí)PC+3→PC。2,指令的執(zhí)行實(shí)際上就是做不回送的減法,通過Cy反映無符號(hào)數(shù)的兩數(shù)的大?。篊y=0則X>Y時(shí); 若Cy=1則X<Y。(3)減1條件轉(zhuǎn)移指令1,DJNZRn,rel;Rn-1→Rn,若Rn≠0則PC+2+rel→PC若Rn=0則PC+2→PC2,DJNZdirect,rel;(direct)-1→direct,若(direct)≠0則PC+3+rel→PC若(direct)=0則PC+3→PC注意:第一條指令為雙字節(jié),第二條指令為三字節(jié)。指令本身先做一個(gè)帶回送的減一運(yùn)算操作,根據(jù)運(yùn)算的結(jié)果是否為零作為轉(zhuǎn)移的條件應(yīng)用舉例令片內(nèi)RAM中DATA為起始地址的數(shù)據(jù)塊中連續(xù)10個(gè)無符號(hào)數(shù)相加,并把和送到SUN單元(設(shè)其和小于256)。 ORG1000HSTART:MOVR2,#0AH ;數(shù)據(jù)塊長度10送計(jì)數(shù)器R2 MOVR0,#DATA ;數(shù)據(jù)塊起始地址送指針R0 CLRA ;累加器清零LOOP:ADDA,@R0 ;累加部分和 INCR0
DJNZR2,LOOP;若R2-1≠0則轉(zhuǎn)LOOP繼續(xù)
MOVSUN,A
;存累加和 SJMP$ ;停機(jī) END3.6.3,調(diào)用和返回指令(一)子程序調(diào)用指令:
1,短調(diào)用指令A(yù)CALLaddr11 2,長調(diào)用指令LCALLaddr16
(二)返回指令: (一)調(diào)用指令1,短調(diào)用指令A(yù)CALLaddr11
PC+2→PC
SP+1→SP,PC7~0→(SP) SP+1→SP,PC15~8→(SP) addr11→PC10~0
2,長調(diào)用指令LCALLaddr16
PC+3→PC
SP+1→SP,PC7~0→(SP) SP+1→SP,PC15~8→(SP) addr16→PC(二)返回指令格式:RET操作: (SP)
→PC15~8,SP-1→SP
(SP)→PC7~0,SP-1→SP格式:RETI操作: (SP)→PC15~8,SP-1→SP
(SP)→PC7~0,SP-1→SP
3.6.4,空操作指令格式:NOP功能:僅使程序計(jì)數(shù)器PC加一,消耗12個(gè)時(shí)鐘周期,所以時(shí)常用作延時(shí)。3.7位操作指令#14
特點(diǎn):操作數(shù)不是字節(jié),而是某一位。每位的取值只能是“0”或“1”,因而也稱之為布爾變量操作。布爾變量存在于片內(nèi)RAM的位尋址區(qū)(20H~2FH)、11個(gè)可以按位尋址的SFR。3.7.1,位傳送指令格式:MOVC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 保潔設(shè)施保養(yǎng)管理制度內(nèi)容(3篇)
- 有限空間安全管理制度下載(3篇)
- 煤炭技術(shù)管理制度內(nèi)容(3篇)
- 班級(jí)人員組織管理制度范本(3篇)
- 碼頭專班管理制度匯編(3篇)
- 美發(fā)店流程管理制度(3篇)
- 財(cái)政項(xiàng)目庫管理制度匯編(3篇)
- 鐵嶺消防施工方案(3篇)
- 防疫線上活動(dòng)策劃方案(3篇)
- 項(xiàng)目逆向施工方案(3篇)
- 中央中國熱帶農(nóng)業(yè)科學(xué)院院屬單位2025年第一批招聘筆試歷年參考題庫附帶答案詳解
- 研發(fā)費(fèi)用加計(jì)扣除審計(jì)服務(wù)協(xié)議
- 2025年二年級(jí)上冊(cè)語文期末專項(xiàng)復(fù)習(xí)-按課文內(nèi)容填空默寫表(含答案)
- 建筑施工公司成本管理制度(3篇)
- 2025年婦產(chǎn)科副高試題庫及答案
- 2025年度黨委黨建工作總結(jié)
- 新質(zhì)生產(chǎn)力在體育產(chǎn)業(yè)高質(zhì)量發(fā)展中的路徑探索
- 2025年公民素質(zhì)養(yǎng)成知識(shí)考察試題及答案解析
- 老年人營養(yǎng)和飲食
- 《關(guān)鍵軟硬件自主可控產(chǎn)品名錄》
- 2025年濟(jì)南市九年級(jí)中考語文試題卷附答案解析
評(píng)論
0/150
提交評(píng)論