微型計(jì)算機(jī)原理及應(yīng)用課件-第6章-2_第1頁
微型計(jì)算機(jī)原理及應(yīng)用課件-第6章-2_第2頁
微型計(jì)算機(jī)原理及應(yīng)用課件-第6章-2_第3頁
微型計(jì)算機(jī)原理及應(yīng)用課件-第6章-2_第4頁
微型計(jì)算機(jī)原理及應(yīng)用課件-第6章-2_第5頁
已閱讀5頁,還剩57頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

6.2MCS-51匯編指令系統(tǒng)(1)地址標(biāo)號:本條指令的起始地址的符號表示,但第一個(gè)字符必須是字母,其余可以是字母、數(shù)字、符號,結(jié)尾處必須用半角冒號“:”,標(biāo)號地址可以缺省。(2)指令助記符:能表征具體操作功能的固定英文字母組合(不區(qū)分大小寫,一般書寫為大寫),方便編程人員顧名思義,但是須經(jīng)“翻譯”(匯編)成機(jī)器操作碼才能被計(jì)算機(jī)識別,指令助記符是1條指令中必不可少的組成部分。(3).操作數(shù):指令的操作對象,參加運(yùn)算操作的數(shù),一條指令可以有1~3個(gè)操作數(shù),也可以沒有操作數(shù)(也就是無操作數(shù)),數(shù)據(jù)形式可以用二進(jìn)制、八進(jìn)制和十六進(jìn)制表示,若用字母打頭的十六進(jìn)制數(shù)時(shí),前面須加0,否則計(jì)算機(jī)不能識別,多個(gè)操作數(shù)之間必須用半角逗號“,”分開。1)立即數(shù)。該操作數(shù)即為參加運(yùn)算的數(shù),在指令操作碼之后直接攜帶,無須任何讀寫操作就可以即時(shí)參加運(yùn)算,MCS-51單片機(jī)匯編指令中立即數(shù)形式為數(shù)據(jù)前加“#”符號前綴,8位立即數(shù)記為#data(如#30H),16位立即數(shù)記為#data16(如#2000H)。MCS-51單片機(jī)匯編指令中操作數(shù)形式:2)寄存器操作數(shù)。該操作數(shù)形式為寄存器,寄存器中存放參加運(yùn)算的數(shù),指令中直接給出被訪問寄存器的名字,可以是工作寄存器組,簡記為Rn(n=0~7)。3)直接地址操作數(shù)。該操作數(shù)形式為內(nèi)部RAM單元地址或SFR,若令中直接給出內(nèi)部RAM的地址,記為direct,地址范圍為內(nèi)部RAM00H~FFH。4)寄存器間接尋址操作數(shù)。該操作數(shù)形式為寄存器前加“@”,寄存器中存放的是存儲器地址,存儲器中存放參加運(yùn)算的數(shù),指令中給出的是存有存儲器地址的寄存器。存儲器地址為8位時(shí)僅可存于R0或R1寄存器,記為@Ri(i=0,1),存儲器地址為16位時(shí),必須放入DPTR,記為@DPTR。參加運(yùn)算的數(shù)可以存放于內(nèi)部RAM、外部RAM、外設(shè)端口及ROM表格中。

(4)注釋。用戶為閱讀程序方便而加注的解釋說明。可選項(xiàng),注釋形式不限,對指令執(zhí)行沒有影響,只起指令功能說明作用,用半角分號“;”與操作數(shù)或指令隔開。例如

在ROM2000H處存有一條完整匯編指令:ORG2000HLOOP:ADDA,#0A8H;A累加器中的數(shù)與操作數(shù)A8H相加….

指令中“LOOP”表示指令首地址2000H,“ADD”為表示加法的指令助記符,

“A,#0A8H”為操作數(shù),“;A累加器中的數(shù)與操作數(shù)A8H相加”為注釋。6.2.2MCS-51匯編指令尋址方式CPU尋找具體運(yùn)算數(shù)據(jù)的方式稱為尋址方式。MCS-51單片機(jī)指令系統(tǒng)中最基本的尋址方式有8種,分別為立即尋址方式、直接尋址方式、寄存器尋址方式、寄存器間接尋址方式、位尋址方式、變址尋址方式、絕對尋址方式和相對尋址方式。1.立即尋址方式

指令中給出的是立即數(shù),立即數(shù)緊跟操作碼存放,取指令即取得立即數(shù),方便快捷。由于立即數(shù)沒有自己獨(dú)立的地址,因此立即數(shù)只能被讀取。MOVA,#35H;將立即數(shù)35H送入寄存器A,指令碼為7435H。MOVDPTR,#1234H

