單片機(jī)第3章教材_第1頁
單片機(jī)第3章教材_第2頁
單片機(jī)第3章教材_第3頁
單片機(jī)第3章教材_第4頁
單片機(jī)第3章教材_第5頁
已閱讀5頁,還剩126頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第三章MCS-51單片機(jī)指令系統(tǒng)

指令系統(tǒng)概述

MCS-51指令的尋址方式

MCS-51指令系統(tǒng)介紹3.1指令系統(tǒng)概述指令——計(jì)算機(jī)能夠識別和執(zhí)行的命令。指令系統(tǒng)——指令的集合或全體,因機(jī)器而異。指令的三種表示形式

二進(jìn)制形式——直接為CPU執(zhí)行

16進(jìn)制形式——閱讀和書寫

匯編形式——編寫程序。二進(jìn)制形式16進(jìn)制形式匯編形式011101000000101000100100000001001000000011111110740AH2404H80FEHMOVA,#0AHADDA,#04HSJMP$MCS-51指令系統(tǒng)51系列單片機(jī)指令集含有111條指令 按指令所占字節(jié)數(shù)分類:

單字節(jié)(49條);雙字節(jié)(46條);3字節(jié)(16條) 按指令執(zhí)行時(shí)間分類:

單周期(64條);雙周期(45條);4周期(2條) 按指令的功能分類:

數(shù)據(jù)傳送類(29條);算術(shù)運(yùn)算類(24條);

邏輯運(yùn)算及移位類(24);控制轉(zhuǎn)移類(17條);

位操作類(17條)3.1.1

指令格式標(biāo)號又稱為指令地址符號,以字母開頭字母/數(shù)字串。如:START、LOOP、NEXT、MAIN[標(biāo)號]:操作碼[操作數(shù)];[注釋]操作碼用MCS-51單片機(jī)所規(guī)定的助記符來表示,它指示CPU作何種操作。如:MOV、ADD等。操作數(shù)分為目的操作數(shù)和源操作數(shù)。注釋是對該指令作用或功能的說明,以便于閱讀。注釋部分前一定要用分號“;”隔開。

ADDA,#0AH;A=A+10指令機(jī)器碼:25H0AHMCS-51指令符號意義的說明Rn——

R0~R7中的一個(gè)#data——

8位立即數(shù)#data16——

16位立即數(shù)direct——

8位直接地址@Ri——

R0或R1,可以間接尋址@DPTR——

可按DPTR中地址對外部存儲器尋址bit——

8位位地址addr11——

11位目標(biāo)地址addr16——

16位目標(biāo)地址rel——

8位地址偏移量$——

當(dāng)前指令的地址3.2MCS-51尋址方式

1寄存器尋址2立即尋址3直接尋址4寄存器間接尋址5相對尋址6變址尋址7位尋址尋址:如何在單片機(jī)的存儲空間內(nèi)取得操作數(shù),即找到存儲操作數(shù)的地址。

內(nèi)部ROM、RAM(低128地址單元、

SFR)、外部ROM、RAM1寄存器尋址

操作數(shù)在寄存器中。寄存器可為:R0~R7,由RS0、RS1兩位的值選定工作寄存器區(qū)部分特殊功能寄存器:A、B、CY(位),DPTR

特點(diǎn):指令碼中含有操作數(shù)地址所在的寄存器號,根據(jù) 該寄存器號可以找到操作數(shù)。例如:

MOVA,R3;A←(R3)

ANLA,#30HMOVR0,30H例如:

R0A結(jié)果A=35H35HFFE080用戶RAM區(qū)位尋址區(qū)通用寄存器區(qū)7F30200035HMOVA,R0

2

直接尋址指令直接給出操作數(shù)所在存儲單元的地址,它緊跟在操作碼后。 此方式是訪問專用寄存器的唯一方式(80H~FFH) 也可訪問內(nèi)部RAM的低128(8052的256)字節(jié)

特點(diǎn):指令碼中含有操作數(shù)地址,機(jī)器根據(jù)該地址尋找 操作數(shù)。例如:

MOVA,30H;A←(30H)

ANL30H,#30H;(30H)←(30H)∧#30HMOV50H,30H;(50H)←((30H))功能:

將片內(nèi)RAM56H單元中的內(nèi)容34H送到累加器A中。如左圖例:MOVA,56H;A(56H)機(jī)器碼:E556片內(nèi)RAM34H

34H累加器A56H

圖3.1指令傳遞

指令碼中直接含有所需的操作數(shù),操作數(shù)前加“#”符號為前綴。以區(qū)別直接尋址。

指令碼中含有操作數(shù)本身3立即尋址

特點(diǎn)

指令直接給出一個(gè)操作數(shù),它緊跟在操作碼后,通常稱它為立即數(shù)(8位或16位)。

例如:

MOVA,#30H;A←#30HMOVDPTR,#8000H;DPTR←#8000H4寄存器間接尋址指令所選中的寄存器內(nèi)容是實(shí)際操作數(shù)地址(而不是操作數(shù))尋址范圍:內(nèi)部RAM(00H-7FH/FFH)使用寄存器R0,R1,SP外部數(shù)據(jù)存儲器(0000H-FFFFH)特點(diǎn):操作數(shù)所指定的寄存器中存放的不是操作數(shù)本身,而是操作數(shù)的地址。注意:@是它區(qū)別寄存器尋址的標(biāo)志。例如:

MOVA,@R0;A←((R0))MOVXA,@DPTR;A←((DPTR))MOV@R0,#30HMOV@R0,30H(1)R0,R1可間址內(nèi)部RAM00~7FH共128B

單元內(nèi)容,不能尋址特殊功能寄存器。

MOVA,@R0 MOVA,@R1說明(2)DPTR尋址外部數(shù)據(jù)存儲器的64KB

