第三章 MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設(shè)計_第1頁
第三章 MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設(shè)計_第2頁
第三章 MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設(shè)計_第3頁
第三章 MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設(shè)計_第4頁
第三章 MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設(shè)計_第5頁
已閱讀5頁,還剩108頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第3章MCS-51系列單片機的指令系統(tǒng)及匯編語言程序設(shè)計3.1尋址方式3.2指令系統(tǒng)3.3匯編語言程序設(shè)計3.4實用匯編語言程序設(shè)計3.1尋址方式3.1.1立即尋址3.1.2直接尋址3.1.3寄存器尋址3.1.4寄存器間接尋址3.1.5變址尋址3.1.6相對尋址3.1.7位尋址3.1尋址方式MCS-51的基本指令共111條,按指令所占的字節(jié)來分:(1)單字節(jié)指令49條,操作碼、操作數(shù)

同在一個字節(jié)中。(2)雙字節(jié)指令45條,操作碼+操作數(shù)(3)三字節(jié)指令17條,操作碼+操作數(shù)+操作數(shù)。按指令的執(zhí)行時間來分:(1)1個機器周期(12個時鐘振蕩周期)指令64條(2)2個機器周期(24個時鐘振蕩周期)指令45條(3)只有乘、除兩條指令的執(zhí)行時間為4個機器周期(48個時鐘振蕩周期)。指令格式

MCS-51匯編語言指令格式如下:[標號:]操作碼[操作數(shù)][;注釋]操作碼:規(guī)定指令進行什么操作

操作數(shù):指令操作的對象指令系統(tǒng)的尋址方式:

尋址方式就是在指令中說明操作數(shù)所在地址的方法。共7種尋址方式。

3.1.1立即尋址

操作數(shù)在指令中直接給出,需在操作數(shù)前面加前綴“#”。例如:

MOVR0,#58H

16位立即數(shù)的存放順序是高8位在前(低地址單元),低8位在后(高地址單元)。例如,

MOVDPTR,#1234H尋址范圍:程序存儲器3.1.2直接尋址操作數(shù)直接以單元地址的形式給出:尋址范圍:(1)內(nèi)部RAM的128個單元(2)特殊功能寄存器。除了以單元地址的形式外,還可用寄存器符號的形式給出。例如:MOVA,80H與MOVA,P0是等價的。例如:(1)、MOV81H,#40HMOVSP,#40H將立即數(shù)40H傳送給片內(nèi)RAM地址81H字節(jié)單元。(2)、MOVC,18H片內(nèi)RAM區(qū)23H單元的D0位內(nèi)容送給進位位C3.1.3寄存器尋址操作數(shù)在寄存器中寄存器包括A、B、C、DPTR和R0~R7。

例如,DECA;累加器A-1→AA、B既可以是寄存器尋址,也可以是直接尋址。累加器A寫做ACC時是直接尋址。B在乘除法指令中為寄存器尋址,在其他指令中為直接尋址。

尋址范圍:A、B、C、DPTR和R0~R7。3.1.4.寄存器間接尋址方式

寄存器中存放的是操作數(shù)的地址,在寄存器前加前綴標志“@”。訪問內(nèi)部RAM或外部RAM的低256個字節(jié)時,只能采用R0或R1作為間址寄存器。例如:

MOVA,@Ri;i=0或1

其中Ri中的內(nèi)容為40H,把內(nèi)部RAM40H單元內(nèi)容送A。尋址范圍:(1)訪問內(nèi)部RAM低128個單元,其通用形式為@Ri(2)對外部內(nèi)部RAM的64K字節(jié)的間接尋址,例如: MOVXA,@DPTR3.1.5變址尋址

本尋址方式是以DPTR或PC作基址寄存器,以累加器A作為變址寄存器,由DPTR或者PC中的內(nèi)容與累加器A內(nèi)容之和形成操作數(shù)在程序存儲器中的地址。例如:指令MOVCA,@A+DPTR

其中A的原有內(nèi)容為05H,DPTR的內(nèi)容為0400H,該指令執(zhí)行的結(jié)果是把程序存儲器0405H單元的內(nèi)容傳送給A。說明:(1)本尋址方式是專門針對程序存儲器的尋址方式,尋址范圍可達到64KB。(2)本尋址方式的指令只有3條:

MOVCA,@A+DPTR MOVCA,@A+PC JMP@A+DPTR3.1.6相對尋址

用于轉(zhuǎn)移指令中修改PC的值。在相對尋址的轉(zhuǎn)移指令中,操作數(shù)為轉(zhuǎn)移地址的位移量,,以“rel”表示,即把PC的當前值加上偏移量就構(gòu)成了程序轉(zhuǎn)移的目的地址:

目的地址=源地址+2(或者3)+相對偏移量

偏移量rel是一帶符號的8位二進制數(shù)補碼數(shù)。范圍是:–128-+127

