單片機(jī)原理與應(yīng)用 第三章匯編指令系統(tǒng)_第1頁(yè)
單片機(jī)原理與應(yīng)用 第三章匯編指令系統(tǒng)_第2頁(yè)
單片機(jī)原理與應(yīng)用 第三章匯編指令系統(tǒng)_第3頁(yè)
單片機(jī)原理與應(yīng)用 第三章匯編指令系統(tǒng)_第4頁(yè)
單片機(jī)原理與應(yīng)用 第三章匯編指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩159頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第三章匯編指令系統(tǒng)

本章學(xué)習(xí)目標(biāo):

理解匯編語(yǔ)言的一般規(guī)則,能夠讀懂匯編程序,并能夠編寫簡(jiǎn)短的程序段。知識(shí)要點(diǎn):

尋址方式;

匯編指令的功能;

匯編指令的典型應(yīng)用。3.2MCS-51單片機(jī)的尋址方式3.1匯編指令格式3.3MCS-51單片機(jī)指令功能3.4匯編指令總結(jié)匯編語(yǔ)言(AssemblyLanguage)——用助記(字)符代替操作碼,用地址符號(hào)代替地址碼的一種面向機(jī)器的程序設(shè)計(jì)語(yǔ)言;匯編語(yǔ)言優(yōu)點(diǎn)——代碼精煉、執(zhí)行速度快,但不便于編寫較復(fù)雜的程序;3.1匯編指令格式指令:使計(jì)算機(jī)完成基本操作的命令指令系統(tǒng):全部指令的集合指令的四大功能:說(shuō)明操作的類型(命令的類型)說(shuō)明參與運(yùn)算的數(shù)或數(shù)所在的地址說(shuō)明結(jié)果所在的地址說(shuō)明下一條指令所在的地址

MOVA,#1ADDA,#23.1匯編指令格式一條匯編語(yǔ)言指令中最多包含4個(gè)區(qū)段,其一般格式為:一、指令格式[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]START:

MOV

A,#12H;機(jī)器碼7412H3.1匯編指令格式………….…….0FFFH1000H1001H…….xxHxxHxxH74H12HROMSTART→ ORG1000HSTART:MOVA,#12H;機(jī)器碼7412H ……舉例:⑴標(biāo)號(hào):稱為符號(hào)地址,其值對(duì)應(yīng)于指令首字節(jié)的存放地址。

用于標(biāo)識(shí)一段程序的開始,為轉(zhuǎn)移指令提供目的地址。

①由用戶定義的1~6個(gè)英文字母和數(shù)字組成②標(biāo)號(hào)必須用冒號(hào)“:”與操作碼分隔。3.1匯編指令格式①由標(biāo)準(zhǔn)助記字符組成,是指令的必需部分,不可缺少。②51單片機(jī)共有42種操作碼,不區(qū)分大小寫。MOV

A,#12H;

move(傳送)SETBP1.0 ;setbit(置位)CJNEA,R0,START;compareandjumpifnotequal(比較跳轉(zhuǎn))舉例:⑵操作碼:表示指令的操作功能。

[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]3.1匯編指令格式①操作數(shù)是指令要操作的對(duì)象(如地址,寄存器,常數(shù)等);②操作數(shù)可分為目的操作數(shù)和源操作數(shù);MOVA,#03H;A03HADDA,#10H ;A+10H→ACLRA ;A←0RET ;子程序返回舉例:⑶操作數(shù):參加操作的數(shù)據(jù)或數(shù)據(jù)地址。

[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]3.1匯編指令格式①注釋是對(duì)指令的解釋或說(shuō)明,用以提高程序的可讀性;②以英文分號(hào);開始,無(wú)需結(jié)束符號(hào);③不會(huì)形成機(jī)器碼,可以省略。SETBP1.0 ;P1.0←1CJNEA,R0,START;若A≠R0,轉(zhuǎn)START

舉例:⑷注釋:指令功能說(shuō)明。

[標(biāo)號(hào):]操作碼[操作數(shù)][;注釋]3.1匯編指令格式在指令手冊(cè)中,每條指令的操作數(shù)是以簡(jiǎn)記符號(hào)表示的。二、指令中的簡(jiǎn)記符號(hào)掌握簡(jiǎn)記符號(hào)規(guī)則→便于閱讀源程序(查指令手冊(cè))助記符格式操作MOVA,RnA←(Rn)MOVA,directA←(direct)MOVA,@RiA←((Ri))MOVA,#dataA←data3.1匯編指令格式Rn:當(dāng)前寄存器組的8個(gè)通用寄存器R0~R7(n=0~7)。Ri:當(dāng)前寄存器組中的2個(gè)寄存器R0,R1,

用作間接尋址的寄存器(i=0,1)。direct:

內(nèi)部RAM的8位地址,指代00H~FFH。#data:

包含在指令中的8位立即數(shù)。指代00H~FFH。#data16:包含在指令中的16位立即數(shù)。指代0000H~FFFFH。addr16:16位目的地址,64KB存儲(chǔ)器空間中的地址。

指代0000H~FFFFH。3.1匯編指令格式addr11:表示11位目的地址,用于2KB范圍內(nèi)的程序跳轉(zhuǎn)。rel:

相對(duì)轉(zhuǎn)移指令中的偏移量,為8位符號(hào)數(shù)。

@:寄存器間接尋址符號(hào)。

/:位操作數(shù)的前綴,表示對(duì)該位狀態(tài)取反。

(X):某寄存器或某單元中的內(nèi)容。

((X)):以X單元的內(nèi)容為地址的存儲(chǔ)器單元內(nèi)容,即(X)做地址

,該地址單元的內(nèi)容用((x))表示。←:表示將箭尾一方的內(nèi)容傳送至箭頭的一方。3.1匯編指令格式3.2MCS-51單片機(jī)的尋址方式3.1匯編指令格式3.3MCS-51單片機(jī)指令功能3.4匯編指令總結(jié)3.2MCS-51指令的尋址方式

尋址方式:尋找操作數(shù)地址或指令地址的方式。

尋址方式類型:7種

立即數(shù)尋址直接尋址寄存器尋址寄存器間接尋址變址尋址相對(duì)尋址位尋址一、立即尋址立即尋址:將操作數(shù)直接編碼于指令中。特點(diǎn):操作數(shù)可以從指令中直接取得,速度快。用途:用于對(duì)寄存器或存儲(chǔ)單元進(jìn)行初始賦值。立即尋址中的操作數(shù)稱為立即數(shù),用“#”表示。3.2MCS-51指令的尋址方式例如,指令MOVA,#45H

機(jī)器代碼74453.2MCS-51指令的尋址方式二、直接尋址直接尋址:在指令中直接給出操作數(shù)的字節(jié)地址或位地址。適用范圍:只能在下述三種地址空間內(nèi)尋址。(1)特殊功能寄存器(SFR);(2)內(nèi)部數(shù)據(jù)存儲(chǔ)器RAM的低128個(gè)字節(jié);(3)位地址空間。3.2MCS-51指令的尋址方式例如:指令MOVA,45H