空間

MOVXA,@DPTR;A(DPTR)

MOVX@DPTR,A;(DPTR)A(3)R0,R1可尋址外部RAM00~FFH共

256B單元內(nèi)容。

MOVXA,@R0 MOVXA,@R1說明

5變址尋址

(基址寄存器+變址寄存器間接尋址)為了訪問程序存儲器中的數(shù)據(jù)表格。

特點(diǎn):操作數(shù)=基地址+地址偏移量指令碼內(nèi)隱含存放基地址的寄存器(DPTR/PC)號

DPTR/PC中的基地址常常是表格的起始地址,累加器中存放偏移量rel。例如:(1)MOVC

A,@A+PC

;A←(A+PC)

(2)MOVC

A,@A+DPTR;A←(A+DPTR)

(3)JMP@A+DPTRE0A程序存儲區(qū)2040H9320E0H472041H……

…DPH20DPL00ALU如:MOVCA,@A+DPTR設(shè)DPTR=2000H,A=E0H20E0H47指令代碼

6位尋址

以訪問觸發(fā)器的方式對內(nèi)部RAM、特殊功能寄存器SFR中的位地址空間進(jìn)行訪問稱之為位尋址。可被尋址的位:

片內(nèi)RAM的20H~2FH單元,位地址00H~7FH;

SFR中11個(gè)能被8整除的字節(jié)地址,位地址80H以上。特點(diǎn):操作數(shù)是8位二進(jìn)制數(shù)中的某位指令碼中含有位地址位地址用bit表示例如:

MOVC,00H;(C)←(00H)ANLC,90H;(C)←(C)∧((90H))MOV30H,C

;

30H是位尋址位地址

MOVA,30H

;30H是直接尋址的字節(jié)地址

MOV

C,ACC.7

;Cy←ACC.7

由上面指令可知,位尋址的位地址與直接尋址的字節(jié)地址形式完全一樣,主要由操作碼來區(qū)分,使用時(shí)需應(yīng)該特別注意。例如說明位地址表示:直接使用位地址。對于20H~2FH的16個(gè)單元共128位的位地址分布是00H~7FH。單元地址.位地址20H.1。對于特殊功能寄存器,可以直接用寄存器名字加位數(shù)或位名表示,如PSW.3,位名:CY,AC。

7相對尋址

前面6種方式主要用來解決操作數(shù)如何給出的問題,相對尋址是為解決程序轉(zhuǎn)移而設(shè)置的,只為轉(zhuǎn)移指令所用。

此種尋址方式以程序計(jì)數(shù)器PC的內(nèi)容為基地址,加上指令中給出的偏移量rel,所得結(jié)果為轉(zhuǎn)移目標(biāo)地址,用于轉(zhuǎn)移指令。 偏移量rel是一8位有符號補(bǔ)碼數(shù),范圍

128~+127。所以轉(zhuǎn)移范圍應(yīng)在當(dāng)前PC指針的

128~+127之間某一程序存儲器地址中。2000

8026H

SJMP

rel;PC←PC+2+rel程序存儲器A圖3-3指令過程

PC

26H0000H2000H2001H

80H26H××

××2028H02H20HALU2002H┆例當(dāng)前PC指令代碼序號尋址方式利用變量尋址空間1寄存器尋址R0~R7,A,B,CY,DPTR內(nèi)部RAM、幾個(gè)寄存器2直接尋址direct內(nèi)部RAM、SFR3寄存器間接尋址@R0,@R1,@R0,@R1,DPTR內(nèi)部RAM、外部RAM、I\O讀寫4立即尋址#data5變址尋址@A+PC@A+DPTR程序存儲器6位尋址bit內(nèi)部RAM的20H~2FH單元和部分SFR7相對尋址PC+rel程序存儲器ROM課堂小結(jié):MOV30H,R7

MOVA,55H

MOVA,#55H

MOVCA,@A+DPTRMOV30H,C

MOVA,@R0

MOVXA,@R0練習(xí)一說明下列指令中源操作數(shù)采用的尋址方式。MOVR0,@R3MOVCA,@

R0+DPTRMOVR0,R1練習(xí)二改錯(cuò)題3.3指令系統(tǒng)

數(shù)據(jù)傳送類指令:(29條)算術(shù)運(yùn)算類指令:(24條)邏輯運(yùn)算及移位類指令:(24條)控制轉(zhuǎn)移類指令:(17條)位操作(布爾操作)類指令:(17條)3.3.1

數(shù)據(jù)傳送類指令內(nèi)部存儲器間傳送:(MOV—16條)外部數(shù)據(jù)存儲器與累加器間傳送:(MOVX—4條)程序存儲器向累加器傳送:(MOVC—2條)數(shù)據(jù)交換:(XCH,XCHD,SWAP—5條)堆棧操作:(PUSH,POP—2條)

累加器A尋址@Ri間接尋址direct直接尋址Rn工作寄存器尋址#data立即數(shù)尋址

內(nèi)部數(shù)據(jù)傳送路徑:

(1)8位立即數(shù)傳送指令MOVA,#data;A←data

MOVRn,#data;Rn←data

MOV@Ri,#data;(Ri)←data

MOVdirect,#data;(direct)←data立即尋址型練習(xí):把立即數(shù)00H送到內(nèi)部RAM20H單元。

已知:R0=30H,試問執(zhí)行如下指令后累加器A、R3、30H、31H單元中內(nèi)容各是什么?MOV

A,#20HMOVR3,#45HMOV@R0,#46HMOV31H,#47H例:執(zhí)行后,結(jié)果為:A=20H,R3=45H,(30H)=46H,(31H)=47H(2)16位立即數(shù)傳送指令MOVDPTR,#data16

;A←data

MOVA,directMOVA,RnMOVRn,AMOVdirect,AMOVA,@Ri