說明:本尋址方式是專門針對程序存儲器的尋址方式,尋址范圍可達到64KB。3.1.7位尋址

對一個字節(jié)中的某一位單獨進行操作時這個操作數(shù)的地址稱為位地址,對位地址尋址簡稱位尋址??梢赃M行位尋址的區(qū)域有:尋址范圍包括:(1)內(nèi)部RAM中的位尋址區(qū)。(2)特殊功能寄存器中的可尋址位可尋址位在指令中有如下4種的表示方法:a.直接使用位地址。例如PSW.5的位地址為0D5H。b.位名稱的表示方法。例如:PSW.5是F0標志位,可使用F0表示該位。c.單元地址加位數(shù)的表示方法。例如:(0D0H).5。d.特殊功能寄存器符號加位數(shù)的表示方法。例如:PSW.5。1.下列各條指令其源操作數(shù)的尋址方式是什么?(1)MOV A,#48H;尋址方式:

立即數(shù)尋址

(2)ADD A,60H;尋址方式:直接尋址寄存器尋址

(3)ANL A,@R0;尋址方式:寄存器間接

2、MCS—51指令共有六種尋址方式,分別是立即數(shù)尋址、_________、_________、寄存器間接尋址、__________、相對尋址。3、片內(nèi)RAM可進行位尋址的空間位地址范圍是__20H-2FH____________。4、

指令是MCS-51指令系統(tǒng)中執(zhí)行時間最長且長達4us的。(A)比較轉(zhuǎn)移(B)循環(huán)轉(zhuǎn)移(C)增減量(D)乘除法5、8051單片機中既可位尋址又可字節(jié)尋址的單元是(

a)20H

b)30H

c)00H

d)70H

6、MOV

A,30H的源操作數(shù)為

尋址方式。7、MOVXA,@R0指令中,源操作數(shù)采用()尋址方式,指令作用在()區(qū)間。A.寄存器,外部數(shù)據(jù)存儲器B.直接,程序存儲器C.寄存器間接,內(nèi)部數(shù)據(jù)存儲器D.寄存器間接,外部數(shù)據(jù)存儲器8、JNZREL指令的尋址方式是()A.立即尋址B.寄存器尋址C.相對尋址

D.位尋址9、MOVXA,@DPTR指令中源操作數(shù)的尋址方式是()A.寄存器尋址B.寄存器間接尋址C.直接尋址D.立即尋址3.2MCS-51指令系統(tǒng)111條指令,按功能分類,可分為下面5大類:(1)數(shù)據(jù)傳送類(28條)(2)算術(shù)操作類(24條(3)邏輯運算類(25條)(4)控制轉(zhuǎn)移類(17條)(5)位操作類(17條)指令中符號的意義:Rn:當前工作寄存器區(qū)的8個工作寄存器R0~R7(n=0~7)。Ri:當前寄存器區(qū)中可作間接尋址寄存器的2個寄存器R0、R1(i=0,1)。Direct:直接地址,即8位的內(nèi)部RAM或特殊功能寄存器的地址。#data:包含在指令中的8位立即數(shù)。#data16:包含在指令中的16位立即數(shù)。Rel:相對轉(zhuǎn)移指令中的偏移量,為8位的帶符號補碼數(shù)。DPTR數(shù)據(jù)指針,可用作16位的數(shù)據(jù)地址寄存器。bit內(nèi)部RAM或特殊功能寄存器中的直接尋址位。C(或Cy)進位標志位或位處理機中的累加器。addr11

11位目的地址addr16

16位目的地址@

間接尋址寄存器前綴,如@Ri,@A+DPTR(X)

X中的內(nèi)容。((X))由X尋址的單元中的內(nèi)容?!^右邊的內(nèi)容被箭頭左邊的內(nèi)容所取代。3.4.1數(shù)據(jù)傳送類指令

使用最頻繁的一類指令,屬“復制”性質(zhì),而不是“搬家”數(shù)據(jù)傳送類指令不影響標志位:Cy、Ac和OV,影響奇偶標志位P。數(shù)據(jù)傳送示意圖1、內(nèi)部數(shù)據(jù)傳送指令

源操作數(shù)和目的操作數(shù)都在單片機內(nèi)部的RAM中1).以累加器為目的操作數(shù)的指令

MOVA,Rn;(Rn)→A,n=0~7 MOVA,@Ri;((Ri))→A,i=0,1 MOVA,direct;(direct)→A MOVA,#data;#data→A例如:

MOVA,R6;(R6)→A,寄存器尋址 MOVA,70H;(70H)→A,直接尋址 MOVA,@R0;((R0))→A,間接尋址 MOVA,#78H;78H→A,立即尋址2).以Rn為目的操作數(shù)的指令

MOVRn,A;(A)→Rn,n=0~7 MOVRn,direct;(direct)→Rn,n=0~7MOVRn,#dat;#data→Rn,n=0~7功能:是把源操作數(shù)的內(nèi)容送入當前一組工作寄存器區(qū)的R0~R7中的某一個寄存器。3).以直接地址direct為目的操作數(shù)的指令