機(jī)器代碼E5453.2MCS-51指令的尋址方式直接地址direct是操作數(shù)所在的存儲(chǔ)單元地址。直接地址direct可以用兩位十六進(jìn)制表示,也可以用SFR的符號(hào)代替。

如:MOVSP,#30H等同于MOV81H,#30H直接尋址方式是訪問(wèn)SFR空間的唯一方式。3.2MCS-51指令的尋址方式三、寄存器尋址寄存器尋址:操作數(shù)存于寄存器中,

通常在指令中給出寄存器的編號(hào)。特點(diǎn):指令短,速度快適用范圍工作寄存器區(qū)中的R0-R7

A(累加器)、B(僅限于乘除法指令)、DPTRC(布爾處理器)3.2MCS-51指令的尋址方式3.2MCS-51指令的尋址方式寄存器尋址:四、寄存器間接尋址將操作數(shù)的單元地址存放在特定寄存器中,通常在指令中只給出寄存器的編號(hào),而不是操作數(shù)的單元地址。@符號(hào)是其標(biāo)志。特點(diǎn):指令簡(jiǎn)潔,便于對(duì)連續(xù)存放的數(shù)據(jù)進(jìn)行處理。特定寄存器:R0,R1:用于訪問(wèn)片上RAM空間DPTR:用于訪問(wèn)外部數(shù)據(jù)空間SP:用于訪問(wèn)堆棧空間

上述寄存器的作用等同于指針!3.2MCS-51指令的尋址方式3.2MCS-51指令的尋址方式寄存器間接尋址:五、變址尋址操作數(shù)的有效地址為基址寄存器與變址寄存器內(nèi)容之和。基址寄存器:PC(或DPTR),變址寄存器:A

用途

用于查表指令,讀取存放于程序空間中的常數(shù)表,如函數(shù)表,字模表等。3.2MCS-51指令的尋址方式93…5C472000SFRDPHDPLA2047H程序存儲(chǔ)器

MOVCA,@A+DPTR

機(jī)器代碼93執(zhí)行前:A=47H,DPTR=2000H,(2047H)=5CH執(zhí)行后:A=5CH。3.2MCS-51指令的尋址方式六、相對(duì)尋址用于確定下一條執(zhí)行指令的入口地址,在指令中給出程序跳轉(zhuǎn)的偏移量rel,用于轉(zhuǎn)移指令中。轉(zhuǎn)移目的地址=PC當(dāng)前值+rel。rel:8bits符號(hào)數(shù)3.2MCS-51指令的尋址方式例如:JCrel機(jī)器碼4016

“40”:操作碼“16”:偏移量當(dāng)前PC值=1002H3.2MCS-51指令的尋址方式七、位尋址在指令中直接給出操作數(shù)的位地址特點(diǎn)直接操作單元中的某一個(gè)位,方便了程序設(shè)計(jì),提高了程序的可讀性。適用范圍片內(nèi)RAM區(qū)支持位尋址方式的單元,即20H-2FH。SFR中支持位尋址方式的寄存器。3.2MCS-51指令的尋址方式例如: 指令SETB3AH

機(jī)器代碼D23A

3.2MCS-51指令的尋址方式執(zhí)行后:27H.2=13AH是單元27H中D2的位地址位地址的表示方法1)直接用兩位十六進(jìn)制來(lái)表示,如3AH2)采用單元字節(jié)地址加“.”符號(hào)的方式,如27H.23)采用SFR名稱加“.”符號(hào)的方式,如ACC.74)采用位符號(hào)的方式,如C,P等。3.2MCS-51指令的尋址方式尋址方式小結(jié)3.2MCS-51指令的尋址方式思考:1)訪問(wèn)片上低端RAM區(qū)可以使用哪些尋址方式?2)訪問(wèn)SFR區(qū)使用哪種尋址方式?3)訪問(wèn)高端RAM區(qū)使用哪種尋址方式?3.2MCS-51指令的尋址方式3.2MCS-51單片機(jī)的尋址方式3.1匯編指令格式3.3MCS-51單片機(jī)指令功能3.4匯編指令總結(jié)3.3指令系統(tǒng)尋址方式和指令系統(tǒng)是衡量微型機(jī)性能的重要指標(biāo)。尋址方式越多,指令越豐富,指令執(zhí)行速度越快,反映該機(jī)型的總體功能就越強(qiáng)。指令系統(tǒng)對(duì)編程的靈活性、有效性有很大的影響。3.3指令系統(tǒng)單機(jī)器周期指令有64條;雙機(jī)器周期指令有45條;四機(jī)器周期指令有2條。MCS-51的指令系統(tǒng)共有111條指令單字節(jié)指令49條;雙字節(jié)指令46條;三字節(jié)指令16條。按指令字節(jié)長(zhǎng)度分:按指令執(zhí)行的時(shí)間分:按功能可分為五類:(1)數(shù)據(jù)傳送類指令;(2)算術(shù)運(yùn)算類指令;(3)邏輯運(yùn)算類指令;(4)程序控制類指令;(5)位(布爾)操作類指令。指令的表示方法助記符形式、機(jī)器碼形式學(xué)習(xí)目標(biāo)1.掌握指令的功能,學(xué)習(xí)分析指令功能的方法2.理解指令所涉及的尋址方式,操作數(shù)3.了解指令的執(zhí)行時(shí)間和長(zhǎng)度4.了解指令對(duì)PSW的影響,即對(duì)Cy,OV,AC,P的影響3.3指令系統(tǒng)3.3.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令的作用是什么呢?實(shí)現(xiàn)寄存器,數(shù)據(jù)存儲(chǔ)器單元中數(shù)據(jù)的讀寫;

實(shí)現(xiàn)程序存儲(chǔ)器單元中數(shù)據(jù)的讀出。3.3.1數(shù)據(jù)傳送類指令MemoryMap?idata區(qū)(00H-FFH)Rn(00H-1FH)data區(qū)(00H-7FH)SFR區(qū)(A,BDPH,DPL,SP,PSW)code區(qū)(0000H-FFFFH)xdata區(qū)(0000H-FFFFH)如何實(shí)現(xiàn)不同存儲(chǔ)空間中數(shù)據(jù)的傳送?類型指令說(shuō)明助記符執(zhí)行的操作

片內(nèi)數(shù)據(jù)傳送累加器A為目的操作數(shù)的傳送MOVA,RnA←(Rn)MOVA,@RiA←((Ri))MOVA,#dataA←dataMOVA,directA←(direct)工作寄存器Rn為目的操作數(shù)的傳送MOVRn,ARn←(A)MOVRn,#dataRn←dataMOVRn,directRn←(direct)直接地址direct為目的操作數(shù)的傳送MOVdirect,A(direct)←(A)MOVdirect,Rn(direct)←(Rn)MOVdirect,@Ri(direct)←((Ri))MOVdirect,#data(direct)←dataMOVdirect2,direct1(direct2)←(direct1)間接地址為目的操作數(shù)的傳送MOV@Ri,A((Ri))←(A)MOV@Ri,direct((Ri))←(direct)MOV@Ri,#data((Ri))←dataDPTR為目的操作數(shù)的傳送MOVDPTR,#data16DPTR←data163.3.1數(shù)據(jù)傳送類指令類型指令說(shuō)明助記符執(zhí)行的操作