MOV@Ri,A

練習(xí):把A累加器中的數(shù)傳送到30H單元(3)通過A累加器的數(shù)據(jù)傳送指令

已知:R1=20H、(21H)=54H、(22H)=55H、(30H)=56H,試問執(zhí)行如下指令后,A、40H、R2、20H、和P2口中的內(nèi)容各是什么?

MOVA,21H;MOV40H,A;MOVR2,22H;MOV@R1,21H;MOVP2,30H;例結(jié)果為:A=54H,(40H)=54H,R2=55H,(20H)=54H,P2=56H

已知:(30H)=12H、(31H)=13H、R0=30H、R1=31H,試問執(zhí)行以下指令后A、30H、31H和32H各是什么?

MOVA,@R0;MOV@R1,A;MOV@R0,#34H;MOV32H,@R1;例結(jié)果為:A=12H,(30H)=34H,(31H)=12H,(32H)=12H寄存器間接尋址型

MOVA,#dataMOVA,directMOVdirect,AMOVA,RnMOVRn,AMOVA,@RiMOV@Ri,AMOVRn,#dataMOVdirect,#dataMOV@Ri,#dataMOVRn,directMOVdirect,RnMOV@Ri,directMOVdirect,@RiMOVdirect,direct小結(jié)內(nèi)部數(shù)據(jù)傳送指令

MOVR0,R1MOV@R1,R7MOV@R0,@R1MOVA,R1MOVR0,AMOVA,R7MOV@R1,AMOVA,@R1MOV@R0,A錯(cuò)誤正確練習(xí)判斷下列指令的正誤,將錯(cuò)誤的更正.

1.以Ri作間址寄存器MOVXA,@Ri;讀外部RAM的00H~FFH單元MOVX@Ri,A;寫外部RAM的00H~FFH單元注:MOVX指令讀寫外部存儲器僅用間址,不用直接地址

注意引腳/RD、/WR的變化。

2.外部RAM讀/寫指令訪問外部RAM指令MOVXA,@DPTR;讀外部RAM的0000H-FFFFH,64K單元MOVX@DPTR,A;寫外部RAM的0000H-FFFFH,64K單元2.以DPTR作間址寄存器說明:

1.在51中,與外部存儲器RAM打交道的只可以是A累加器。所有需要送入外部RAM的數(shù)據(jù)必需要通過A送去,而所有要讀入的外部RAM中的數(shù)據(jù)也必需通過A讀入。在此我們可以看出內(nèi)外部RAM的區(qū)別了,內(nèi)部RAM間可以直接進(jìn)行數(shù)據(jù)的傳遞,而外部則不行。比如,要將外部RAM中某一單元(設(shè)為0100H單元的數(shù)據(jù))送入另一個(gè)單元(設(shè)為0200H單元),也必須先將0100H單元中的內(nèi)容讀入A,然后再送到0200H單元中去。2.要讀或?qū)懲獠康腞AM,當(dāng)然也必須要知道RAM的地址,在后兩條指令中,地址是被直接放在DPTR中的。而前兩條指令,由于Ri(即R0或R1)只是8位的寄存器,所以只提供低8位地址。高8位地址由P2口來提供。

3.使用時(shí)應(yīng)先將要讀或?qū)懙牡刂匪腿隓PTR或Ri中,然后再用讀寫命令。

例:將外部RAM中100H單元中的內(nèi)容送入外部RAM中200H單元中。

MOVDPTR,#0100H MOVXA,@DPTR MOVDPTR,#0200H MOVX@DPTR,A

MOVXA,2000H

MOVXA,20H錯(cuò)誤MOVDPTR,#2000HMOVXA,@DPTR錯(cuò)誤MOVR0,#20HMOVXA,@R0練習(xí)判斷下列指令的正誤,將錯(cuò)誤的更正.訪問外部RAM指令

已知外部RAM的60H單元中有一個(gè)數(shù)為30H,試編程把30H送到片外RAM的2000H單元中。例訪問外部RAM指令解:MOVR1,#60H;R1=60HMOVXA,@R1;A=30HMOVDPTR,#2000H;DPTR=2000HMOVX@DPTR,A;2000H←30HSJMP$;停止分析:上面雖都是片外RAM的地址單元,但不能直接傳送,必須經(jīng)過累加器A的轉(zhuǎn)送,才能實(shí)現(xiàn)。3.ROM讀指令(2條)-均為單字節(jié)MOVCA,@A+DPTRMOVCA,@A+PC注:PC不能隨便改變,稱為近程查表

DPTR可隨時(shí)賦值,稱遠(yuǎn)程查表故@A+DPTR比@A+PC更常用訪問ROM指令注:

注意引腳/PSEN的變化。

已知:1000H:MOVA,#10H

1002H:MOVCA,@A+PC

表項(xiàng)1010H:02H1011H:04H1012H:06H1013H:08HA←(A+PC),A=08H

結(jié)果;取指后PC=1003H、A+PC=1013H注:表項(xiàng)地址范圍為

1003H~1003H+FFH訪問ROM指令例用DPTR的方法:

已知:ROM的2008H單元中有一數(shù)34H,試用兩條ROM數(shù)據(jù)傳送指令各編寫一個(gè)程序,把數(shù)送到片7FH單元。解:①采用DPTR作為基址寄存器,基址可定為

2000H,地址偏移量則為08H,程序如下:MOV

DPTR,#2000H ;DPTR←2000HMOV

A,#08H ;A←08HMOVC

A,@A+DPTR;A←34HMOV

7FH,A ;(7FH)←A例②采用PC作為基址寄存器,程序如下:

ORG0000HSJMPSTARTORG2000HSTART:MOV

A,#05H(2字節(jié))

MOVC

A,@A+PC(1字節(jié))

MOV

7FH,A