MOVdirect,A;(A)→directMOVdirect,Rn;(Rn)→direct,n=0~7MOVdirect1,direct2; MOVdirect,@Ri;((Ri))→direct MOVdirect,#data;#data→direct功能:把源操作數(shù)送入直接地址指出的存儲單元。direct指的是內(nèi)部RAM或SFR的地址。4).以寄存器間接地址為目的操作數(shù)的指令

MOV@Ri,A;(A)→((Ri)),i=0,1MOV@Ri,direct;(direct)→((Ri))MOV@Ri,#data;#data→((Ri))5).16位數(shù)傳送指令

MOVDPTR,#data16;#data16→DPTR唯一的16位數(shù)據(jù)的傳送指令,立即數(shù)的高8位送入DPH,立即數(shù)的低8位送入DPL。2、外部數(shù)據(jù)傳送指令用于訪問片外64K的RAM(包括片外IO接口芯片)MOVX指令執(zhí)行的時候會使RD或者WR有效

MOVXA,@DPTR

;((DPTR))→A,讀外部RAM/IO

MOVXA,@Ri

;((Ri))→A,讀外部RAM/IO

MOVX@DPTR,A;(A)→((DPTR)),寫外部RAM/IO

MOVX@Ri,A

;(A)→((Ri)),寫外部RAM/IO功能:讀外部RAM存儲器或I/O中的一個字節(jié),或把A中一個字節(jié)的數(shù)據(jù)寫到外部RAM存儲器或I/O中。

注意:RD*或WR*信號有效。采用DPTR間接尋址,高8位地址(DPH)由P2口輸出,低8位地址(DPL)由P0口輸出。采用Ri(i=0,1)間接尋址,可尋址片外RAM的256個單元。Ri內(nèi)容由P0口輸出。MOV后“X”表示單片機訪問的是片外RAM存儲器或I/O。3、程序存儲器數(shù)據(jù)傳送指令共兩條,用于讀程序存儲器中的特殊數(shù)據(jù)指令,均采用基址寄存器加變址寄存器間接尋址方式。

(1)MOVCA,@A+PC以PC作基址寄存器,A的內(nèi)容作為無符號整數(shù)和PC中的內(nèi)容(下一條指令的起始地址)相加后得到一個16位的地址,該地址指出的程序存儲單元的內(nèi)容送到累加器A。

注意:PSEN*信號有效。例如:(A)=30H,執(zhí)行地址1000H處的指令1000H:MOVCA,@A+PC本指令占用一個字節(jié),執(zhí)行結(jié)果將程序存儲器中1031H的內(nèi)容送入A。(2)MOVCA,@A+DPTR以DPTR作為基址寄存器,A的內(nèi)容作為無符號數(shù)和DPTR的內(nèi)容相加得到一個16位的地址,把由該地址指出的程序存儲器單元的內(nèi)容送到累加器A.例如:(DPTR)=8100H(A)=40H執(zhí)行指令

MOVCA,@A+DPTR本指令的執(zhí)行結(jié)果只和指針DPTR及累加器A的內(nèi)容有關(guān),與該指令存放的地址及常數(shù)表格存放的地址無關(guān),

1.當需要從MCS-51單片機程序存儲器取數(shù)據(jù)時,采用的指令為()。

A)MOV

A,

@R1

B)MOVC

A,

@A

+

DPTR

C)MOVX

A,

@

R0

D)MOVX

A,

@

DPTR

2.MOVXA,@R0指令中,源操作數(shù)采用()尋址方式,指令作用在()區(qū)間。(A)寄存器,外部數(shù)據(jù)存儲器(B)直接,程序存儲器(C)寄存器間接,內(nèi)部數(shù)據(jù)存儲器(D)寄存器間接,外部數(shù)據(jù)存儲器3.8031單片機中,將累加器A中的數(shù)送入外RAM的40H單元,可執(zhí)行的指令()。(A)MOVR1,40H(B)MOVR1,#40HMOVX@R1,AMOVXR1,A(C)MOVX40H,A(D)MOVR1,#40HMOVX@R1,A4、以給出的指令操作碼為依據(jù),請判斷MCS—5l單片機的下列各條指令的書寫格式是否有錯誤,如有請說明錯誤原因。

(1).MOVA,@R7

(2).MOVA,#3000H

(3).MOVX@R0,B

(4).MOVA,30H (5).MOVXA,30H

5、使用簡單指令序列完成以下操作(1).將20H單元清零

mov20H,#00H(2).請將ROM3000H單元內(nèi)容送R7movA,#00HmovDPTR,#3000HmovcA,@A+DPTRmovR7,A(3)、已知某端口地址為2FFFH,將片內(nèi)RAM20H的內(nèi)容寫到該端口中。movA,20HMOVDPTR,#2FFFHMOVX@DPTR,A4.數(shù)據(jù)交換指令