片外RAM數(shù)據(jù)傳送寫數(shù)據(jù)到片外RAMMOVX@Ri,A((Ri))←(A)MOVX@DPTR,A((DPTR))←(A)從片外RAM讀數(shù)據(jù)MOVXA,@Ri(A)←((Ri))MOVXA,@DPTR(A)←((DPTR))ROM訪問(wèn)

MOVCA,@A+PC(A)←((A)+(PC))

MOVCA,@A+DPTR(A)←((A)+(DPTR))數(shù)據(jù)交換

XCHA,RnA?Rn

XCHA,@RiA?((Ri))

XCHA,directA?(direct)

XCHDA,@RiA0~3

?((Ri0~3))

SWAPAA0~3?A4~7堆棧操作

PUSHdirectSP←SP+1,((SP))←direct

POPdirectdirect←((SP)),SP←SP-13.3.1數(shù)據(jù)傳送類指令3.3.1數(shù)據(jù)傳送類指令

MOV[目的操作數(shù)],

[源操作數(shù)]一、內(nèi)部8位數(shù)據(jù)傳送指令*立即數(shù)不能作目的操作數(shù)。

源操作數(shù):指待傳送的數(shù)據(jù)源

目的操作數(shù):指數(shù)據(jù)源傳送到的目的地

3.3.1數(shù)據(jù)傳送類指令1)累加器A為目的操作數(shù)的指令(4條)助記符格式操作MOVA,RnA←(Rn)MOVA,directA←(direct)MOVA,@RiA←((Ri))MOVA,#dataA←data433.3.1數(shù)據(jù)傳送類指令累加器A寄存器R0內(nèi)部RAM40H內(nèi)部RAM50H40H50H30H10H例:已知相應(yīng)單元的內(nèi)容指令結(jié)果MOVA,#20H;A20H

A=20HMOVA,40H;A(40H)A=30HMOVA,R0;A(R0)A=50HMOVA,@R0;A((R0)),A(50H)A=10H執(zhí)行如下操作后443.3.1數(shù)據(jù)傳送類指令累加器A寄存器R0內(nèi)部RAM40H內(nèi)部RAM50H40H50H30H10H例:已知相應(yīng)單元的內(nèi)容執(zhí)行如下操作后:MOVA,#20H;,A=20HA20HMOVA,40H;,A=30HA(40H)MOVA,R0;,A=50HA(R0)MOVA,@R0;,A=(50H)=10HA((R0))453.3.1數(shù)據(jù)傳送類指令2)寄存器Rn為目的操作數(shù)的指令(3條)助記符格式操作MOVRn,ARn←(A)MOVRn,directRn←(direct)MOVRn,#dataRn←dataMOV

R0,#30H;R0=30HMOVR6,70H;R6=(70H)463.3.1數(shù)據(jù)傳送類指令3)直接地址為目的操作數(shù)的指令(5條)助記符格式操作MOVdirect,A(direct)←(A)MOVdirect,Rn(direct)←(Rn)MOVdirect2,direct1(direct2)←(direct1)MOVdirect,@Ri(direct)←((Ri))MOVdirect,#data(direct)←data3.3.1數(shù)據(jù)傳送類指令例:已知(30H)=1FH,(40H)=5FH,執(zhí)行指令:

MOV30H,#40H;(30H)←40H ;機(jī)器代碼:753040MOV30H,40H;(30H)←(40H) ;機(jī)器代碼:854030執(zhí)行后:(30H)=5FH,(40H)=5FH執(zhí)行后:(30H)=40H,(40H)=5FH3.3.1數(shù)據(jù)傳送類指令舉例:

MOVSP,#30H;SP=30H,給堆指針賦值

MOVPSW,#0001

1000B;選擇工作寄存器組3

;RS1=1,RS0=1

3.3.1數(shù)據(jù)傳送類指令4)間接地址為目的操作數(shù)的指令(3條)

將累加器A、片內(nèi)RAM單元內(nèi)容或立即數(shù)傳送至R0、R1指向的內(nèi)部RAM存儲(chǔ)單元中。

助記符格式操作MOV@Ri

,A((Ri))←(A)MOV@Ri

,direct((Ri))←(direct)MOV@Ri

,#data((Ri))←data例:分析如下程序段,指出指令執(zhí)行后20H和21H單元的結(jié)果。結(jié)果:(20H)=38H,(21H)=48H∵R0=20H∴MOV@R0,#38H等價(jià)于MOV20H,#38H3.3.1數(shù)據(jù)傳送類指令MOVR0,#20H;R020H;R0=20HMOV@R0,#38H;((R0))38H;(20H)=38HMOV21H,#48H;(21H)48H;(21H)=48H3.3.1數(shù)據(jù)傳送類指令二、16位數(shù)目標(biāo)地址傳送指令MOVDPTR,#data16將16位立即數(shù)送入數(shù)據(jù)指針DPTR,其中高位字節(jié)送DPH,低位字節(jié)送DPL例:

MOVDPTR,#2068H;機(jī)器代碼902068指令執(zhí)行后:DPTR=2068H

DPH=20H,DPL=68H3.3.1數(shù)據(jù)傳送類指令訪問(wèn)片外數(shù)據(jù)存儲(chǔ)器RAM的限制:只能用MOVX指令只能用寄存器間接尋址方式,即@DPTR或@Ri方式只能通過(guò)累加器A進(jìn)行讀寫三、累加器A與片外數(shù)據(jù)存儲(chǔ)器傳送指令助記符格式操作MOVX

A,@RiA←((Ri))MOVX

A,@DPTRA←((DPTR))MOVX

@Ri,A

((Ri))←AMOVX

@DPTR,A

((DPTR))←(A)例:已知(38H)=12H,試分析如下程序段的功能。注意:片內(nèi)RAM單元與片外RAM單元中的數(shù)據(jù)不能直接對(duì)傳。功能:將片內(nèi)RAM38H單元中的數(shù)12H傳送到片外RAM的1818H單元中。

能否直接將((DPTR))←((R0)),即MOVX@DPTR,@R03.3.1數(shù)據(jù)傳送類指令MOVR0,#38HMOVDPTR,#1818HMOVA,@R0 MOVX@DPTR,A;R0=38H;DPTR=1818H;A=((R0))=(38H)=12H;((DPTR))=A;(1818H)=12H3.3.1數(shù)據(jù)傳送類指令選用數(shù)據(jù)指針DPTR間接尋址、可尋址64K字節(jié)片外RAM。低8位(DPL)地址由P0口輸出;高8位(DPH)地址由P2口輸出;形成16位地址總線對(duì)片外RAM尋址存儲(chǔ)單元。另外,數(shù)據(jù)也是通過(guò)P0口輸入/輸出的。例:將片外RAM0738H單元內(nèi)容傳送給A。MOVP2,#07HMOVR0,#38HMOVXA,@R0;在MOVXA,@R0指令中,默認(rèn)使用P2端口傳送存儲(chǔ)單元的高8位地址,R0中的低8位地址由P0口傳送。