已知:ROM的2008H單元中有一數(shù)34H,試用兩條ROM數(shù)據(jù)傳送指令各編寫一個(gè)程序,把數(shù)送到片7FH單元。

(1)整字節(jié)數(shù)據(jù)交換指令——XCHXCHA,Rn;A?RnXCHA,direct;A?(direct)XCHA,@Ri;A?(Ri)

4數(shù)據(jù)交換指令

(2)半字節(jié)交換指令——XCHDXCHDA,@Ri;A0~3?(Ri)0~3(3)累加器A高低半字節(jié)交換指令——SWAPSWAPA;A0~3?A4~7交換指令均與累加器A有關(guān)00HFFHA80H用戶RAM區(qū)位尋址區(qū)通用寄存器區(qū)7FH30H20H00H已知:A=AAH,R0=00H,執(zhí)行如下指令后,結(jié)果如何?XCHA,R0結(jié)果:A=00H,R0=AAHAAH例已知:片內(nèi)20H單元有一個(gè)數(shù)為30H,片外20H單元有一個(gè)數(shù)為03H,編程把二個(gè)數(shù)相互交換。例解:MOVR0,#20H;R0←20HMOVXA,@R0;A←03HXCHA,@R0;A←30H,20H←03HMOVX@R0,A;30H→20H(外部RAM)

SJMP$;停止分析:片內(nèi)、片外沒有直接的交換指令,必須經(jīng)過累加器A的中轉(zhuǎn),才能實(shí)現(xiàn)。

堆棧操作的規(guī)則:先進(jìn)后出,后進(jìn)先出。PUSHdirect

;SP←SP+1、(SP)←(direct)

POPdirect

;direct)←(SP)、SP←SP–1堆棧操作指令61H已知:A=AAH,SP=60H,執(zhí)行如下指令后,結(jié)果如何?結(jié)果:SP=61H,(61H)=AAH例FFHASP80HAAH位尋址區(qū)通用寄存器區(qū)2FH20H00H7FH62H61H60H60HSPAAHPUSHACC內(nèi)部RAMSFR60HPOPACC已知:A=00H,SP=61H,(61H)=AAH,執(zhí)行如下指令后,結(jié)果如何?結(jié)果:SP=60H,A=AAH例00HFFHASP80H位尋址區(qū)通用寄存器區(qū)2FH20H00H7FH62H61H60H61HSP

AAH例已知:(20H)=M1、(50H)=M2、編寫程序用堆棧指令把20H和50H單元中的內(nèi)容相交換。解:由堆棧所具備的原則,程序?yàn)椋篗OVSP,#60H;設(shè)置棧底首址為60HPUSH20H;SP←SP+1,61←M1PUSH50H;SP←SP+1,62←M2POP20H;(20H)←M2,SP←SP-1=61HPOP50H;(50H)←M1,SP←SP-1=60H1.將R1中的內(nèi)容傳送到R02.內(nèi)部RAM20H單元內(nèi)容傳送到內(nèi)RAM的30H中2.外部RAM20H單元內(nèi)容傳送到內(nèi)RAM的20H中3.外部RAM2000H…………………4.外部ROM2000H…………………5.外部…………….到外RAM3000H中在MCS-51指令系統(tǒng)中,該類指令為其核心,共48條可分為三大類:·算術(shù)運(yùn)算指令(24條)·邏輯運(yùn)算指令(20條)·移位指令(4條)3.3.6算邏運(yùn)算和移位指令3.3.2算術(shù)運(yùn)算指令(24條)不帶進(jìn)位加: (ADD—4條)帶進(jìn)位加: (ADDC—4條)增量指令: (INC—5條)十進(jìn)制調(diào)整指令: (DA—1條)減法指令: (SUBB—4條)減量指令: (DEC—4條)乘法指令: (MUL—1條)除法指令: (DIV—1條)

不帶Cy加法指令(4條):ADDA,Rn;A←A+RnADDA,direct;A←A+(direct)ADDA,@Ri;A←A+(Ri)ADDA,#data;A←A+data算術(shù)運(yùn)算指令注:指令的目的操作數(shù)為累加器A執(zhí)行指令后將影響標(biāo)志位Cy。加法指令特點(diǎn):兩個(gè)操作數(shù)均為8位,其中之一是累加器A; 加法操作在ALU中完成,結(jié)果送回累加器,運(yùn)算時(shí)產(chǎn)生的標(biāo)志位在PSW中; 不論兩操作數(shù)是否為帶符號數(shù),機(jī)器均按帶符號數(shù)運(yùn)算。

試分析執(zhí)行如下指令后,累加器A和PSW中各標(biāo)志的變化情況如何?

MOV

A,#5AH ADDA,#6BH

解:第一條指令先向累加器A傳送一個(gè)數(shù)5AH,第二條為加法指令,機(jī)器執(zhí)行加法指令時(shí)按帶符號數(shù)運(yùn)算。例

豎式表示如下圖:A=01011010Bdata=01101011B107111000101B1CS90+)197

1AC00CP執(zhí)行結(jié)果:A=5A+6B=C5H,PSW=44H01000100CyACF0RS1RS0OV-P5A+6B=?C7C6

試分析執(zhí)行如下指令后,累加器A和PSW中各標(biāo)志的變化情況如何?

MOV

A,#78H ADDA,#9AH

解:第一條指令先向累加器A傳送一個(gè)數(shù)5AH,第二條為加法指令,機(jī)器執(zhí)行加法指令時(shí)按帶符號數(shù)運(yùn)算。練習(xí)豎式表示如下圖:120A=01111000B+)154data=10011010B274100010010B-)256181C6