用于累加器A和內(nèi)部RAM單元之間的字節(jié)交換及半字節(jié)交換,或者完成累加器A自身的半字節(jié)交換。

1)字節(jié)交換

XCHA,Rn XCHA,direct XCHA,@Ri例如:(A)=80H,(R7)=08H,(40H)=F0H,(R0)=30H,(30H)=OFH執(zhí)行下列指令:

XCHA,R7;(A)與(R7)互換XCHA,40H;(A)與(40H)互換XCHA,@R0;(A)與((R0))互換結(jié)果:(A)=0FH,(R7)=80H,(40H)=08H,(30H)=F0H2).半字節(jié)交換指令

XCHDA,@Ri累加器的低4位與內(nèi)部RAM低4位交換。例如:(R0)=60H,(60H)=3EH,(A)=59H執(zhí)行完XCHDA,@R0指令,則(A)=5EH,(60H)=39H。3).累加器半字節(jié)自身交換指令

SWAPA將累加器A的高半字節(jié)(Acc.7~Acc.4)和低半字節(jié)(Acc.3~Acc.0)互換。

例(A)=0C5H,執(zhí)行指令:

SWAPA

結(jié)果:(A)=5CH5.堆棧操作指令MCS-51內(nèi)部RAM中可以設(shè)定一個后進先出(LIFO-LastInFirstOut)的區(qū)域稱作堆棧.堆棧指針SP指出堆棧的棧頂位置。(1)進棧指令

PUSHdirect先將棧指針SP加1,然后把direct中的內(nèi)容送到棧指針SP指示的內(nèi)部RAM單元中。

例如:當(SP)=60H,(A)=30H,(B)=70H時,執(zhí)行:

PUSHACC

(SP)+1=61H→SP,(A)→61H

PUSHB

;(SP)+1=62H→SP,(B)→62H結(jié)果:(61H)=30H,(62H)=70H,(SP)=62H(2)出棧指令

POPdirectSP指示的棧頂(內(nèi)部RAM單元)內(nèi)容送入direct字節(jié)單元中,棧指針SP減1。例如:當(SP)=62H,(62H)=70H,(61H)=30H,執(zhí)行:POPDPH;((SP))→DPH,(SP)-1→SPPOPDPL;((SP))→DPL,(SP)-1→SP

結(jié)果:(DPTR)=7030H,(SP)=60H3.2.2運算和移位操作類指令

一、算數(shù)運算指令1.加法指令

1)不帶進位的加法指令

共有4條加法運算指令:ADDA,Rn;(A)+(Rn)→A,n=0~7ADDA,direct;(A)+(direct)→AADDA,@Ri;(A)+((Ri))→A,i=0,1ADDA,#data;(A)+data→A一個加數(shù)總是來自累加器A,而另一個加數(shù)可由不同的尋址方式得到。結(jié)果總是放在A中。使用加法指令時,要注意累加器A中的運算結(jié)果對各個標志位的影響:(1)如果位7有進位,則置“1”進位標志Cy,否則清“0”Cy(2)如果位3有進位,置“1”輔助進位標志Ac,否則清“0”Ac(Ac為PSW寄存器中的一位)(3)如果位6有進位,而位7沒有進位,或者位7有進位,而位6沒有,則溢出標志位OV置“1”,否則清“0”O(jiān)V。溢出標志位OV的狀態(tài),只有在帶符號數(shù)加法運算時才有意義。當兩個帶符號數(shù)相加時,OV=1,表示加法運算超出了累加器A所能表示的帶符號數(shù)的有效范圍。

例(A)=53H,(R0)=FCH,執(zhí)行指令

ADDA,R0結(jié)果:(A)=4FH,Cy=1,Ac=0,OV=0,P=1注意:上面的運算中,由于位6和位7同時有進位,所以標志位OV=0。例(A)=85H,(R0)=20H,(20H)=AFH,執(zhí)行指令:

ADDA,@R0

結(jié)果:(A)=34H,Cy=1,Ac=1,OV=1,P=1注意:由于位7有進位,而位6無進位,所以標志位OV=1

2).帶進位加法指令標志位Cy參加運算,因此是三個數(shù)相加。共4條:ADDC A,Rn;(A)+(Rn)+C→A,n=0~7ADDC A,direct;(A)+(direct)+C→AADDC A,@Ri;(A)+(Ri)+C→A,i=0,1ADDC A,#data;(A)+#data+C→A

例:(A)=85H,(20H)=FFH,Cy=1,執(zhí)行指令:

ADDCA,20H結(jié)果為:(A)=85H,Cy=1,Ac=1,OV=0,P=1(A中1的位數(shù)為奇數(shù))3).增1指令

5條增1指令: INCA INCRn;n=0~7 INCdirect INC@Ri;i=0,1 INCDPTR不影響PSW中的任何標志。