在使用此類指令時(shí)注意不要忘記對(duì)P2端口置值!3.3.1數(shù)據(jù)傳送類指令3.3.1數(shù)據(jù)傳送類指令例:已知A=4EH,R0=10H,(10H)=5FH;

執(zhí)行指令:XCHA,@R0 結(jié)果:A=5FH,(10H)=4EH。四、

交換指令(5條)助記符格式操作XCHA,RnA?RnXCHA,@RiA?((Ri))XCHA,directA?(direct)將累加器A的內(nèi)容與源操作數(shù)所指出的數(shù)據(jù)互相交換。1)字節(jié)交換指令3.3.1數(shù)據(jù)傳送類指令助記符格式操作XCHDA,@RiA3-0?((Ri)3-0)2.半字節(jié)交換指令將累加器A中低4位與Ri間接尋址單元內(nèi)容的低4位相互交換,而各自的高4位內(nèi)容不變。3.3.1數(shù)據(jù)傳送類指令

例:已知A=30H,(20H)=07H,執(zhí)行以下指令

MOVR0,#20HXCHDA,@R0MOV@R0,A;R0=20H;A3-0?(20H)3-0

,;((R0))=A,(20H)=37H

A=37H,

(20H)=00HA=30H(20H)=07H3.3.1數(shù)據(jù)傳送類指令例:已知A=86H,執(zhí)行指令,

SWAPA;A=68H

助記符格式操作SWAPAA3-0?A7-43.累加器A的高4位與低4位內(nèi)容互換指令將A的高、低兩半字節(jié)內(nèi)容相互交換。3.3.1數(shù)據(jù)傳送類指令五、堆棧操作指令助記符格式操作PUSHdirect

SP←SP+1,((SP))←(direct)POPdirect

(direct)←((SP)),SP←SP-1PUSH是進(jìn)棧指令:首先將堆棧指針SP的內(nèi)容加1,指向空單元;然后將直接尋址單元中的數(shù)據(jù)壓入到SP所指示的單元中。POP是出棧指令:首先將棧頂SP所指示的單元內(nèi)容彈出到直接尋址單元中;然后將SP的內(nèi)容減1,此時(shí)SP指向新的棧項(xiàng)。3.3.1數(shù)據(jù)傳送類指令例:設(shè)SP=30H,(50H)=80H,指令如下:

PUSH50HPOP40H

8050H…xx40H…SPxx31Hxx30H8050H…XX40H…8031Hxx30HSP;SP=SP+1,SP=31H;((SP))(50H),(31H)=(50H)=80H8050H…8040H…8031Hxx30HSP;(40H)((SP)),(40H)=(31H)=80H;SP=SP-1,SP=30H3.3.1數(shù)據(jù)傳送類指令例:設(shè)片內(nèi)RAM(30H)=55H,(40H)=AAH,程序如下:

MOVSP,#1FH PUSH30H PUSH40H POP30H POP40H程序執(zhí)行結(jié)果:(30H)=AAH,(40H)=55HSP=1FH壓入堆棧指令和彈出堆棧指令成對(duì)使用后,堆棧指針SP的內(nèi)容不變。程序功能:通過(guò)堆棧操作實(shí)現(xiàn)兩單元中內(nèi)容互相交換3.3.1數(shù)據(jù)傳送類指令MCS-51的程序存儲(chǔ)器主要用于存放應(yīng)用程序,但也存放應(yīng)用程序中必需用的常數(shù)(例如表格數(shù)據(jù))。MCS-5有兩條查表指令,用于從程序存儲(chǔ)器中讀取數(shù)據(jù)。六、查表指令助記符格式操作MOVCA,@A+PCPC←PC+1,A←((A)+(PC))MOVCA,@A+DPTRA←((A)+(DPTR))3.3.1數(shù)據(jù)傳送類指令例:字符0-F的ASCII碼如下所示,編寫指令,求出4的ASCII碼,結(jié)果存于A中。

MOVA,#04HMOVDPTR,#0203HMOVCA,@A+DPTR;A((A)+(DPTR))執(zhí)行前:A=04H執(zhí)行后:A=((A)+(DPTR))=(04H+0203H)=(0207H)=34H

ROM地址數(shù)值0212H460211H45......0209H360208H350207H340206H330205H320204H310203H30ASCII表首地址3.3.1數(shù)據(jù)傳送類指令基于DPTR的查表指令

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

特點(diǎn):

在64KB程序存儲(chǔ)空間內(nèi),表格放置位置和大小可以靈活變化。3.3.1數(shù)據(jù)傳送類指令表格位置受限制:數(shù)據(jù)表必須放置在查表指令之后的256字節(jié)范圍內(nèi)。表格大小受限制:不能超過(guò)255字節(jié)。

基于PC的查表:MOVCA,@A+PC

MOV——片內(nèi)數(shù)據(jù)存儲(chǔ)單元之間數(shù)據(jù)的傳送

(含片內(nèi)RAM區(qū),SFR區(qū))

MOVX——片外數(shù)據(jù)存儲(chǔ)單元與A之間的傳送

MOVC——程序存儲(chǔ)區(qū)(含片內(nèi)和片外)與A之間的數(shù)據(jù)傳送3.3.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送指令小結(jié)3.3.1數(shù)據(jù)傳送類指令MemoryMapidata區(qū)(00H-FFH)Rn(00H-1FH)data區(qū)(00H-7FH)SFR區(qū)(A,BDPH,DPL,SPPSW)code區(qū)(0000H-FFFFH)xdata區(qū)(0000H-FFFFH)AMOVXMOVCMOVMOV對(duì)MOV指令的限制非法指令MOVR1,R2MOVR2,@R03.3.1數(shù)據(jù)傳送類指令3.3.1數(shù)據(jù)傳送類指令數(shù)據(jù)傳送類指令對(duì)PSW的影響一般情況下不影響Cy,OV,AC,P標(biāo)志,但存在以下特例。特例1:目的操作數(shù)為A時(shí),影響P標(biāo)志

如:MOVA,#40H特例2:目的操作數(shù)為PSW時(shí),改變PSW中相應(yīng)標(biāo)志

如:MOVPSW,#00001000B3.3.1數(shù)據(jù)傳送類指令思考:1.指令的長(zhǎng)度與操作數(shù)的尋址方式有何關(guān)系?2.指令的執(zhí)行時(shí)間與操作數(shù)的尋址方式有何關(guān)系?3.3.2算術(shù)運(yùn)算類指令算術(shù)運(yùn)算指令共有24條:ADD:加法指令。ADDC:帶進(jìn)位加法,用于多字節(jié)加法。SUBB:帶借位減法,可用于單字節(jié)或多字節(jié)減法。MUL/DIV:乘、除法指令,僅適用于無(wú)符號(hào)數(shù)。DA:十進(jìn)制調(diào)整指令,用于BCD碼運(yùn)算。INC/DEC:加一、減一指令。