;將立即數(shù)1234H送入寄存器DPTR,

指令碼為901234H。2.直接尋址方式

MOVA,35H;將內(nèi)部RAM35H單元的內(nèi)容送入寄存器A,指令碼為E535H。

MOVR0,0D0H;將內(nèi)部RAMD0H單元的內(nèi)容送入寄存器R0,指令碼為A8D0H。

MOVA,PSW;將SFR寄存器PSW內(nèi)容傳送至寄存器A,指令碼為E5D0H,與

直接尋址指令MOVA,0D0H指令碼功能相同。

指令中給出的是直接地址操作數(shù),該地址緊跟指令操作碼存放,取指令即取得該地址,MCS-51單片機(jī)指令系統(tǒng)中的直接尋址方式僅限于對存儲于片內(nèi)RAM中的數(shù)據(jù)進(jìn)行尋址,尋址范圍是00H~FFH。(1)訪問內(nèi)部RAM可通過R0和R1作為間接尋址寄存器。MOVR0,#50HMOV@R0,A(2)訪問外部RAM或外設(shè)端口,可采用DPTR或R0、R1作為間接尋址寄存器。

當(dāng)?shù)刂窞?0H~FFH時(shí),可用寄存器R0或R1;

當(dāng)?shù)刂窞?000H~FFFFH時(shí),則必須用寄存器DPTR。MOVDPTR,2000HMOVXA,@DPTRMOVR1,50HMOVXA,@R1MOVDPTR,0050HMOVXA,@DPTR4.寄存器間接尋址方式指令中給出存有操作數(shù)地址的寄存器5.位尋址方式(1)片內(nèi)RAM低128B的位尋址區(qū)20H~2FH,共16個(gè)單元128位,位地址范圍為00H~7FH;3)字節(jié)地址加位序號的形式MOVC,0D0H.04)直接使用位地址形式

MOVC,0D0H指令操作數(shù)為位累加器C和位地址。MOVC,00H;將00H位送至位累加器C,指令碼為A200H。(2)片內(nèi)RAM高128B單元中可以位尋址的11個(gè)特殊功能寄存器,共88位。訪問可以位尋址的SFR某位,可寫成4種形式。例如:讀取程序狀態(tài)寄存器PSW的第0位操作。1)特殊功能寄存器加位序號的形式MOVC,PSW.02)位的符號地址(位名稱)的形式MOVC,P6.變址尋址方式

MCS-51單片機(jī)的變址尋址是以數(shù)據(jù)指針DPTR或PC作為基址寄存器,以累加器A作為變址寄存器,以兩者內(nèi)容相加形式新的16位地址作為操作數(shù)地址,再從該地址讀出數(shù)據(jù)送入寄存器A。

MOVCA,@A+PC;將A+PC所合成的地址所指的ROM單元的內(nèi)容讀出送入A,PC為本條指令地址下一條指令的首地址,指令碼為83H。

MOVCA,@A+DPTR;將A+DPTR所合成的地址所指的ROM單元的內(nèi)容讀出送入A,指令

碼為93H。

絕對尋址方式指令給出的操作數(shù)為存儲器地址,絕對尋址的目的是通過改變程序指針PC的內(nèi)容,實(shí)現(xiàn)程序的轉(zhuǎn)移。絕對尋址方式對應(yīng)絕對轉(zhuǎn)移指令,指令中的操作數(shù)為程序轉(zhuǎn)移的目標(biāo)地址。7.絕對尋址方式

LJMP2000H;轉(zhuǎn)移至ROM2000H處執(zhí)行程序,執(zhí)行指令后PC=2000H,指令碼022000H。LCALL2000H

;調(diào)用入口地址為2000H的子程序,指令碼為122000H。8.相對尋址方式

相對尋址方式指令中給出的操作數(shù)為-128~+127之間的有符號數(shù)(補(bǔ)碼),相對尋址的目的也是通過改變程序指針PC的內(nèi)容,實(shí)現(xiàn)程序的轉(zhuǎn)移和執(zhí)行。相對尋址方式對應(yīng)相對轉(zhuǎn)移指令,指令中的操作數(shù)為地址偏移量,程序轉(zhuǎn)移的目標(biāo)地址為當(dāng)前PC值加上偏移量,當(dāng)前PC值指得是相對轉(zhuǎn)移指令的下一條指令的首地址。1000H:SJMP1055H;在ROM1000H處的無條件相對轉(zhuǎn)移指令,指令碼為8053H,當(dāng)前PC為1000H+2,其轉(zhuǎn)移目標(biāo)地址為1000H+2+53H=1055H。1000H:JZ1055H