1AC1C7執(zhí)行結(jié)果:A=78+9A=12H,PSW=C0H11000000CyACF0RS1RS0OV-P78+9A=?帶Cy加法指令(4條):ADDCA,Rn;A←A+Rn+CyADDCA,#data;A←A+data+CyADDCA,direct;A←A+(direct)+CyADDCA,@Ri;A←A+(Ri)+Cy注:若Cy=0,則ADD等于ADDC加法指令特點(diǎn): 注釋中的Cy中內(nèi)容為指令執(zhí)行前Cy內(nèi)容,指令執(zhí)行后形成新的Cy保留在PSW中,其余和不帶Cy的加法指令相同; 本類指令用于多字節(jié)加法程序中。

已知:A=8FH、R1=20H、(20H)=12H、(21H)=0FEH和Cy=1,試問CPU依次執(zhí)行以下指令后累加器A和Cy中的值是多少。

a.ADDCA,R1b.ADDCA,21H c.ADDCA,@R1d.ADDCA,#7FH

解:操作結(jié)果應(yīng)為:

a.A=8F+20+1=0B0H,Cy=0b.A=8F+FE+1=8EH,Cy=1 c.A=8F+12+1=0A2H,Cy=0d.A=8F+7F+1=0FH,Cy=1例兩個(gè)雙字節(jié)數(shù)加法舉例、單字節(jié)數(shù)相加(作業(yè))INC

A ;A←A+1INC

Rn ;Rn←Rn+1INC

direct ;(direct)←(direct)+1INC

@Ri ;(Ri)←(Ri)+1INC

DPTR ;DPTR←DPTR+1加1指令(5條):算術(shù)運(yùn)算指令加法指令特點(diǎn):INC是Increase的縮寫;本指令僅對PSW中P標(biāo)志有影響。

已知:A=34H、R0=42H、(43H)=23H、DPTR=3020H,試問CPU執(zhí)行如下程序后A、R4、43H、R0、DPTR中的內(nèi)容各是什么?

INCA INCR0 INC43H INC@R0

INCDPTR解:由加1指令的規(guī)則,上述指令執(zhí)行后的結(jié)果為:A=35H、R0=43H、43H=25H、DPTR=3021H。由于,加1指令在程序中頻繁地出現(xiàn),常用來修改地址和數(shù)據(jù)指針加1處理。例加1指令中,只有INCA這一條影響奇偶標(biāo)志位,其余均不影響任何標(biāo)志位。INCDPTR對DPTR中內(nèi)容加1,是唯一的一條16位算術(shù)運(yùn)算指令。說明思考已知:A=34H、R0=42H、(42H)=23H、DPTR=3020H,運(yùn)行前PSW=00,試問CPU執(zhí)行如下程序后PSW

?

INCA INCR0 INC42H INC@R0

INCDPTR帶Cy減法指令(4條):SUBBA,Rn;A←A–Rn-CySUBBA,#data;A←A-data-CySUBBA,direct;A←A-(direct)-CySUBBA,@Ri;A←A-(Ri)-Cy減法指令注:MCS-51僅有帶借位的減法指令,若要使用不帶借位的減法指令,則令Cy=0。000

0011CyACF0Rs1Rs0OV━1P例01111111

試分析執(zhí)行下列指令后,累加器A和PSW中各標(biāo)志位狀態(tài)?

CLRC MOVA,#35H SUBBA,#0B6H

解:A=00110101-)10110110結(jié)果為:A=35-B6=7FH,Cy

=1,PSW為:DECA ;A←A-1DECRn ;Rn←Rn-1DECdirect ;direct←(direct)-1DECRi ;(Ri)←(Ri)-1減法指令減1指令(4條):注減1指令與加1指令相似,只有以A為操作數(shù)的指令才影響PSW。

已知:A=10H、R1=3BH、R7=34H、(60H)=00H、(3BH)=0FFH,試分析,執(zhí)行如下程序后累加器A和PSW中各標(biāo)志位狀態(tài)?①DECA②DEC@R1③DEC60H④DECR7

例解:根據(jù)減1指令功能,結(jié)果為:①A=0FH,P=0②3B=0FEH,

PSW不變③(60H)=0FFH,PSW不變④R7=33H,

PSW不變特點(diǎn)十進(jìn)制調(diào)整指令(1條)1.BCD加法DAA對A中兩個(gè)壓縮BCD數(shù)相加之和調(diào)整為2位BCD碼數(shù)。1)只能用在對BCD碼數(shù)進(jìn)行ADD或ADDC操作后使用。2)影響標(biāo)志位:C、AC、P。;

A←A+

06H60H66H

試編程實(shí)現(xiàn)44H+86H的BCD加法程序,并對其工作原理分析。

解:相應(yīng)BCD加法程序?yàn)椋?/p>

MOVA,#44H ;A←44H ADDA,#86H ;A←44+86=0CAH DAA ;A←30H,Cy=1,AC=1 SJMP$

;結(jié)束例乘、除法指令(2條)格式:

MULAB ;BA←(A)×(B) ;Cy←0 DIVAB ;A←(A)/(B)的商;

;B←(A)/(B)的余數(shù);

;Cy←0,OV←0特點(diǎn):

MUL是Multiply的縮寫,DIV是Divide的縮寫; 單字節(jié)指令,執(zhí)行時(shí)間為48T(4機(jī)器周期); 操作數(shù)均為8位無符號數(shù)。標(biāo)志位Cy、OV、P討論:

執(zhí)行乘法指令后Cy=0

若積為8位(即B=0),則OV=0

若積為16位(即B≠0),則OV=1

根據(jù)累加器A確定奇偶標(biāo)志P

執(zhí)行除法指令后Cy=0

若除數(shù)B=0,則OV=1

若除數(shù)B≠0,則OV=0

根據(jù)累加器A確定奇偶標(biāo)志P