3.3.2算術(shù)運(yùn)算類指令A(yù)必須是目的操作數(shù),源操作數(shù)可以有多種形式。一、加法類指令1)加法指令(4條)助記符格式操作ADDA,RnA←A+(Rn)ADDA,directA←A+(direct)ADDA,@RiA←A+((Ri))ADDA,#dataA←A+data3.3.2算術(shù)運(yùn)算類指令例:設(shè)A=85H,R0=20H,(20H)=9EH,執(zhí)行指令,

ADDA,@R0 10000101 +)10011110

00100011

結(jié)果:A=23H、CY=1、OV=1、AC=1、P=1。對(duì)于無(wú)符號(hào)數(shù)運(yùn)算:

85H+9EH=133+158=291>255對(duì)于符號(hào)數(shù)運(yùn)算:

85H+9EH-123-98=-221<-128如何理解運(yùn)算結(jié)果?

結(jié)果超出無(wú)符號(hào)數(shù)范圍,故Cy=1

結(jié)果超出符號(hào)數(shù)范圍,故OV=13.3.2算術(shù)運(yùn)算類指令3.3.2算術(shù)運(yùn)算類指令帶進(jìn)位加法指令常用于多字節(jié)加法運(yùn)算。2)帶進(jìn)位加法指令(4條)助記符格式操作ADDCA,RnA←A+(Rn)+CYADDCA,directA←A+(direct)+CYADDCA,@RiA←A+((Ri))+CYADDCA,#dataA←A+data+CY3.3.2算術(shù)運(yùn)算類指令例:設(shè)A=4EH,R0=20H,(20H)=9EH,CY=1,執(zhí)行指令:ADDCA,@R0。其操作如下:

01001110 10011110 +)1

11101101程序執(zhí)行結(jié)果:A=EDH,CY=0,OV=0AC=1,P=0。3.3.2算術(shù)運(yùn)算類指令

例:

編寫代碼計(jì)算12A4H+0FE7H,結(jié)果存放于內(nèi)部RAM單元

41H和40H,前者存放高位字節(jié)。MOVA,#0A4H;被加數(shù)低8位→AADDA,#0E7H;加數(shù)低8位E7H與A相加,A=8BH,Cy=1MOV40H,A;A→(40H),存低8位結(jié)果MOVA,#12H;被加數(shù)高8位→AADDCA,#0FH;加數(shù)高8位+A+Cy,A=22HMOV41H,A;存高8位運(yùn)算結(jié)果12A40FE7+8B22提示:當(dāng)立即數(shù)以字母A-F開頭時(shí),必須用數(shù)字0與“#”隔開。3.3.2算術(shù)運(yùn)算類指令

MOV R0,#50H ;設(shè)置第一個(gè)數(shù)地址指針

MOV R1,#52H ;設(shè)置第二個(gè)數(shù)地址指針

MOV A,@R0 ;取低位

ADD A,@R1 ;兩數(shù)低位相加

MOV @R0,A ;存“和”低位

INC R0 INC R1 MOV A,@R0 ;取高位

ADDC A,@R1 ;兩數(shù)高位相加

MOV @R0,A ;存“和”高位

SJMP $;踏步指令,動(dòng)態(tài)停機(jī)

例:

編寫程序,實(shí)現(xiàn)兩個(gè)16位二進(jìn)制無(wú)符號(hào)數(shù)相加求和,其結(jié)果仍為16位。解:設(shè)片內(nèi)RAM50H、51H和52H、53H分別存放兩個(gè)16位無(wú)符號(hào)數(shù),要求將和存入50H、51H(低位在前,高位在后)。編寫程序如下:?jiǎn)栴}拓展:

兩個(gè)16bits數(shù)據(jù)相加之后,在最高位上產(chǎn)生進(jìn)位,應(yīng)該如何修改程序?3.3.2算術(shù)運(yùn)算類指令

將操作數(shù)所指定單元的內(nèi)容加1。3)加1指令(5條)助記符格式操作INCAA←A+1INCRnRn←Rn+1INCdirect(direct)←(direct)+1INC@Ri((Ri))←((Ri))+1INCDPTRDPTR←DPTR+13.3.2算術(shù)運(yùn)算類指令I(lǐng)NC指令特點(diǎn):INC指令不影響Cy、AC、OV標(biāo)志。除INCA指令外不影響P標(biāo)志。INCdirect指令的操作對(duì)象是IO端口時(shí),

執(zhí)行的是讀-修改-寫操作,如INCP1

讀:讀鎖存器,而不是引腳。

修改:加1

寫:寫入端口鎖存器3.3.2算術(shù)運(yùn)算類指令例:R0=30HINCR0;R0=31H,通常用于移動(dòng)指針I(yè)NC@R0;((R0))+1((R0)),例:R0=30H,(30H)=00H;(30H)+1(30H),(30H)=01H此處,該指令等同于INC30H指令

;R0內(nèi)容不變3.3.2算術(shù)運(yùn)算類指令對(duì)BCD碼加法運(yùn)算的結(jié)果自動(dòng)進(jìn)行修改只能跟在ADD和ADDC加法指令之后,不適用于減法A中的二進(jìn)制碼自動(dòng)調(diào)整為BCD碼4)二-十進(jìn)制調(diào)整指令助記符格式操作DAA修正BCD碼結(jié)果例:編寫指令,計(jì)算兩個(gè)十進(jìn)制數(shù)38、49的和。

解:38+49=87MOVA,#38H;A=38H(38的BCD碼)ADDA,#49H;A=38H+49H=81H,AC=1DAA;A=81H+06H=87H結(jié)果:A=87H(87的BCD碼)3.3.2算術(shù)運(yùn)算類指令實(shí)現(xiàn)了單字節(jié)BCD碼加法。3.3.2算術(shù)運(yùn)算類指令DAA執(zhí)行的操作:1)

執(zhí)行+06H操作,當(dāng)條件1成立時(shí):A3-0>9或AC=12)

執(zhí)行+60H操作,當(dāng)條件2成立時(shí):A7-4>9或CY=13)

執(zhí)行+66H操作,當(dāng)條件1,2均成立。3.3.2算術(shù)運(yùn)算類指令MCS-51指令系統(tǒng)中,只有帶借位的減法指令在進(jìn)行單字節(jié)減法運(yùn)算時(shí),應(yīng)先將進(jìn)位標(biāo)志位CY清0。

二、減法類指令1)帶借位的減法指令(4條)助記符格式操作SUBBA,RnA←A-(Rn)-CYSUBBA,directA←A-(direct)-CYSUBBA,@RiA←A-((Ri))-CYSUBBA,#dataA←A-data-CY如何實(shí)現(xiàn)多字節(jié)的減法?3.3.2算術(shù)運(yùn)算類指令