第5條指令I(lǐng)NCDPTR,是16位數(shù)增1指令。指令首先對低8位指針DPL的內(nèi)容執(zhí)行加1的操作,當產(chǎn)生溢出時,就對DPH的內(nèi)容進行加1操作,并不影響標志Cy的狀態(tài)。2、減法指令

1)帶借位減法4條指令:SUBBA,Rn;(A)-(Rn)-Cy→A,n=0~7SUBBA,direct;(A)-(direct)-Cy→ASUBBA,@Ri;(A)-((Ri))-Cy→A,i=0,1SUBBA,#data;(A)-#data-Cy→A

從累加器A中的內(nèi)容減去指定的變量和進位標志Cy的值,結(jié)果存在累加器A中。如果位7需借位則置“1”Cy,否則清“0”Cy;如果位3需借位則置“1”Ac,否則清“0”Ac;如果位6需借位而位7不需要借位,或者位7需借位,位6不需借位,則置“1”溢出標志位OV,否則清“0”O(jiān)V。例(A)=C9H,(R2)=54H,Cy=1,執(zhí)行指令:

SUBBA,R2

結(jié)果:(A)=74H,Cy=0,Ac=0,OV=1(位6向位7借位)

2).減1指令4條指令: DECA ;(A)-1→A DECRn ;(Rn)-1→Rn,n=0~7 DECdirect ;(direct)-1→direct DEC@Ri ;((Ri))-1→(Ri),i=0,1減1指令不影響標志位。3.乘法指令

MULAB;A×B→BA

完成兩個8位無符號整數(shù)的乘法運算。結(jié)果的高8位存放在B中,低8位存放在A中。如果積大于255,則置“1”溢出標志位OV

4.除法指令

DIVAB;A/B→A(商),余數(shù)→B如果B的內(nèi)容為“0”(即除數(shù)為“0”),則存放結(jié)果的A、B中的內(nèi)容不定,并置“1”溢出標志位OV。5.十進制調(diào)整指令用于對BCD碼十進制數(shù)加法運算結(jié)果的內(nèi)容修正。

指令格式:DAA兩個BCD碼按二進制相加之后,必須經(jīng)本指令的調(diào)整才能得到正確的壓縮BCD碼的和數(shù)。二進制數(shù)的加法運算原則并不能適用于十進制數(shù)的加法運算,有時會產(chǎn)生錯誤結(jié)果。例如:(a)3+6=90011+0101=1001運算結(jié)果正確(b)7+8=150111+1000=1111運算結(jié)果不正確(c)9+8=171001+1000=00001C=1結(jié)果不正確二進制數(shù)加法指令不能完全適用于BCD碼十進制數(shù)的加法運算,對結(jié)果作有條件的修正——十進制調(diào)整修正方法應是:(a)累加器低4位大于9或輔助進位位Ac=1,則進行低4位加6修正。(b)累加器高4位大于9或進位位Cy=1,則進行高4位加6修正。(c)累加器高4位為9,低4位大于9,則高4位和低4位分別加6修正。具體是通過執(zhí)行指令:DAA

來自動實現(xiàn)的。例(A)=56H,(R5)=67H,把它們看作為兩個壓縮的BCD數(shù),進行BCD數(shù)的加法。執(zhí)行指令:

ADDA,R5DAA由于高、低4位分別大于9,所以要分別加6進行十進制調(diào)整對結(jié)果進行修正。結(jié)果為:(A)=23H,Cy=1可見,56+67=123,結(jié)果是正確的。1、.下列程序段執(zhí)行后,(R0)=_______,(7EH)=____,(7FH)=_______。MOVR0,#7EH

MOV7EH,#0FFHMOV7FH,#40H1NC@R01NCR01NC@R02、假定(SP)=40H,

(39H)=30H,(40H)=60H。執(zhí)行下列指令:POP

DPHPOP

DPL后,DPTR的內(nèi)容為

,SP的內(nèi)容是

。3.下列各條指令其源操作數(shù)的尋址方式是什么?各條指令單獨執(zhí)行后,A中的結(jié)果是什么?)設(shè)(60H)=35H,(A)=19H,(R0)=30H,(30H)=0FH。(1)MOV A,#48H ;尋址方式:,(A)=

(2)ADD A,60H ;尋址方式:,(A)=4、閱讀下列程序段,寫出每條指令執(zhí)行后的結(jié)果,并說明此程序段完成什么功能?MOV R1,#30H(R1)=

MOV A,#64H;(A)=

ADD A,#47H;(A)=

,(CY)=

,(AC)=

DA A;(A)=

,(CY)=

,(AC)=

MOV @R1,A;(R1)=

,(30H)=

此程序段完成的功能:5、把DPTR的內(nèi)容壓入堆棧6.執(zhí)行下面一段程序;

MOVSP,#60HMOVA,#10HMOVB,#01HPUSHA

PUSHBPOPAPOPBA,B的內(nèi)容是:(A)=(B)=7.若(A)=50H,(B)=A0H,執(zhí)行MULAB后,(A)=