已知:有兩個(gè)8位無符號數(shù)乘數(shù)分別放在20H和21H單元中,試編寫程序把相乘積的低8位放入22H單元中,積的高8位放入23H單元中。例分析:這是一個(gè)乘法問題,可用MULAB指令。其操作數(shù)分布在相鄰四個(gè)單元,采用間址尋址方式較為方便。ORG1000HMOVR1,#20H;R1←第一個(gè)乘數(shù)地址MOVA,@R1;A←第一個(gè)乘數(shù)INCR1;修改乘數(shù)地址MOVB,@R1;B←第二個(gè)乘數(shù)地址MULAB;A*B=BAINCR1;修改目標(biāo)單元地址MOV@R1,A;22H←積的低8位INCR1;修改目標(biāo)單元地址MOV@R1,B;23H←積的高8位SJMP$;停止邏輯運(yùn)算指令邏輯與指令: (ANL—6條)邏輯或指令: (ORL—6條)邏輯異或指令: (XRL—6條)累加器清除與求反指令: (CLR、CPL—2條)移位指令: (RL、RLC、RR、RRC—4條)邏輯與指令(6條)格式:

ANLA,#data ;A←(A)∧#data ANLA,Rn ;A←(A)∧(Rn)(n=0~7) ANLA,direct ;A←(A)∧(direct) ANLA,@Ri ;A←(A)∧((Ri))(n=0,1) ANLdirect,A ;direct←(direct)∧(A) ANLdirect,#data ;direct←(direct)∧#data特點(diǎn):

ANL是ANDLogical的縮寫; 前四條指令執(zhí)行后會對PSW中P標(biāo)志產(chǎn)生影響。用途:

可從某字節(jié)中取出某幾位。邏輯或指令(6條)格式:

ORLA,#data ;A←(A)∨#data ORLA,Rn ;A←(A)∨(Rn)(n=0~7) ORLA,direct ;A←(A)∨(direct) ORLA,@Ri ;A←(A)∨((Ri))(n=0,1) ORLdirect,A ;direct←(direct)∨(A) ORLdirect,#data ;direct←(direct)∨#data特點(diǎn):

ORL是ORLogical的縮寫; 前四條指令執(zhí)行后會對PSW中P標(biāo)志產(chǎn)生影響。用途: 給某字節(jié)中某幾位置1。邏輯異或指令(6條)格式:

XRLA,#data ;A←(A)#data XRLA,Rn ;A←(A)(Rn)(n=0~7) XRLA,direct ;A←(A)(direct) XRLA,@Ri ;A←(A)((Ri))(n=0,1) XRLdirect,A ;direct←(direct)(A) XRLdirect,#data ;direct←(direct)#data特點(diǎn):

XRL是XORLogical的縮寫; 前四條指令執(zhí)行后會對PSW中P標(biāo)志產(chǎn)生影響。用途: 令某字節(jié)中某幾位置取反,其余位不變。++++++累加器清除與求反指令(2條)格式:

CLRA ;A←0 CPLA ;A←特點(diǎn):

CLR是Clearing的縮寫

CPL是Complementofone’s的縮寫;

CLRA指令執(zhí)行后,Cy=0。用途:

CLR用于是累加器清零;

CPL可用于求某數(shù)的補(bǔ)碼。例 ②A=0EH,(20H)=0FEHA=00001111∧)(20H)=1111111000001110已知:R0=20H、(20H)=0FEH,試問分別執(zhí)行如下指令后,累加器A和20H單元中內(nèi)容各是什么?①M(fèi)OVA,#20H②MOVA,#0FHANLA,R0ANLA,20H解:根據(jù)邏輯乘指令功能,上述指令執(zhí)行后的結(jié)果為:①A=20H,(20H)=0FEHA=00100000∧)

R0=0010000000100000AA例

已知:R0=20H、(20H)=0FEH,試問分別執(zhí)行如下指令后,累加器A和20H單元中內(nèi)容各是什么?③MOVA,#0F0H④MOVA,#80HANLA,@R0ANL20H,A解:根據(jù)邏輯乘指令功能,上述指令執(zhí)行后的結(jié)果為: ③A=0F0H,(20H)=0FEHA=11110000∧)

@

R0=1111111011110000A ④A=80H,(20H)=80HA=10000000∧)(20H)=1111111010000000(20H)例 ②A=0EH,(20H)=0FEHA=00001111∪)(20H)=1111111011111111已知:R0=20H、(20H)=0FEH,試問分別執(zhí)行如下指令后,累加器A和20H單元中內(nèi)容各是什么?①M(fèi)OVA,#20H②MOVA,#0FHORLA,R0ORLA,20H解:根據(jù)或邏輯指令功能,上述指令執(zhí)行后的結(jié)果為:①A=20H,(20H)=0FEHA=00100000

∪)

R0=0010000000100000AA

已知:A=AAH和P2=FFH,編程把累加器A中低4位送入P2口低4位,P2口高位不變。解:程序思路為:根據(jù)邏輯與、邏輯或兩類指令的特性來實(shí)現(xiàn)ORG

0030HANLA,#0FH;屏蔽A中的高4位,低4位不變ANL

P2,#F0H ;屏蔽P2中的低4位,高4位不變ORL

P2,A

;裝配數(shù)據(jù),結(jié)果送P2SJMP

$

;結(jié)束邏輯與和邏輯或應(yīng)用舉例 ②A=0EH,(20H)=0FEHA=00001111⊕

)(20H)=1111111011110001已知:R0=20H、(20H)=0FEH,試問分別執(zhí)行如下指令后,累加器A和20H單元中內(nèi)容各是什么?①M(fèi)OVA,#20H②MOVA,#0FHXRLA,R0XRLA,20H解:根據(jù)異或邏輯指令功能,上述指令執(zhí)行后的結(jié)果為:①A=20H,(20H)=0FEHA=00100000

⊕)