;在ROM1000H處的有條件相對轉(zhuǎn)移指令,指令碼為6053H,當(dāng)前PC為1000H+2,若A=0,則轉(zhuǎn)移目標(biāo)地址為1000H+2+53H=1055H,若A≠0,則轉(zhuǎn)移目標(biāo)地址為1000H+2=1002H,即順序執(zhí)行。MCS-51指令系統(tǒng)共包含111條基本指令,按照指令的功能不同可分為數(shù)據(jù)傳送類指令(29條)、算術(shù)運(yùn)算和邏輯運(yùn)算類指令(48條)、移位和位操作類指令(17條)和跳轉(zhuǎn)及控制類指令(17條)4類。6.2.3.2MCS-51指令中的常用符號(1)Rn(n=0~7):表示當(dāng)前工作寄存器R0~R7中的某個(gè)寄存器。(2)Ri(i=0或1):表示寄存器R0或R1。(3)#data:表示8位立即數(shù)。(4)#data16:表示16位立即數(shù)。6.2.3MCS-51匯編指令系統(tǒng)6.2.3.1MCS-51指令系統(tǒng)分類

(5)direct:表示片內(nèi)RAM的某存儲單元地址。既可以是片內(nèi)RAM低128B的單元地址,也可以是高128B中特殊功能寄存器的單元地址或符號地址。

(6)addr11:用無符號數(shù)表示的11位二進(jìn)制絕對地址偏移量,取值范圍在0000H~07FFH,主要用于ACALL指令和AJMP指令。

(7)addr16:表示16位目的地址,主要用于LCALL指令和LJMP指令。

(8)rel:用補(bǔ)碼形式表示的8位二進(jìn)制相對地址偏移量,取值范圍在-128~+127。主要用于相對轉(zhuǎn)移指令,用以形成轉(zhuǎn)移的目標(biāo)地址。

(9)bit:表示位地址。

(10)B:表示B寄存器。

(11)ACC:寄存器A對應(yīng)的SFR形式。

(12)C:表示PSW中的進(jìn)位標(biāo)志位Cy。

(13)$:表示當(dāng)前指令的地址。6.2.3.3.MCS-51指令長度判定規(guī)則

在MCS-51單片機(jī)指令系統(tǒng)中指令長度判定規(guī)則是:每條指令基本長度為1個(gè)字節(jié),若指令操作數(shù)為8位立即數(shù)data或8位直接地址direct或相對地址偏移量rel或絕對地址偏移量addr11或地址符號$或者位地址bit或者SFR中的任意形式,每出現(xiàn)1次,指令長度須在基本長度上增加1個(gè)字節(jié);若指令操作數(shù)中出現(xiàn)16位立即數(shù)data16或16位地址addr16中的某1個(gè),每出現(xiàn)1次,指令長度須在基本長度上增加2個(gè)字節(jié)。6.2.3.4.數(shù)據(jù)傳送類指令

數(shù)據(jù)傳送類指令主要完成數(shù)據(jù)的傳送、交換和保存等功能。數(shù)據(jù)傳送指令一般不影響任何標(biāo)志位,但當(dāng)目標(biāo)地址為A時(shí),將會影響奇偶標(biāo)志位P。按照操作方式可將其分為內(nèi)部數(shù)據(jù)傳送指令、外部數(shù)據(jù)傳送指令、數(shù)據(jù)交換指令和堆棧操作指令。1.內(nèi)部數(shù)據(jù)傳送類指令(MOV)MOV目,源(1).立即尋址型數(shù)傳送指令MOVA,#data;data→AMOVRn,#data;data→RnMOV@Ri,#data;data→(Ri)雙字節(jié)MOVdirect,#data;data→directMOVDPTR,#data16;data16→DPTR

;唯一的一條16位數(shù)傳送指令三字節(jié)MOVDPTR,#1234HMOVA,#20HMOVR5,#30HMOVR0,#30HMOV@R0,#40HMOV31H,#50HMOV32H,#40(2).直接尋址型傳送指令雙字節(jié)MOVA,direct;(direct)→AMOVdirect,A;(A)→directMOVRn,direct;(direct)→RnMOV@Ri,direct;(direct)→(Ri)MOVdirect2,direct1;(direct1)→direct2三字節(jié)

例.已知R0=20H,(20H)=11H,(30H)=22H,(40H)=33H問8051執(zhí)行如下指令后,累加器A、50H、R5、20H和60H單元中的內(nèi)容是什么?MOVA,20HMOV50H,AMOVR5,30HMOV@R0,40HMOV60H,50H(A)=11H,(50H)=11H,(R5)=22H,(20H)=33H,(60H)=11H(3).寄存器尋址型傳送指令