CLR C

;CY清0 MOV A,30H SUBBA,40H;A(30H)-(40H)-CY MOV 50H,A MOV A,31H SUBBA,41H ;A(31H)-(41H)-CY MOV 51H,A MOV A,32H SUBBA,42H ;A(32H)-(42H)-CY MOV 52H,A例:

編寫多字節(jié)減法運(yùn)算程序。解:設(shè)被減數(shù)在片內(nèi)RAM30H~32H單元中,減數(shù)在40H~42H單元中,低位數(shù)對(duì)應(yīng)低位地址,高位數(shù)對(duì)應(yīng)高位地址,其差值存入50H~52H單元中。如何實(shí)現(xiàn)BCD碼減法?3.3.2算術(shù)運(yùn)算類指令十進(jìn)制數(shù):XBCD-YBCD=XBCD+[-YBCD]補(bǔ)數(shù)[-YBCD]補(bǔ)數(shù)=9AH-YBCD例如:-2BCD的補(bǔ)數(shù)=9AH-02H=98H1的BCD碼是01H,99的BCD碼是99H。01H+99H=9AH9AH是兩位BCD碼數(shù)的模

3.3.2算術(shù)運(yùn)算類指令2)減1指令(4條)助記符格式操作DECAA←A-1DECRnRn←Rn-1DECdirect(direct)←(direct)-1DEC@Ri((Ri))←((Ri))-1除第一條指令影響奇偶標(biāo)志位外,其余指令操作均不影響PSW標(biāo)志。與加1指令一樣,對(duì)并行I/O口的輸出內(nèi)容進(jìn)行減1操作時(shí),其值將從I/O口的輸出鎖存器讀回,減1后的值仍保存于輸出鎖存器中,而不是對(duì)該輸出口的引腳上內(nèi)容進(jìn)行減1操作。3.3.2算術(shù)運(yùn)算類指令限定兩個(gè)8位無(wú)符號(hào)數(shù)相乘。乘積的高8位存于B,低8位存于A。如果乘積大于255(FFH),則溢出標(biāo)志位OV=1,否則清0,CY總是為0。三、乘法指令助記符格式操作MULABA×B→BA例

:閱讀以下程序,說(shuō)明程序功能。MOV A,#100MOV B,#4MUL AB MOV 30H,A MOV 31H,B ;A←100,A=64H;B←4,B=04H;A×B→BA;(30H)←A;(31H)←B

;B=01H;A=90H;(30H)=90H;(31H)=01H功能:實(shí)現(xiàn)兩個(gè)8位數(shù)乘法運(yùn)算,將乘積的高8位和低8位分別存入片內(nèi)RAM31H和30H單元。3.3.2算術(shù)運(yùn)算類指令3.3.2算術(shù)運(yùn)算類指令限定兩個(gè)無(wú)符號(hào)數(shù)的除法。商的整數(shù)部分存于A中,余數(shù)存于B中。清Cy,OV標(biāo)志。特例,如果除數(shù)為0,則指令執(zhí)行結(jié)果為不定值。這是無(wú)意義的,即0不能作除數(shù),此時(shí)OV=1。助記符格式操作DIVABA÷B的商→A,余數(shù)→B四、除法指令如何利用除法指令將十六進(jìn)制數(shù)轉(zhuǎn)換為BCD碼?3.3.2算術(shù)運(yùn)算類指令

A=F8H

=248=2*100+4*10+8

248/100=2…4848/10=4…8AB在計(jì)算機(jī)中BCD碼可以如何存放?3.3.2算術(shù)運(yùn)算類指令02R748R6按壓縮BCD碼方式020408按非壓縮BCD碼方式040840SWAPA48ADD3.3.2算術(shù)運(yùn)算類指令如何拼裝2個(gè)字節(jié)?3.3.2算術(shù)運(yùn)算類指令

MOV B,#100 DIV AB ;A中商為百位數(shù)

MOV R7,A ;百位數(shù)送R7 MOV A,#10 XCH A,B ;B中余數(shù)與A中除數(shù)10互換

DIV AB ;A中得十位數(shù),B中得個(gè)位數(shù)

SWAP A ADD A,B ;組合成2位BCD碼

MOV R6,A ;十位、個(gè)位數(shù)送R6 SJMP $例:

編寫將累加器A中十六進(jìn)制數(shù)轉(zhuǎn)換成3位BCD碼程序,結(jié)果的百位數(shù)存于R7.十位數(shù)和個(gè)位數(shù)存于R6。(胡-例3.3.7)解:應(yīng)用除法指令,將待轉(zhuǎn)換的數(shù)除以100,得百位數(shù),再將余數(shù)除以10,得十位數(shù)的余數(shù),即為個(gè)位數(shù)。編寫程序如下:3.3.2算術(shù)運(yùn)算類指令A(yù)DD、ADDC、SUBB:

適用于符號(hào)數(shù)和無(wú)符號(hào)數(shù)的運(yùn)算。

每次執(zhí)行后均會(huì)刷新Cy,OV,AC,P標(biāo)志。實(shí)現(xiàn)多字節(jié)加減法:

使用ADDC和SUBB指令。實(shí)現(xiàn)多字節(jié)BCD碼的加法:

使用ADDC和DA。INC、DEC指令:

不改變Cy,AC的狀態(tài),因此不要與DA指令配合使用。算數(shù)運(yùn)算指令小結(jié)指令的典型應(yīng)用加減法(單字節(jié)、多字節(jié);符號(hào)數(shù)、無(wú)符號(hào)數(shù));BCD碼加減法(單字節(jié)、多字節(jié));乘除法(單字節(jié)無(wú)符號(hào)數(shù))字節(jié)拼裝(非壓縮BCD碼壓縮BCD碼)3.3.2算術(shù)運(yùn)算類指令3.3.3邏輯運(yùn)算類指令邏輯運(yùn)算:邏輯與ANL、邏輯或ORL、邏輯異或XRL

取反CPL、清零CLR循環(huán)移位RR、RRC、RL、RLC。3.3.3邏輯運(yùn)算類指令一、邏輯與指令助記符格式操作ANLA,RnA←A∧RnANLA,directA←A∧(direct)ANLA,@RiA←A∧((Ri))ANLA,#dataA←A∧dataANLdirect,A(direct)←(direct)∧AANLdirect,#data(direct)←(direct)∧data3.3.3邏輯運(yùn)算類指令例如:已知A=8DH,R0=7EH,執(zhí)行指令:ANLA,R0

10001101(8DH) ∧)01111110(7EH) --------------------------------- 00001100(0CH)結(jié)果:A=0CH。功能:

用ANL指令屏蔽(清零)某些位,即將需屏蔽的位和0相與。3.3.3邏輯運(yùn)算類指令二、邏輯或指令助記符格式操作ORLA,RnA←A∨RnORLA,directA←A∨(direct)ORLA,@RiA←A∨((Ri))ORLA,#dataA←A∨dataORLdirect,A(direct)←(direct)∨AORLdirect,#data(direct)←(direct)∨data3.3.3邏輯運(yùn)算類指令例如:已知A=C0H,R0=55H,執(zhí)行指令ORLA,R0。

11000000(C0H) ∨)01010101

(55H)

-------------------------------- 11010101(D5H)邏輯或指令可以實(shí)現(xiàn)置位的功能。同時(shí)邏輯或指令也可用于組合信息,如字節(jié)拼裝。3.3.3邏輯運(yùn)算類指令助記符格式操作XRLA,RnA←A⊕RnXRLA,directA←A⊕(direct)XRLA,@RiA←A⊕((Ri))XRLA,#dataA←A⊕dataXRLdirect,A(direct)←(direct)⊕AXRLdirect,#data(direct)←(direct)⊕data三、邏輯異或指令3.3.3邏輯運(yùn)算類指令 例:已知A=A5H,要求對(duì)其高4位取反。

執(zhí)行指令XRLA,#11110000B10100101(A5H)

)11110000(F0H)

-------------------------------01010101(55H)

結(jié)果:A=55H。XRL操作可用于對(duì)某些位取反。XRL等同于不進(jìn)位加法。3.3.3邏輯運(yùn)算類指令五、累加器A取反指令

CPLA ;A←A將累加器A的內(nèi)容逐位取反。

字節(jié)清零、取反操作僅限于A。四、累加器A清零指令

CLRA ;A←0將累加器A的內(nèi)容清0。3.3.3邏輯運(yùn)算類指令六、累加器A循環(huán)移位指令RL A RR A RLC A RRC A RL/RR:A中內(nèi)容向左或向右自循環(huán)一位。RLC/RRC:將A的內(nèi)容連同CY循環(huán)左移或右移一位。限制:循環(huán)指令僅限于A3.3.3邏輯運(yùn)算類指令如何利用循環(huán)移位實(shí)現(xiàn)乘2,或除2運(yùn)算?0000000100000010AA0000010000000010AARLARRA3.3.3邏輯運(yùn)算類指令問(wèn)題拓展:多字節(jié)數(shù)右移一位如何實(shí)現(xiàn)?1000000100000010BA0100000010000001BA無(wú)符號(hào)數(shù)右移1位1100000010000001BA符號(hào)數(shù)右移1位時(shí)最高位要補(bǔ)1,保證符號(hào)位性質(zhì)不變!3.3.3邏輯運(yùn)算類指令邏輯運(yùn)算指令的小結(jié)限制:ANL,ORL,XRL指令第一操作數(shù)只能是A,或direct;

第一、第二操作數(shù)均不支持間接尋址。RL/RR/RLC/RRC僅僅適用于A。針對(duì)字節(jié)操作的CLR、CPL指令僅僅適用于A。3.3.3邏輯運(yùn)算類指令邏輯指令的典型應(yīng)用對(duì)字節(jié)中的特定位進(jìn)行清零、置1,或取反。

字節(jié)拼裝(非壓縮BCD碼壓縮BCD碼)字節(jié)移位(單字節(jié)、多字節(jié);左移、右移;無(wú)符號(hào)數(shù)、符號(hào)數(shù))求補(bǔ)運(yùn)算(單字節(jié)、多字節(jié))如何實(shí)現(xiàn)數(shù)據(jù)單元填充?控制轉(zhuǎn)移類指令屬于程序控制指令。

通過(guò)改變程序計(jì)數(shù)器PC中的內(nèi)容來(lái)實(shí)現(xiàn)的。作用:

改變程序執(zhí)行的方向,實(shí)現(xiàn)分支結(jié)構(gòu),或循環(huán)結(jié)構(gòu),

或調(diào)用子程序,

或從子程序返回。分類

轉(zhuǎn)移指令、

調(diào)用子程序指令、

返回指令。3.3.4控制轉(zhuǎn)移類指令

通過(guò)改變PC的內(nèi)容,以改變正在執(zhí)行的指令順序,轉(zhuǎn)向新的地址繼續(xù)執(zhí)行下去,從而實(shí)現(xiàn)程序分支。3.3.4控制轉(zhuǎn)移類指令一、轉(zhuǎn)移類指令3.3.4控制轉(zhuǎn)移類指令轉(zhuǎn)移指令分類無(wú)條件轉(zhuǎn)移SJMP:相對(duì)轉(zhuǎn)移,轉(zhuǎn)移范圍-128至+127字節(jié)AJMP:絕對(duì)轉(zhuǎn)移轉(zhuǎn)移范圍2KBLJMP:長(zhǎng)轉(zhuǎn)移,轉(zhuǎn)移范圍64KBJMP@A+DPTR:散轉(zhuǎn)條件轉(zhuǎn)移轉(zhuǎn)移范圍,-128至+127字節(jié)1)長(zhǎng)轉(zhuǎn)移指令(3字節(jié))

LJMP addr16 ;PC←addr16舉例2000H:LJMP2100H ;PC=2100H3.3.4控制轉(zhuǎn)移類指令1、無(wú)條件轉(zhuǎn)移指令(4條)3.3.4控制轉(zhuǎn)移類指令A(yù)JMP2100……xxxx2030Hxx2000H2100H2000H:0010000000000000

2030H:0010000000110000

27FFH:0010011111111111

AJMPaddr11;PC←PC+2,PC.10~PC.0←addr112)絕對(duì)轉(zhuǎn)移指令(2字節(jié))舉例2030H:AJMP 2100H2031H2032H:0010000000110010

2100H:0010000100000000AJMP指令的轉(zhuǎn)移范圍是2KB。要求轉(zhuǎn)移目的地址與AJMP指令的下一條指令位于同一個(gè)2KB區(qū)域內(nèi),即它們的高5位地址相同。3.3.4控制轉(zhuǎn)移類指令限制:3)相對(duì)轉(zhuǎn)移指令(2字節(jié))

SJMPrel;PC←PC+2+rel

3.3.4控制轉(zhuǎn)移類指令3.3.4控制轉(zhuǎn)移類指令SJMP指令詳解:80FExxxx2000Hxx2001H2002HHERE:SJMP HERE目的地址=PC當(dāng)前值+rel=2002H+FEH=2000HPC02HFEH+

00H丟棄MCS-51單片機(jī)的指令系統(tǒng)中沒有停機(jī)指令,通常使用SJMP構(gòu)成踏步指令使程序“原地踏步”,反復(fù)執(zhí)行SJMP指令。

例如: HERE: SJMP HERE或 SJMP $

其中$:符號(hào)地址,代表該指令的首地址若有中斷發(fā)生,或者CPU復(fù)位,就可以脫離該狀態(tài)。3.3.4控制轉(zhuǎn)移類指令4)間接尋址的無(wú)條件轉(zhuǎn)移指令

JMP @A+DPTR;PC←(A)+(DPTR)