R0=0010000000000000AA已知:外部RAM

0040H中有一數(shù)BBH,假定高4位不變和低4位取反,試編出它的相應(yīng)程序。解:利用MOVXA,@DPTR類指令ORG0300HMOVDPTR,#0040H

;地址送指針DPTRMOVXA,@DPTR

;A←BBHXRLA,#0FH

;A←BBH⊕0FH=B4HMOVX@DPTR,A

;結(jié)果送回0040H單元SJMP$

;停止例

邏輯與——位清0邏輯或——位置1

位恢復(fù)——邏輯異或ANLA,#F0H;A中低4位清0,高4位不變ORLA,#F0H;A中高4位置1,低4位不變XRLA,#FFH;A中各位反號XRLA,#00H;A中各位恢復(fù)應(yīng)用小結(jié)RLA;RRA;A7A0ACyA7A0ACyA7A0AA7A0ARLCA;RRCA;移位指令

已知:M和M+1單元中有一個(gè)16位二進(jìn)制數(shù)(M為低8位),編程將其擴(kuò)大到二倍。

解:一個(gè)16位二進(jìn)制數(shù)擴(kuò)大到二倍就等于是把它進(jìn)行一次算術(shù)左移。由于MCS-51單元片機(jī)的移位指令都是二進(jìn)制8位的移位指令,因此16位數(shù)的移位指令必須用程序來實(shí)現(xiàn)。算法為:

M

M+1

0

例程序?yàn)椋篛RG

0030HCLR

C ;清進(jìn)位標(biāo)志位MOV

R0,#M ;操作數(shù)低8位地址送R0MOV

A,@R0 ;A←操作數(shù)低8位RLC

A ;低8位操作數(shù)左移低位補(bǔ)0MOV@R0,A ;結(jié)果送回M單元,Cy中為最高位INC

R0 ;R0指向M+1單元MOV

A,@R0 ;A←操作數(shù)高8位RLCA ;高8位操作數(shù)左移并加上低位CyMOV@R0,A ;結(jié)果送回M+1單元SJMP

$ ;停止

控制轉(zhuǎn)移類指令無條件轉(zhuǎn)移指令: (LJMP、AJMP、SJMP、JMP—4條)條件轉(zhuǎn)移指令:

(JZ、JNZ、CJNE、DJNZ—8條)子程序調(diào)用及返回指令: (LCALL、ACALL、RET、RETI—4條)空操作指令: (NOP—1條)一、控制轉(zhuǎn)移指令(17條)LJMP

addr16 ;PC←addr16AJMPaddr11 ;PC←PC+2,PC10—0←arrr11SJMPrel ;PC←PC+2,PC←PC+relJMP@A+DPTR ;PC←A+DPTR1、無條件轉(zhuǎn)移指令

控制轉(zhuǎn)移類指令特點(diǎn):這類指令執(zhí)行時(shí)不會影響PSW中各標(biāo)志位; 指令的操作對象是PC中地址; 第2、3條指令是相對轉(zhuǎn)移指令,匯編時(shí)能產(chǎn)生浮動(dòng)代碼,在子程序中很有用。F800H~FFFFHF000H~F7FFHE800H~EFFFHE000H~E7FFHD800H~DFFFHD000H~D7FFHC800H~CFFFHC000H~C7FFHB800H~BFFFHB000H~B7FFHA800H~AFFFHA000H~A7FFH9800H~9FFFH9000H~97FFH8800H~8FFFH8000H~87FFH7800H~7FFFH7000H~77FFH6800H~6FFFH6000H~67FFH5800H~5FFFH5000H~57FFH4800H~4FFFH4000H~47FFH3800H~3FFFH3000H~37FFH2800H~2FFFH2000H~27FFH1800H~1FFFH1000H~17FFH0800H~0FFFH0000H~07FFH程序存儲器64K地址空間①長轉(zhuǎn)移指令LJMPaddr16;PCaddr16

三字節(jié)指令,不影響標(biāo)志位,可在64KB地址范圍內(nèi)無條件轉(zhuǎn)移。AJMP指令本指令是2KB范圍內(nèi)的絕對轉(zhuǎn)移指令:

AJMPaddr11 ;PC←(PC)+2(形成頁面地址PC15-11)

;PC10~0←addr11(形成頁面地址)

說明: 本指令是雙字節(jié)指令。指令碼為:

a10a9a800001a7a6……a0

操作碼 其中a10~a0為低11位目標(biāo)地址。 編程時(shí)addr11常用符號地址,匯編時(shí)翻譯成機(jī)器碼。AJMP指令第0區(qū)第1區(qū)……第32區(qū)0000H07FFH0800H0FFFHF800HFFFFH外部ROM的64KB可以分為32區(qū),每區(qū)2KB。PC15~PC11為頁面地址PC10~PC0為頁內(nèi)地址。0000HSJMP指令的地址偏移量計(jì)算請計(jì)算如下程序中的地址偏移量rel。

ORG 1000H1000H7401H START:MOV A,#01H1002HF8H MOV R0,A ……1017H80Hrel SJMP START END 因?yàn)椋耗繕?biāo)地址=源地址+2+rel所以:rel=目標(biāo)地址-源地址-2 =1000H-1017H-2=-19H=-25故:rel=[25]補(bǔ)=E7H④變址尋址轉(zhuǎn)移指令JMP@A+DPTR;PCA+DPTR機(jī)器碼:73H

該類指令是一條單字節(jié)雙周期無條件轉(zhuǎn)移指令。在64KB地址范圍內(nèi)無條件轉(zhuǎn)移。

已知:累加器A中放有待處理命令編號0-4,程序存儲器中放有始址為MAIN的兩字節(jié)長轉(zhuǎn)移指令表,試編一程序能使機(jī)器按照累加器A中的命令編號轉(zhuǎn)去執(zhí)行相應(yīng)的命令程序。