MOVA,Rn;Rn→A

MOV@Ri,A;A→(Ri)MOVRn,A;A→RnMOV

direct,A;A→(direct)MOVdirect,Rn;Rn→(direct)(4).寄存器間址型傳送指令MOVA,@Ri;((Ri))→AMOV@Ri,A;

A→(Ri)MOVdirect,@Ri;((Ri))→direct

例.已知R0=30H,R1=40H,(30H)=AAH,(40H)=BBH,問8051執(zhí)行如下指令后,累加器A、30H、40H和50H單元中的內(nèi)容是什么?MOVA,@R0MOV@R1,AMOV50H,@R1(A)=AAH,(30H)=AAH,(40H)=AAH,(50H)=AAH注意:a.指令不能創(chuàng)造

b.A影響PSWMOVRn,@RiMOV#data,A2.外RAM(或I/O)與寄存器A之間的傳送指令(MOVX)實(shí)現(xiàn)外RAM(或I/O)與A之間的數(shù)據(jù)傳送MOVXA,@Ri;((Ri))→AMOVX@Ri,A;A→(Ri)MOVXA,@DPTR;((DPTR))→AMOVX@DPTR,A;A→(DPTR)00H~0FFH0000H~0FFFFH注意:a.建立指針

b.A參與

例.將內(nèi)部50H單元中的數(shù)X送到外部RAM2500H單元中,將外部RAM2501H單元內(nèi)容送入內(nèi)部40H單元。MOVA,50HMOVDPTR,#2500HMOVX@DPTR,AMOVDPTR#2501HMOVXA,@DPTRMOV40H,A3.ROM中的數(shù)據(jù)查詢指令(MOVC)變址尋址,查表指令A(yù)變址,DPTR,PC作基址,兩者相加的得ROM某單元地址,將該地址中的數(shù)→AMOVCA,@A+DPTRMOVCA,@A+PCDPTR存放表首址,可以是任意地址A中存放偏移量A+DPTR=新地址PC為查表指令下一條指令首地址,A+A’+PC=新地址A’為修正量=表首址-PC

例.已知累加器A中有一個(gè)0~9范圍內(nèi)的數(shù),用以上查表指令編出能查出0~9的平方值的程序。設(shè)平方表首地址為2000H。1).采用DPTR作為基址寄存器:MOVDPTR,#2000MOVCA,@A+DPTRMOV40H,A;

┇ORG2000HDB00H,01H,09H,04H,10H,19H,24H,31H,40H,51H

若A=03H,得到新地址2003H,從該地址中查表得9并存入累加器A中。ORG1FF7H1FF7HMOVA,#data;data為0-9之一。

1FF9HADDA,#04H;A+修正量。1FFBHMOVCA,@A+PC;查平方表。1FFCHMOV40H,A;查得平方送內(nèi)部RAM40H單元,該指令為兩字節(jié)指令。1FFEHSJMP$;停機(jī)指令,該指令為兩字節(jié)指令。

2000HDB00H2001HDB01H

┇2004HDB10H2009HDB51H(2).若采用PC作為基址寄存器:4.數(shù)據(jù)交換指令XCHA,Rn;A

RnXCHA,@Ri;A((Ri))XCHA,direct;A(direct)XCHDA,@Ri;A((Ri))3~0注:必須經(jīng)過A例.已知外部RAM的60H單元中有1個(gè)數(shù)X,內(nèi)部RAM的60H單元中有1個(gè)數(shù)Y,編程實(shí)現(xiàn)內(nèi)外部RAM60H單元內(nèi)容互換。MOVR0,#60H;

60H→R0MOVXA,@R0;((R0))→AXCHA,@R0;

((R0))

AMOVX@R0,A;

A→(R0)

例.利用數(shù)據(jù)交換指令,將內(nèi)部RAM60H單元中的低位BCD碼轉(zhuǎn)換成ASCⅡ碼,并將結(jié)果存到外部2500H中。MOVR0,#60HMOVA,#30HXCHDA,@R0MOVDPTR,#2500HMOVX@DPTR,A5.堆棧操作指令PUSHdirect;SP+1→SP,(direct)→SPPOPdirect;(direct)→SP,SP-1→SP

例.設(shè)(30H)=X,(40H)=Y,試?yán)枚褩^(qū)域?qū)崿F(xiàn)30H和40H單元中的數(shù)據(jù)交換MOVSP,#60H