3.3.4控制轉(zhuǎn)移類指令常用于多分支選擇轉(zhuǎn)移,由DPTR內(nèi)容決定多分支程序轉(zhuǎn)移表的首地址,由A的內(nèi)容選擇其中的某一個(gè)分支轉(zhuǎn)移程序(或指令),從而使用一條間接轉(zhuǎn)移指令就可以代替多條轉(zhuǎn)移指令,具有散轉(zhuǎn)功能,因而又稱散轉(zhuǎn)指令。變址尋址轉(zhuǎn)移指令與前述兩條轉(zhuǎn)移指令的主要區(qū)別是:前述兩條指令的轉(zhuǎn)移目標(biāo)地址是在匯編或編程時(shí)已確定的;該指令的轉(zhuǎn)移目標(biāo)地址是在程序運(yùn)行時(shí)動(dòng)態(tài)決定的,它的目標(biāo)地址是以DPTR的內(nèi)容為起點(diǎn)的256個(gè)字節(jié)地址空間范圍內(nèi)的指定地址。3.3.4控制轉(zhuǎn)移類指令JMP @A+DPTR的特點(diǎn):

例:設(shè)A為0~4之間的偶數(shù),執(zhí)行程序,根據(jù)A的內(nèi)容實(shí)現(xiàn)散轉(zhuǎn)。

3.3.4控制轉(zhuǎn)移類指令JMP@A+DPTR

024LOC

OBJ源程序

2000H:XXXXXX MOV DPTR,#JPTBL 2003H:XX JMP @A+DPTR 2004H:XXXX JPTBL: AJMP LABEL0 2006H:XXXX

AJMP LABEL1 2008H:XXXX

AJMP LABEL2 LABEL0:INCA SJMP$……

3.3.4控制轉(zhuǎn)移類指令標(biāo)號(hào)JPTBL,符號(hào)地址,其值=2004H,故DPTR=2004HA=2時(shí),PC=(DPTR)+(A)=2004H+02H=2006H;

2.條件轉(zhuǎn)移指令(10條)根據(jù)給定的條件進(jìn)行檢測(cè),

若條件得到滿足,則程序轉(zhuǎn)向指定的目標(biāo)地址去執(zhí)行;

否則,不轉(zhuǎn)移,繼續(xù)往下執(zhí)行程序。條件轉(zhuǎn)移指令都是相對(duì)轉(zhuǎn)移指令。

其轉(zhuǎn)移的范圍是以轉(zhuǎn)移指令的下一條指令的第一個(gè)字節(jié)地址為起始地址的-128~+127個(gè)字節(jié)內(nèi)。3.3.4控制轉(zhuǎn)移類指令條件轉(zhuǎn)移指令JZ/JNZ:測(cè)試A的值DJNZ:測(cè)試X≠0?CJNE:測(cè)試X≠Y?3.3.4控制轉(zhuǎn)移類指令1)累加器A判零轉(zhuǎn)移指令

JZ rel;PC=PC+2,

ifA=0,thenPC=PC+rel JNZ rel;3.3.4控制轉(zhuǎn)移類指令例:測(cè)試A的內(nèi)容是否為0

AGAIN: MOV A,P1;讀端口引腳

JZ AGAIN MOV 20H, A;非0則保存數(shù)據(jù)

3.3.4控制轉(zhuǎn)移類指令P1=0?YN2)比較轉(zhuǎn)移指令(判斷X=Y?)

CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE @Ri,#data,rel3.3.4控制轉(zhuǎn)移類指令3.3.4控制轉(zhuǎn)移類指令CJNE是三字節(jié)指令若第一操作數(shù)S1大于或等于第二操作數(shù)S2,則CY=0;若第一操作數(shù)S1小于第二操作數(shù)S2,則CY=1。操作數(shù)S1,S2的內(nèi)容保持不變!2)循環(huán)轉(zhuǎn)移指令

DJNZRn,rel;PC=PC+2;RnRn-1,ifRn≠0,thenPC=PC+rel;

DJNZdirect,rel;PC=PC+3;(direct)(direct)-1,if(direct)≠0,thenPC=PC+rel;

3.3.4控制轉(zhuǎn)移類指令指令執(zhí)行示意圖:使用DJNZ指令前,應(yīng)將循環(huán)次數(shù)賦值給計(jì)數(shù)器,即預(yù)置到工作寄存器或片內(nèi)RAM直接地址單元中。3.3.4控制轉(zhuǎn)移類指令3.3.4控制轉(zhuǎn)移類指令 MOV R0, #30H MOV R6, #10

CLR ANEXT: MOV @R0, A INC R0 DJNZ R6, NEXT……程序功能:對(duì)片上RAM30H為首地址的10個(gè)單元清零。第一次循環(huán):;R0=30H;R6=10;A=0;((R0))A,(30H)=0;R0=31H;R6=R6–1=9,;轉(zhuǎn)NEXT第二次循環(huán);

;(31H)=0;R0=32H;R6=8;轉(zhuǎn)NEXT閱讀程序,分析其功能:3.3.4控制轉(zhuǎn)移類指令

MOV R0, #30H MOV R6, #10 CLR ANEXT: MOV @R0, A INC R0

DEC R6

CJNE R6, #0, NEXTCJNE R6,#0,NEXT;當(dāng)R6≠0時(shí),程序轉(zhuǎn)向NEXT處,否則順序執(zhí)行。執(zhí)行CJNER6,#0,NEXT指令時(shí)R6的內(nèi)容不變!使用CJNE指令可以實(shí)現(xiàn)相同功能:二、調(diào)用子程序及返回指令1、調(diào)用子程序指令(2條)LCALL:長(zhǎng)調(diào)用,可以調(diào)用64KB范圍內(nèi)的子程序ACALL:絕對(duì)調(diào)用,限定調(diào)用2KB范圍內(nèi)的子程序指令執(zhí)行的操作:1)保存返回地址(保存16位返回地址,通過(guò)兩次入棧操作實(shí)現(xiàn))2)執(zhí)行跳轉(zhuǎn)操作,轉(zhuǎn)移到子程序的入口。3.3.4控制轉(zhuǎn)移類指令3.3.4控制轉(zhuǎn)移類指令LCALLaddr16

;PC←PC+3,

;SP←SP+1,((SP))←PC7~0

;SP←SP+1,((SP))←PC15~8

;PC←addr16ACALLaddr11

;PC←PC+2,

;SP←SP+1,((SP))←PC7~0

;SP←SP+1,((SP))←PC15~8

;PC10~0←addr11

2、返回指令(2條)

RET

;PC15~8←((SP)),SP←SP-1

;PC7~0←((SP)),SP←SP-1子程序返回指令。功能:將堆棧內(nèi)的返回地址送入PC,

使CPU返回到原斷點(diǎn)地址處,繼續(xù)執(zhí)行原程序。3.3.4控制轉(zhuǎn)移類指令RETI

;PC15~8←((SP)),SP←SP-1

;PC7~0←((SP)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論