解:程序?yàn)椋?/p>

ORG0030HSTAR:MOV

A,R1

RL

A

;A←A*2

MOV

DPTR,MAIN

;轉(zhuǎn)移指令表始址送DPTR

JMP@A+DPTR

ORG1000H

MAIN:AJMP

PM0

;轉(zhuǎn)入0#命令程序

AJMP

PM1

;轉(zhuǎn)入1#命令程序

AJMP

PM2

;轉(zhuǎn)入2#命令程序

AJMP

PM3 ;轉(zhuǎn)入3#命令程序

AJMP

PM4

;轉(zhuǎn)入4#命令程序

AJMP$ ;停止2、條件轉(zhuǎn)移指令累加器A判零轉(zhuǎn)移指令:(JZ、JNZ—2條)比較條件轉(zhuǎn)移指令: (CJNE—4條)減1條件轉(zhuǎn)移指令: (DJNZ—2條)JZrel;A=0PC

PC+2+relA≠0PCPC+2JNZrel;A≠0PCPC+2+relA=0PCPC+22、條件轉(zhuǎn)移指令①累加器A判零轉(zhuǎn)移(2條)特點(diǎn):雙字節(jié)指令,第一字節(jié)是操作碼,第二字節(jié)rel是一個(gè)帶符號數(shù);

rel在編程時(shí)采用符號地址,匯編時(shí)翻譯成內(nèi)存地址。分析:外部RAM內(nèi)部RAMA關(guān)鍵指令:MOVXA,@DPTRMOV@R0,A步驟:①設(shè)置DPTR=DATA1②設(shè)置目的地首地址R0=DATA2③取外部數(shù)據(jù)至A⑤A≠0,送數(shù),修改地址轉(zhuǎn)至③⑤A=0,轉(zhuǎn)至結(jié)束處

④判斷轉(zhuǎn)移

解:程序?yàn)椋?/p>

ORG1000H MOVDPTR,#DATA1;外部RAM數(shù)據(jù)塊始地址

MOVR0,#DATA2;內(nèi)部RAM數(shù)據(jù)塊始址送R0MAIN:MOVXA,@DPTR;取外部RAM數(shù)據(jù)送A

JZQUIT ;若A=0,則跳轉(zhuǎn)到QUIT處, ;否則往下執(zhí)行

MOV@R0,A ;A中的數(shù)據(jù)送給內(nèi)部RAM單元中

INCR0 ;修改外部RAM地址的指針

INCDPTR ;修改內(nèi)部RAM地址的指針

SJMPMAIN ;循環(huán)執(zhí)行QUIT: SJMP$ ;停止CJNEA,#data,rel ;不相等轉(zhuǎn)移

;#data=A,PC←PC+3,C←0 ;#data<A,PC←PC+3+rel,C←0 ;#data>A,PC←PC+3+rel,C←1CJNEA,direct,rel ;不相等轉(zhuǎn)移

;若A=(direct),則PC←PC+3,C←0;若A>(direct),則PC←PC+3+rel,C←0;若A<(direct),則PC←PC+3+rel,C←1②不相等轉(zhuǎn)移(影響標(biāo)志位)CJNERn,#data,rel;不相等轉(zhuǎn)移

;若Rn=data,則PC←PC+3,C←0;若Rn>data,則PC←PC+3+rel,C←0;若Rn<data,則PC←PC+3+rel,C←1CJNE@Ri,#data,rel;不相等轉(zhuǎn)移

;若(Ri)=data,則PC←PC+3,C←0;若(Ri)>data,則PC←PC+3+rel,C←0;若(Ri)<data,則PC←PC+3+rel,C←1DJNZdirect,rel;(direct)←(direct)-1;若(direct)≠0,則PC←PC+3+rel;若(direct)=0,則PC←PC+3DJNZRn,rel ;Rn←Rn-1 ;若Rn=0則PC←PC+2 ;若Rn≠0則PC←PC+2+rel③減一判零轉(zhuǎn)移用于控制循環(huán)次數(shù)練習(xí):延時(shí)程序、數(shù)據(jù)塊求和、數(shù)據(jù)塊搬家練習(xí)1.求片內(nèi)(20H)+(21H)=(30H)2.求片內(nèi)(20H)-(21H)=(30H)3.求片內(nèi)(20H)*(21H)=(31H)(30H)4.求片內(nèi)(20H)/(21H)=(30H)…(31H)5.去P1口的第四位和P2口的高四位,結(jié)果從P3口輸出6.將片內(nèi)RAM(20H)與片外RAM(2000H)單元的數(shù)互換練習(xí):1、內(nèi)部RAM20H單元開始的一組30個(gè)數(shù),送到40H開始的單元中。

2、片外RAM1000H單元開始的32個(gè)數(shù),送到片內(nèi)30H開始的單元中。

3、ROM1000H單元開始的10個(gè)數(shù)送到內(nèi)部

RAM30H開始的單元。

4、5個(gè)無符號數(shù)存放在內(nèi)部RAM30H開始的單元,求其和(假設(shè)和小于255)并將和放在40H單元。例:從P2.0輸出20個(gè)方波。解:程序?yàn)椋?/p>

ORG1000H MOVR2,#40 ;預(yù)置方波數(shù)

BACK: CPLP2.0 ;P2.0取反

DJNZR2,BACK ;R2-1不等于0繼續(xù)循環(huán)

SJMP$ ;停止3、子程序調(diào)用和返回指令格式:

LCALLaddr16 ;PC←(PC)+3 ;SP←(SP)+1,(SP)←PC7~0 ;SP←(SP)+1,(SP)←PC15~8 ;PC←指令中addr16 ACALLaddr11 ;PC←(PC)+2 ;S

溫馨提示

  • 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

提交評論