;

Y→61HPUSH30H

;

X→62HPOP40H

;

X→40HPOP30H

;

Y→30HPUSHAPUSHACC(或E0H)(1)加法指令1)不帶進(jìn)位CY的加法指令A(yù)DD

注:8位二進(jìn)制數(shù),必須有A參與,結(jié)果在A中1.算術(shù)運(yùn)算類指令6.2.3.5.運(yùn)算類指令A(yù)DDA,#data;(A)+data→AADDA,direct;

(A)+(direct)→AADDA,Rn;

(A)+(Rn)→AADDA,@Ri;

(A)+((Ri))→A

參加運(yùn)算的兩個(gè)二進(jìn)制數(shù)可被“看作”無符號數(shù)(0~255),也可以被“看作”有符號數(shù)的補(bǔ)碼(-128~+127),結(jié)果為補(bǔ)碼形式,影響PSW.例:編程求9AH+75H,并分析對PSW的影響。MOVA,#9AHADDA,#75H無符號數(shù),結(jié)果為271

帶符號數(shù),(-102)+117=152).帶進(jìn)位CY的加法指令A(yù)DDCADDCA,#data;A+data+Cy→AADDCA,direct;A+(direct)+Cy→AADDCA,Rn;A+Rn+Cy→AADDCA,@Ri;A+((Ri))+Cy→A例.編程求3875H+6549H,結(jié)果的高低字節(jié)分別存于內(nèi)部RAM的31H單元和30H單元。

ORG0100HMOVA,#75HADDA,#49HMOV30H,AMOVA,#38HADDCA,#65HMOV31H,ASJMP$END3)加1指令

注:只有第一條指令能對PSW的P標(biāo)志位產(chǎn)生影響,其余四條都不會對標(biāo)志位產(chǎn)生影響,只要是對A的操作都會影響PSW。INC

A

INC

Rn

INC

direct

INC

@Ri

INC

DPTR

例.編程實(shí)現(xiàn)內(nèi)部RAM30H~33H單元內(nèi)容對應(yīng)傳送至內(nèi)部RAM40H~43H單元中。MOVR0,#30HMOVR1,#40HMOVA,@R0MOV@R1,A;(30H)→40H。INCR0INCR1MOVA,@R0MOV@R1,A;(31H)→41H。INCR0INCR1MOVA,@R0MOV@R1,A;(32H)→42H。(2)

減法指令SUBBA,#data;A-data-Cy→ASUBBA,direct;A-(direct)-Cy→ASUBBA,Rn;A-Rn-Cy→ASUBBA,@Ri;A-((Ri))-Cy→A1)帶借位Cy的減法指令

特別指出,在MCS-51指令中,沒有不帶借位位的減法指令,如果想不考慮借位位,就在該減法指令前加一條Cy的清零指令。CLRC;

0→Cy

例:編程求9875H-6354H,結(jié)果的高低字節(jié)分別存入內(nèi)部RAM的21H和20H單元中。ORG0100HCLRCMOVR0,#20HMOVA,#75HSUBBA,#54HMOV@R0,AMOVA,#98HSUBBA,#63HINCR0MOV@R0,ASJMP$END

DECA;(A)-1→A

DECRn;(Rn)-1→Rn

DECdirect;(direct)-1→direct

DEC@Ri;((Ri))-1→(Ri)注意:沒有DECDPTR指令!3)十進(jìn)制調(diào)整指令緊跟在ADD或ADDC指令之后且只能用于BCD碼加法運(yùn)算中

DAA2)減1指令

例.編寫程序?qū)崿F(xiàn)78+53的BCD加法過程。

MOVA,#78HADDA,#53HDAACLRCy

;0→Cy。MOVA,#9AH;用十六進(jìn)制數(shù)(99H+1=)9AH表示十進(jìn)制數(shù)100的BCD碼。SUBBA,#53H;求十進(jìn)制數(shù)53的BCD補(bǔ)碼。ADDA,#78H;減法轉(zhuǎn)加法,減去1個(gè)數(shù)可用加這個(gè)數(shù)的補(bǔ)碼來完成。DAA;對寄存器A中結(jié)果進(jìn)行加法調(diào)整。例

編寫程序?qū)崿F(xiàn)78-53的BCD減法過程。

特別指出,在MCS-51單片機(jī)指令系統(tǒng)中沒有十進(jìn)制減法調(diào)整指令,因此,BCD減法運(yùn)算可采用補(bǔ)碼運(yùn)算法則將減法轉(zhuǎn)化為加法,最后用十進(jìn)制加法調(diào)整指令進(jìn)行調(diào)整。(4)