(B)=

(CY)=

(OV)=8、.(R0)=4BH,(A)=84H,片內(nèi)RAM(4BH)=7FH,(40)=20HMOVA,@R0MOV@R0,40HMOV40H,AMOVR0,#35H問執(zhí)行程序后,R0=A=4BH=40H=9、.若PSW=00,執(zhí)行下列程序后,PSW的各位狀態(tài)如何?MOVA,#0FBHMOVPSW,#10HADDA,#7FH二、邏輯運算指令1.邏輯與指令 ANLA,Rn;(A)∧(Rn)→A,n=0~7 ANLA,direct;(A)∧(direct)→A ANLA,#data;(A)∧#data→AANLA,@Ri;(A)∧((Ri))→A,i=0~1 ANLdirect,A;(direct)∧(A)→direct ANL direct,#data;(direct)∧#data→direct

例(A)=07H,(R0)=0FDH,執(zhí)行指令:

ANLA,R0結(jié)果:(A)=05H2.邏輯或指令 ORLA,Rn;(A)∨(Rn)→A,n=0~7 ORLA,direct;(A)∨(direct)→A ORLA,#data;(A)∨data→A ORLA,@Ri;(A)∨((Ri))→A,i=0,1 ORLdirect,A;(direct)∨(A)→direct ORLdirect,#data;(direct)∨#data→direct

例(P1)=05H,(A)=33H,執(zhí)行指令

ORLP1,A 結(jié)果:(P1)=37H3.邏輯異或指令

XRLA,Rn;(A)⊕(Rn)→A XRLA,direct;(A)⊕(direct)→A XRLA,@Ri;(A)⊕((Ri))→A,i=0,1 XRLA,#data;(A)⊕#data→A XRLdirect,A;(direct)⊕(A)→direct XRLdirect,#data;(direct)⊕#data→direct

例(A)=90H,(R3)=73H執(zhí)行指令:

XRLA,R3結(jié)果:(A)=E3H

4.累加器清零

CLRA功能:累加器A清“0”。不影響Cy、Ac、OV等標志。5.累加器取反CPLA功能:累加器A的內(nèi)容按位邏輯取反,不影響標志。6.移位指令左環(huán)移指令

RLA

功能:累加器A的8位向左循環(huán)移位,位7循環(huán)移入位0,不影響標志。帶進位左環(huán)移指令:RLCA

功能:將累加器A的內(nèi)容和進位標志位Cy一起向左環(huán)移一位,Acc.7移入進位位Cy,Cy移入Acc.0,不影響其它標志。右環(huán)移指令:RRA

功能:累加器A的內(nèi)容向右環(huán)移一位,Acc.0移入Acc.7,不影響其它標志。帶進位右環(huán)移指令:RRCA功能:累加器A的內(nèi)容和進位標志Cy一起向右環(huán)移一位,Acc.0進入Cy,Cy移入Acc.7。1.執(zhí)行下列程序段后,(P1)=_______。MOVP1,#5DHCPLP1.1CPLP1.2CLRP1.6SETBP1.72.執(zhí)行下列程序段后,(A)=_______,(CY)=____。MOVA,#C5HRLA3、設(shè)(A)=38H,R0=28H,(28H)=18H,執(zhí)行下列程序后,(A)=()ORLA,#27HANLA,28HXCHDA,@R0CPLA4.閱讀下列程序,說明其功能。MOVR0,#dataMOVA,@R0RLAMOVR1,ARLARLAADDA,R1MOV@R0,ARET5、已知(R0)=20H,(20H)=10H,(P0)=30H,(R2)=20H,執(zhí)行如下程序段后(40H)=MOV@R0,#11HMOVA,R2ADDA,20HMOVPSW,#80HSUBBA,P0XRLA,#45HMOV40H,A6、若執(zhí)行XRLP2,#

后,可對P2口的低四位取反。7、執(zhí)行ORP1,#

后,可對P1口的高四位置1。3.2.3控制轉(zhuǎn)移類指令

1.無條件轉(zhuǎn)移指令

LJMPaddr16;adder16-PCAJMPaddrll;addr11-PC;SJMPrel;PC+2+rel-PCJMP@A+DPTR;A+DPTR-PC;LJMP:長轉(zhuǎn)移指令,轉(zhuǎn)移范圍64KB。AJMP:2K字節(jié)范圍內(nèi)的無條件跳轉(zhuǎn)指令,64K程序存儲器空間分為32個區(qū),每區(qū)2K字節(jié),轉(zhuǎn)移的目標地址必須與AJMP下一條指令的地址的高5位地址碼A15-A11相同。執(zhí)行指令時,先PC加2,然后把addrll送入PC.10~PC.0,PC.15~PC.11保持不變,程序轉(zhuǎn)移到目標地址。本指令是為能與MCS-48的JMP指令兼容而設(shè)的。SJMP:實現(xiàn)的程序轉(zhuǎn)移是雙向的。在編寫程序時,直接寫上要轉(zhuǎn)向的目標地址標號就可以。例如:

LOOP: MOVA,R6

SJMPLOOP ┇程序在匯編時,由匯編程序自動計算和填入偏移量。JMP@A+DPTR:間接跳轉(zhuǎn)指令由A中8位無符號數(shù)與DPTR的16位數(shù)內(nèi)容之和來確定。以DPTR內(nèi)容作為基址,A的內(nèi)容作變址。給A賦予不同的值,即可實現(xiàn)程序的多分支轉(zhuǎn)移。2.條件轉(zhuǎn)移指令

1)累加器判別轉(zhuǎn)移指令

JZrel ;如果累加器為“0”,則轉(zhuǎn)移 JNZrel ;如果累加器非“0”,則轉(zhuǎn)移2).比較不相等轉(zhuǎn)移指令 CJNEA,direct,rel CJNEA,#data,rel CJNERn,#data,rel CJNE@Ri,#data,rel比較前面兩個操作數(shù)的大小,如果它們的值不相等則轉(zhuǎn)移。如果第一操作數(shù)(無符號整數(shù))小于第二操作數(shù)(無符號整數(shù)),則置進位標志位Cy,否則清“0”Cy。3).減1不為0轉(zhuǎn)移指令這是一組把減1與條件轉(zhuǎn)移兩種功能結(jié)合在一起的指令。共兩條指令: DJNZRn,rel ;n=0~7 DJNZdirect,rel將源操作數(shù)(Rn或direct)減1,結(jié)果回送到Rn寄存器或direct中去。如果結(jié)果不為0則轉(zhuǎn)移。允許程序員把寄存器Rn或內(nèi)部RAM的direct單元用作程序循環(huán)計數(shù)器。主要用于控制程序循環(huán)。以減1后是否為“0”作為轉(zhuǎn)移條件,即可實現(xiàn)按次數(shù)控制循環(huán)。3.調(diào)用子程序指令(1).短調(diào)用指令:ACALLaddrll與AJMP指令相類似,是為了與MCS-48中的CALL指令兼容而設(shè)的。(2).長調(diào)用指令:LCALLaddr16(3).子程序的返回指令:RET執(zhí)行本指令時: (SP)→PCH,然后(SP)-1→SP (SP)→PCL,然后(SP)-1→SP功能:從堆棧中退出PC的高8位和低8位字節(jié),把棧指針減2,從PC值開始繼續(xù)執(zhí)行程序。(4).中斷返回指令

RETI功能:與RET指令相似,兩指令不同之處,是本指令執(zhí)行的同時要清除對應的中斷優(yōu)先級狀態(tài)位,恢復中斷邏輯。4.空操作指令

NOP3.2.4位操作指令

1.數(shù)據(jù)位傳送指令

MOVC,bit MOVbit,C例

MOVC,06H;(20H).6→Cy 06H是內(nèi)部RAM20H字節(jié)位6的位地址。

MOVP1.0,C;Cy→P1.02.位清零指令 CLRC ;清“0”Cy CLRbit ;清“0”bit位3.位置1指令

SETBC ;置“1”Cy SETBbit ;置“1”bit位4.位取反指令

CPLC ;Cy求反CPLbit ;bit位求反5.位邏輯指令(1)與指令

ANLC,bit ;bit∧Cy→Cy ANLC,/bit; ;/bit∧Cy→Cy

(2)或指令 ORLC,bit ORLC,/bit6.位控制轉(zhuǎn)移類指令

JCrel ;如果進位位Cy=1,則轉(zhuǎn)移 JNCrel ;如果進位位Cy=0,則轉(zhuǎn)移 JBbit,rel ;如果直接尋址位=1,則轉(zhuǎn)移 JNBbit,rel ;如果直接尋址位=0,則轉(zhuǎn)移 JBCbit,rel ;如果直接尋址位=1則轉(zhuǎn)移,并清0直接尋址位1.以下哪一條是位操作指令()。A、MOVP0,#0FFHB、CLRP1.0C、CPLAD、POPPSW2.已知(SP)=60H,子程序SUBTRN的首地址為0345H,現(xiàn)執(zhí)行位于0123H的ACALLSUBTRN雙字節(jié)指令后,(PC)=___,(61H)=_______,(62H)=____。3.3匯編語言程序設(shè)計3.3.1匯編語言程序設(shè)計步驟3.3.2匯編語言程序設(shè)計方法

3.3匯編語言程序設(shè)計3.3.1匯編語言程序設(shè)計步驟單片機應用程序的設(shè)計通??梢苑殖梢韵?步:(1)程序設(shè)計準備階段(2)程序流程圖繪制階段(3)源程序的編輯階段(4)程序的匯編階段(5)程序的調(diào)試階段3.3.2匯編語言的構(gòu)成兩種基本類型:指令語句和偽指令語句(1)指令語句已在第3章介紹每一條指令語句在匯編時都產(chǎn)生一個指令代碼——機器代碼(2)偽指令語句