乘法和除法指令

注意:在使用乘除法指令時(shí),只對8位無符號數(shù)進(jìn)行乘除運(yùn)算,被乘數(shù)或被除數(shù)只能來自累加器A,乘數(shù)或除數(shù)必須來自累加器B,對于乘法運(yùn)算,結(jié)果的高8位存入B中,低8位存入A中,對于除法運(yùn)算,商數(shù)存入A中,余數(shù)存入B中。MULAB;A×B→A和BDIVAB;A÷B→A和B

例.已知兩個(gè)8位無符號數(shù)分別放在50H和51H中,編程求兩數(shù)之積,并把積的低字節(jié)存入52H中,積的高字節(jié)存入53H中。INCR1MOV@R1,AINCR1MOV@R1,BSJMP$ENDORG2000HMOVR1,#50HMOVA,@R1INCR1MOVB,@R1MULAB2.邏輯運(yùn)算指令(1)

邏輯與操作指令A(yù)NL

A,direct

;A∧(direct)→AANL

A,#data

;A∧data→AANL

A,Rn

;A∧(Rn)→AANL

A,@Ri;A∧((Ri))→AANL

direct,#data

;(direct)∧data→directANL

direct,A

;(direct)∧A→direct

某位與0相與,該位清零,稱為屏蔽;

某位與1相與,該位不變,稱為截取。

例將內(nèi)部RAM30H單元存放的某數(shù)字(0~9)的ASCII碼轉(zhuǎn)換為非壓縮BCD碼。ANL30H,#0FH;(30H)∧0FH→30HORL

A,direct

;(A)∨(direct)→AORL

A,#data

;(A)∨data→AORL

A,Rn

;(A)∨(Rn)→AORL

A,@Ri;(A)∨((Ri))→AORL

direct,#data

;(direct)∨data→directORL

direct,A

;(direct)∨(A)→direct

某位與0“或”則該位保持不變;

某位與1“或”則該位置1(置位)。(2)

邏輯或操作指令例

將內(nèi)部RAM30H單元存放的某數(shù)字(0~9)的非壓縮BCD碼轉(zhuǎn)換為ASCII碼。

ORL30H,#30H;(30H)+0FH→30H,若(30H)=05H,指令執(zhí)行后

(30H)=35H(`5`)。(3)

邏輯異或操作指令某位與1“異或”則該位取反;某位與0“異或”則該位不變。XRL

A,direct

;(A)

⊕(direct)→AXRL

A,#data

;(A)⊕data→AXRL

A,Rn

;(A)⊕(Rn)→AXRL

A,@Ri;(A)⊕((Ri))→AXRL

direct,#data

;(direct)

⊕data→directXRL

direct,A

;(direct)⊕(A)→direct

例.編程將片外RAM2000H單元中的數(shù)高4位取反,低4位不變。ORG2000HMOVDPTR,#2000HMOVXA,@DPTRXRLA,#0F0HMOVX@DPTR,ASJMP$END(4)

累加器清零和取反指令CLRA;0→A,累加器A清零CPLA;A→A,累加器A取反

例.已知片內(nèi)50H單元中有一個(gè)負(fù)數(shù)X,編程求X補(bǔ)碼的程序。ORG2000HMOVA,50HCPLAINCAORLA,#80HMOV30H,ASJMP$END6.2.3.6移位和位操作指令RLA;RRA;RLCA;RRCA;SWAPA;1.移位指令例編程使內(nèi)部RAM30H單元中的數(shù)乘10(設(shè)乘積小于256)。ORG0100HMOVA,30HRLAMOVB,ARLARLAADDA,BMOV30H,ASJMP$END例已知有1個(gè)16位無符號數(shù),高8位存于累器加A中,低8位存于寄存器B中,編程使此數(shù)乘2(設(shè)乘積小于65536)。ORG2000HCLRCMOVR0,AMOVA,BRLCAMOVB,AMOVA,R0RLCASJMP$END例在內(nèi)部RAM50H和51H單元存有兩個(gè)非壓縮BCD數(shù),編程將它們緊縮為1個(gè)字節(jié)放入內(nèi)部RAM50H。ORG1000HMOVR1,#50HMOVA,@R1SWAPAINCR1ORLA,@R1DECR1MOV@R1,ASJMP$END2位操作指令(1)位傳送指令MOVC,bitMOVbit,C例.將20H位的內(nèi)容傳送到5AH位MOVC,20HMOV5AH,C(2)位置位和位清零指令CLRCCLRbitSETBCSETBbit(3)位邏輯運(yùn)算指令A(yù)NL