是為匯編服務的。在匯編時沒有機器代碼與之對應。3.3.3常用的偽指令

1.ORG(ORiGin)匯編起始地址命令

格式:ORG16位地址或標號

在匯編語言源程序的開始,通常都用一條ORG偽指令來實現(xiàn)規(guī)定程序的起始地址。如不用ORG規(guī)定,則匯編得到的目標程序?qū)?000H開始。例如:例:ORG偽指令使用方法說明:單元地址機器碼(H)標號指令助記符;注釋DB “MCS”DB “51”4D43533531

7850 EC 26 FB1000H1003H2000H2002H2003H2004HORG 1000HORG 2000HStart: MOV R0,#50H MOV A,R4 ADD A,@R0 MOV R3,A

在一個源程序中,可多次使用ORG指令,來規(guī)定不同的程序段的起始地址。但是,地址必須由小到大排列,地址不能交叉、重疊。例如:

ORG2000H ┇ORG2500H ┇

ORG3000H ┇

2.END(ENDofassembly)

匯編終止命令匯編語言源程序的結(jié)束標志,用于終止源程序的匯編工作。在整個源程序中只能有一條END命令,且位于程序的最后。3.DB(DefineByte)

定義字節(jié)命令格式:[標號:]DB字節(jié)型數(shù)表DB功能是從標號指定單元開始定義(存儲)若干個字節(jié),ORG2000HDB30H,40H,24,“C”,“B”匯編后: (2000H)=30H (2001H)=40H (2002H)=18H(10進制數(shù)24) (2003H)=43H(字符“C”的ASCII碼) (2004H)=42H(字符“B”的ASCII碼)10進制數(shù)自然轉(zhuǎn)換成16進制數(shù),字母按ASCII碼存儲。4.DW(DefineWord)

定義數(shù)據(jù)字命令格式:[標號:]DW字型數(shù)表從標號指定的地址開始,在程序存儲器的連續(xù)單元中定義16位的數(shù)據(jù)字。例如:

ORG2000H

DW1246H,7BH,10匯編后:(2000H)=12H;(2001H)=46H;第1個字(2002H)=00H;(2003H)=7BH;第2個字(2004H)=00H;(2005H)=0AH;第3個字5.DS

定義存儲空間命令[標號:]DS表達式從指定的地址開始,預留若干字節(jié)的存儲單元已備源程序執(zhí)行過程中使用。6.EQU(EQUate)

賦值命令字符名稱EQU數(shù)據(jù)或匯編符號用于給標號賦值。賦值以后,其標號值在整個程序有效。

例如:TESTEQU2000H

表示標號TEST=2000H,在匯編時,凡是遇到標號TEST時,均以2000H來代替。7、DATA(賦值)偽指令:格式:字符名DATA表達式功能:將右邊“表達式”的值賦給左邊的“字符名”注意:這里的表達式允許是一個數(shù)據(jù)或地址,也可以是包含被定義的“字符名”在內(nèi)的表達式,但不能是匯編符號,如R0~R7等DATA偽指令與EQU偽指令的區(qū)別:EQU定義的字符名必須“先定義后使用”,而DATA定義的“字符名”沒有這種限制DATA偽指令可放在程序的任何位置,比EQU偽指令靈活

8、BIT(位地址賦值)偽指令:格式:字符名BIT位地址功能:將位地址賦予BIT前面的字符名,經(jīng)賦值后可用該字符名代替BIT后面的位地址注意:被定義后,“字符名”是一個符號位地址有些匯編程序不允許使用BIT偽指令,用戶只能用EQU偽指令定義位地址變量,但是用這種方式定義時,EQU語句右邊只能是實際的物理地址,而不能使符號位地址

如: K1BIT20H KKBITK1 X2EQU6DH X2EQUK1√×

3.3.2匯編語言程序設(shè)計方法順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu),再加上廣泛使用的子程序和中斷服務子程序。1.順序結(jié)構(gòu)2.分支結(jié)構(gòu)程序中含有轉(zhuǎn)移指令,無條件分支,有條件分支。有條件分支又分為:單分支結(jié)構(gòu)和多分支結(jié)構(gòu)。3.循環(huán)結(jié)構(gòu)4.子程序5.中斷服務子程序分支程序設(shè)計(1)簡單分支程序簡單分支程序是分支程序中最簡單、最基本的一種,其結(jié)構(gòu)如下圖所示。例:設(shè)在內(nèi)部RAM的SORC開始連續(xù)兩個單元中有一個雙字節(jié)數(shù),編寫程序?qū)⑵淙⊙a后存入RESULT開始的兩個連續(xù)單元。參考程序如下:B16NEG:MOVR0,#SORC+1 MOVR1,#RESULT+1MOVA,@R0CPLAINCAMOV@R1,ADECR0DECR1

溫馨提示

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

評論

0/150

提交評論