C,bit

ANL

C,/bit

ORL

C,bit

ORL

C,/bit

CPL

CCPLbit例M、N和W都代表位地址,編程求Y。ORG0100HMOVC,NORLC,WANLC,MCPLCMOVY,CSJMP$

END例M、N和Y都代表位地址,編程完成M、N中內(nèi)容的異或操作,結(jié)果存放在Y中。ORG0100HMOVC,NANLA,/MMOVY,CMOVC,MANLC,/NORLC,YMOVY,CSJMP$END6.2.3.7.跳轉(zhuǎn)及控制轉(zhuǎn)移指令

改變程序計(jì)數(shù)器PC內(nèi)容為目標(biāo),實(shí)現(xiàn)程序轉(zhuǎn)移。1無條件轉(zhuǎn)移指令(1)長轉(zhuǎn)移指令LJMPaddr16;PC←addr16

指令執(zhí)行后,PC指向addr16,可以是64KB程序空間任意地址。Addr16經(jīng)常用標(biāo)號地址表示轉(zhuǎn)移目標(biāo)。

若標(biāo)號地址START代表0100H,則指令0000H:LJMPSTART,表示MCS-51單片機(jī)開機(jī)或系統(tǒng)復(fù)位后,從0100H處開始執(zhí)行程序。(2).短轉(zhuǎn)移指令A(yù)JMPaddr11;PC+2→PC,addr11→PC10~0雙字節(jié)雙周期指令

需要指出,AJMP指令中給出的轉(zhuǎn)移目標(biāo)地址必須與下一條指令的地址(即PC+2)在同一個(gè)2KB區(qū)域(X000H~X7FFH或X800H~XFFFH),addr11僅代表轉(zhuǎn)移目標(biāo)地址的低11位(A10~A0),其值由轉(zhuǎn)移目標(biāo)地址所在頁確定。例

根據(jù)以下短轉(zhuǎn)移指令,求addr11。①

2000H:AJMP2600H②2A00H:AJMP29F0H①addr11=0600H

目標(biāo)地址=2600H②addr11=01F0H目標(biāo)地址=29F0H(3)

相對轉(zhuǎn)移指令SJMPrel;PC+2+rel→PC雙字節(jié)雙周期指令rel(-128~+127)rel=目標(biāo)地址-(源地址+2)

例根據(jù)以下相對轉(zhuǎn)移指令,求偏移量rel。

0100H:SJMP0155H

②0100H:SJMP0F6H

對①目標(biāo)地址為0155H,rel=0155H-(0100H+2)=0157H

,其指令碼為8053H。對②目標(biāo)地址為00F6H,rel=00F6H-(0100H+2)=F4H(負(fù)數(shù))=[-12]補(bǔ),其指令碼為80F4H。SJMP$;指令碼為80FEHrel=FEH=[-2]補(bǔ)目標(biāo)地址為PC+2-2=PC,‘原地踏步’(4).變址尋址指令(散轉(zhuǎn)指令)JMP

@A+DPTR

;A+(DPTR)→PC

例:已知累加器A中放有待處理命令編號0~3,程序存儲器中放有始址為TAB的二字節(jié)短轉(zhuǎn)移指令,編程使機(jī)器按照累加器A中的命令編號轉(zhuǎn)去執(zhí)行相應(yīng)的命令程序。ORG1000H

RLAMOVDPTR,#TABJMP@A+DPTRTAB:AJMPKL0AJMPKL1AJMPKL2AJMPKL3┇2條件轉(zhuǎn)移指令

需要判斷某種條件是否滿足而決定程序流程,實(shí)現(xiàn)程序分支。

例編程將內(nèi)部RAM50H單元與60H單元中數(shù)作差,結(jié)果放在A中,若A=0,則使(40H)=00H,否則使(40H)=FFH。

(1).累加器A的判零轉(zhuǎn)移指令

JZ

rel

;

若A=0,則(PC)+2+rel→PC

若A≠0,則(PC)+2→PC

JNZ

rel

;

若A≠0,則(PC)+2+rel→(PC)若A=0,則(PC)+2→PCORG1000HCLRCMOVA,50HSUBBA,60HJZZEROMOV40H,#0FFHSJMPSTOPZERO:MOV40H,#00HSTOP:SJMP$

END(2)

位控制轉(zhuǎn)移類指令1).判Cy轉(zhuǎn)移指令JC

rel

;

若(CY)=1,則(PC)+2+rel→PC

若(CY)=0,則(PC)+2→PCJNC

rel

;若(CY)=0,則(PC)+2+rel→PC

若(CY)=1,則(PC)+2→PC

JB

bit,rel

;若(bit)=1,則(PC)+3+rel→PC

若(bit)=0,則(PC)+3→PCJNB

bit,rel

;若(bit)=0,則(PC)+3+rel→PC

若(bit)=1,則(PC)+3→PC

JBC

bit,rel

;若(bit)=1,則(PC)+3+rel→PC且0→bit

若(bit)=0,則(PC)+3→PC2).判直接尋址位轉(zhuǎn)移指令三字節(jié)指令減法操作,但不保存結(jié)果,影響CY若是無符號數(shù),可根據(jù)CY直接判斷大小3.比較轉(zhuǎn)移指令

CJNE

A,direct,rel

;

若(A)≠(direct),則(PC)+3+rel→(PC)若(A)=(direct),則(PC)+3→(PC),形成CYCJNE

A,#data,rel

CJNE

Rn,#data,rel

CJNE

@Ri,#data,rel

例.已知50H與60H均為無符號數(shù),請比較兩數(shù)大小,將較大的數(shù)送到50H中,將較小的數(shù)送到60H中。ORG1000HMOVA,50HCJNEA,60H,L1L1:JNCSTOPXCHA,60HMOV50H,ASTOP:SJMP$END3.循環(huán)控制轉(zhuǎn)移指令

例編程實(shí)現(xiàn)片內(nèi)RAM50H為首地址的連續(xù)10個(gè)單元中的無符號數(shù)求和,并把求和結(jié)果送到片外RAM2000H單元中(假設(shè)和不產(chǎn)生進(jìn)位)。DJNZ

Rn,rel

;若(Rn)-1≠0,則(PC)+2+rel→PC

若(Rn)-1=0,則(PC)+2→PC

DJNZ

direct,rel

ORG1000HMOVDPTR,#2000H

MOVR5,#0AHMOVR0,#50HCLRALOOP:ADDA,@R0INCR0DJNZR5,LOOPMOVX@DPTR,ASJMP$END4.子程序調(diào)用指令和返回指令

子程序調(diào)用和返回指令實(shí)際上是一種特殊的程序轉(zhuǎn)移,調(diào)用子程序即是轉(zhuǎn)移至子程序入口地址處去執(zhí)行子程序,返回指令即是轉(zhuǎn)移至返回地址(調(diào)用指令下一條指令的首地址)繼續(xù)原來的程序,但與一般轉(zhuǎn)移指令的不同之處在于,調(diào)用子程序時(shí)須將返回地址壓入堆棧,返回指令執(zhí)行時(shí)須將返回地址出棧,而一般轉(zhuǎn)移指令不涉及堆棧操作。1).長調(diào)用指令

LCALL

addr16

;(PC)+3→PC,(SP)+1→SP,(PC7-0)→SP,(SP)+1→SP,(PC15-8)→SP,addr16→PC

2)短調(diào)用指令

ACALL

addr11;(PC)+2→PC,(SP)+1→SP(PC7-0)→SP,(SP)+1→SP(PC15-8)→(SP),addr11→(PC10-0)(1)子程序調(diào)用指令

子程序調(diào)用指令指令執(zhí)行完后,程序就會轉(zhuǎn)移到指令操作數(shù)所指目的地址處去執(zhí)行新的指令。例已知SUBTRN=0123H,單片機(jī)執(zhí)行如下指令

MOVSP,#07HSUBTRN:ACALL0345H堆棧中的數(shù)據(jù)如何變化,PC中的內(nèi)容是什么?SP=09H,(08H)=25H,(09H)=01H,PC=0345H。

(2)返回指令

1)子程序返回

RET

;(SP)→PC15-8,(SP)-1→SP

(SP)→PC7-0,(SP)-1→SP

2)中斷返回RETI;

(SP)→PC15-8,(SP)-1→SP

(SP)→PC7-0,(SP)-1→SP

NOP

;(PC)+1→PCPC加1,消耗一個(gè)機(jī)器周期外,沒有執(zhí)行任何操作。可用于程序的等待和短時(shí)間的延時(shí)。

ORG1000HLOOP:SETBP1.0LCALLDELAYCLRP1.0

LCALLDELAYSJMPLOOP例利用NOP指令產(chǎn)生方波。6.2.3.8.空操作指令DELAY:NOP;空操作

NOPNOPNOPRETEND6.2.4MCS-51匯編偽指令偽指令:解釋性指令、指示信息、協(xié)助編譯、不產(chǎn)生機(jī)器代碼。功能:定義符號、程

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論