第二章 單片機(jī)指令系統(tǒng)_第1頁(yè)
第二章 單片機(jī)指令系統(tǒng)_第2頁(yè)
第二章 單片機(jī)指令系統(tǒng)_第3頁(yè)
第二章 單片機(jī)指令系統(tǒng)_第4頁(yè)
第二章 單片機(jī)指令系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩104頁(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)介

第二章51單片機(jī)指令系統(tǒng)及程序設(shè)計(jì)補(bǔ)充:指令的字節(jié)數(shù)尋址方式指令系統(tǒng)及應(yīng)用舉例偽指令綜合程序舉例51系列單片機(jī)指令集含有111條指令

每條指令在執(zhí)行時(shí)要花去一定的時(shí)間,以機(jī)器周期為單位。按指令執(zhí)行時(shí)間分類:?jiǎn)沃芷?64條);雙周期(45條);4周期(2條)按指令的功能分類,可分為5大類:數(shù)據(jù)傳送類(29條);算術(shù)運(yùn)算類(24條)邏輯運(yùn)算及移位類(24);控制轉(zhuǎn)移類(17條)位操作類(17條)每條指令在程序存儲(chǔ)器ROM中占據(jù)一定的空間,以字節(jié)為單位。按指令所占字節(jié)數(shù)分類:?jiǎn)巫止?jié)(49條);雙字節(jié)(46條);3字節(jié)(16條)補(bǔ)充:指令的字節(jié)數(shù)在51單片機(jī)的指令系統(tǒng)中,因指令操作碼和操作數(shù)的不同,指令(在存儲(chǔ)器中)長(zhǎng)度也各不相同。分為單字節(jié)、雙字節(jié)和三字節(jié)。只要理解了指令占用這些字節(jié)是用來(lái)存放哪些量的,就自然會(huì)判斷不同的指令是多少字節(jié)指令了。1、操作碼占用一個(gè)字節(jié);2、8位立即數(shù)占用一個(gè)字節(jié),16位立即數(shù)占用兩個(gè)字節(jié);3、8位操作數(shù)地址占用一個(gè)字節(jié),16位操作數(shù)地址占用兩個(gè)字節(jié);4、CPU內(nèi)部的各種寄存器不占用指令字節(jié),如A、B、R0、R1、R2、R3、R4、R5、R6、R7、DPTR等。例如:1、MOVA,R0;這條指令是單字節(jié)指令,操作碼占一個(gè)字節(jié),操作數(shù)隱含在操作碼中。該指令的操作碼是11101000B,寄存器名以三位數(shù)代碼的形式在指令的后三位。2、MOVA,#07H;這是一個(gè)雙節(jié)字指令,其中MOV占用一個(gè)字節(jié),8位立即數(shù)07H占用一個(gè)字節(jié)。3、MOVDPTR,#0106H;這是一個(gè)三字節(jié)指令,MOV占用一個(gè)字節(jié),16位立即數(shù)0106H占用兩個(gè)節(jié)字;4、MOV07H,#07H;這是一個(gè)三字節(jié)指令,MOV占用一個(gè)字節(jié),8位地址07H占用一個(gè)字節(jié),8位立即數(shù)07H占用一個(gè)字節(jié)。指令的字節(jié)數(shù)與指令的運(yùn)行時(shí)間指令的字節(jié)多是否意味著指令周期就長(zhǎng)?指令字節(jié)數(shù)周期數(shù)指令說(shuō)明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)系51單片機(jī)指令的尋址方式立即尋址直接尋址寄存器尋址寄存器間接尋址基址變址尋址相對(duì)尋址位尋址尋址方式:指令中所規(guī)定的尋找操作數(shù)的方式七種尋址方式,一條指令可能含多種尋址方式立即尋址操作數(shù)直接就出現(xiàn)在指令中例:MOVA,#64H;A←立即數(shù)64H

ADDA,#05H

;A←(A)+立即數(shù)05H注意:符號(hào)“#”表明其后跟的是立即數(shù),立即數(shù)——就是數(shù)字量本身。直接尋址指令中直接給出了操作數(shù)所在單元的地址或名稱例:MOVR1,1FH;R1←(1FH)

MOV30H,4AH;30H←(4AH)在本單片機(jī)中規(guī)定:訪問(wèn)特殊功能寄存器SFR只能采用直接尋址方式。例如:MOVA,SP;A←(SP)MOVA,81H;A←(SP)

MOVP1,#5AH;P1←(#5AH)MOV90H,#5AH;P1←(#5AH)

MOVB,30H;B←(30H)相同相同寄存器尋址從寄存器中讀取操作數(shù)或存放操作數(shù)進(jìn)寄存器例:MOVA,B;A←(B)

MOV30H,R0

;30H←(R0)

MOVA,R1;A←(R1)寄存器間接尋址寄存器中的內(nèi)容是一個(gè)地址,由該地址單元尋址到所需的操作數(shù)注意:1)“間接”表示某寄存器中的“內(nèi)容”只是一個(gè)“單元地址”,這個(gè)地址單元中存放的數(shù)據(jù)才是要找的“操作數(shù)”。2)符號(hào)“@”表示“在…”,其含義與讀音皆同“at”。例:MOVR1,#30H;R1←立即數(shù)30H

]

MOV@R1,#0FH;30H←立即數(shù)0FH

MOVA,@R1;A←((30H))=#0FH在本單片機(jī)中訪問(wèn)特殊功能寄存器SFR只能采用直接尋址方式的原因:SFR分布在80H~0FFH范圍內(nèi),而52系列單片機(jī)有256字節(jié)的片內(nèi)RAM,其中的80H~0FFH的RAM與SFR所占地址重疊。MOVA,90H等效于MOVA,

P1屬直接尋址MOVA,@R0;[事先已知(R0)=#90H]執(zhí)行的操作:A←(90H)屬寄存器間接尋址,隨意寫的指令如:MOVA,85H則是非法的!于是規(guī)定:80H~0FFH范圍內(nèi)的RAM只能用寄存器間接尋址方式,而SFR只能用直接尋址方式。從而解決了地址沖突的問(wèn)題。例如:存儲(chǔ)器配置(片內(nèi)RAM)51片內(nèi)RAM

128字節(jié)(00H—7FH)52片內(nèi)RAM

256字節(jié)(00H—0FFH)00H20H2FH7FH1FH30H80HFFH52子系列才有的RAM區(qū)普通RAM區(qū)位尋址區(qū)工作寄存器區(qū)SFR分布在80H-FFH其中92個(gè)位可位尋址80HFFH51子系列128字節(jié)52子系列256字節(jié)只能直接尋址只能寄存器間接尋址基址加變址尋址

以16位的地址指針寄存器DPTR或16位的PC寄存器為基址寄存器,以累加器A為變址寄存器,兩者中的“內(nèi)容”形成一個(gè)16位的“地址”,該“地址”所指的存儲(chǔ)單元中的內(nèi)容才是操作數(shù)。例:[設(shè):A中已存有#A4H,DPTR中已存有#1234H]

MOVCA,@A+DPTR;A←((A)+(DPTR))操作:將A4H+1234H=12D8H單元中的數(shù)放進(jìn)累加器A相對(duì)尋址當(dāng)前PC值加上指令中規(guī)定的偏移量rel,構(gòu)成實(shí)際的操作數(shù)地址例:SJMPrel

操作:跳轉(zhuǎn)到的目的地址

=

當(dāng)前16位PC值+rel注意:1)“當(dāng)前PC值”指程序中下一條指令所在的首地址,是一個(gè)16位數(shù);2)符號(hào)“rel”表示“偏移量”,是一個(gè)帶符號(hào)的單字節(jié)數(shù),范圍是:-128—+127(80H—7FH),在實(shí)際編程中,“rel”通常用標(biāo)號(hào)代替位尋址指令中直接給出了操作數(shù)所在的位地址。例:CLRP1.0;P1.0←0

SETBACC.7;ACC.7←1

CPLC

;C←NOT(C)注意:1)位地址里的數(shù)據(jù)只可能是一個(gè)0

1

2)有的位地址十分明確,如

P1.0,ACC.7等,

有的位地址則“不太明確”,如:

[MOVA,17H;A←(17H),17H是字節(jié)地址]

MOVACC.0,17H;ACC.0←(17H),這里ACC.0是位地址所以該指令中的17H是22H單元的第7位片內(nèi)RAM中有128個(gè)位可按位尋址的位,位地址:00H—7FH分布在:20H—2FH單元;另外,在SFR中還有92個(gè)位可按位尋址00H20H2FH7FH1FH30H80HFFH52子系列才有的RAM區(qū)普通RAM區(qū)位尋址區(qū)工作寄存器區(qū)27H22H21H20H26H24H25H23H28H07060504030201000F0E0D0C0B0A090817161514131211101F1E1D1C1B1A191827262524232221202F2E2D2C2B2A292837363534333231303F3E3D3C3B3A393847464544434241402FH7F7E7D7C7B7A7978位地址總共128個(gè)可按位尋址的位單元地址17D7D6D5D4D3D2D1D051單片機(jī)的指令格式方括符[]表示可選項(xiàng)標(biāo)號(hào)代表指令所在地址,1-8個(gè)字母/數(shù)字,“:”結(jié)尾操作碼就是指令功能助記符,指令實(shí)體目的操作數(shù)源操作數(shù)注釋,以“;”開頭[標(biāo)號(hào):]操作碼[目的操作數(shù)][,源操作數(shù)][;注釋]51單片機(jī)指令集功能分五類,共111條指令五大類功能數(shù)據(jù)傳送類指令:(29條)算術(shù)運(yùn)算類指令:(24條)邏輯運(yùn)算及移位類指令:(24條)控制轉(zhuǎn)移類指令:(17條)位操作(布爾操作)類指令:(17條)內(nèi)部存儲(chǔ)器間傳送:(MOV——16條)外部數(shù)據(jù)存儲(chǔ)器與累加器間傳送:(MOVX——4條)程序存儲(chǔ)器向累加器傳送:(MOVC——2條)數(shù)據(jù)交換:(XCH,XCHD,SWAP——5條)堆棧操作:(PUSH,POP——2條)(一)數(shù)據(jù)傳送類指令(5種/29條)Rn:R0—R7@Ri:@R0,@R1#data:8位立即數(shù)#data16:16位立即數(shù)direct:直接地址rel:8位帶符號(hào)偏移量(一)數(shù)據(jù)傳送類指令(5種/29條)內(nèi)部存儲(chǔ)器間傳送指令(15條):

MOV類指令的操作方向總是后面的操作數(shù)指向前面的操作數(shù)!例:MOVA,30H——A(30H)

累加器Adirect直接尋址@Ri間址Rn寄存器Data立即數(shù)內(nèi)部數(shù)據(jù)傳送類指令的使用1,在使用傳送指令時(shí),可以根據(jù)實(shí)際情況選用恰當(dāng)尋址方式。上面給出的各種類型的傳送指令是INTEL公司在設(shè)計(jì)51的硬件時(shí)就已經(jīng)確定下來(lái)。編程人員只能像查字典一樣去查找、使用。不能根據(jù)主觀意愿去“創(chuàng)造”指令。

例如:要將R0中的數(shù)據(jù)傳送到R1中。如何使用指令去完成上面的操作?

MOVR1,R0

是否可以?回答是否定的!因?yàn)樵?1的指令系統(tǒng)中沒有此條指令!只能使用:

MOVA,R0或:MOV01H,00H

MOVR1,A

因此,必須從51的指令表中選擇使用指令。注意:MOVRn,Rn

MOV@Ri,@RiMOVRn,@Ri

MOV#data,A等等指令是非法指令。

2,以累加器A為目的寄存器的傳送指令會(huì)影響PSW中的奇偶位P,而其余的指令對(duì)PSW均無(wú)影響。3,要會(huì)正確地估計(jì)指令的字節(jié)。凡是指令中包含有立即數(shù)、直接地址的指令,都應(yīng)當(dāng)在原有的基礎(chǔ)上加1。

【舉例】:

mova,@Ri()個(gè)字節(jié)mova,direct()個(gè)字節(jié)movdirect,#data()個(gè)字節(jié)movdirect2,direct1()個(gè)字節(jié)4,對(duì)于同一問(wèn)題可以有不同的編程方法。使用不同的方法雖然都可以實(shí)現(xiàn)題目的要求,但從指令長(zhǎng)度、運(yùn)行時(shí)間和可閱讀性上等綜合因素考慮,不同的方法就有合理和不合理、優(yōu)化和繁雜之分。所以,在學(xué)習(xí)指令系統(tǒng)和編程時(shí)開始就要養(yǎng)成一個(gè)好的、合理的編程習(xí)慣。5,注意給程序進(jìn)行正確的注釋,這對(duì)于閱讀、編寫和修改程序都是非常重要的。下面就是一些注釋的例子:MOVA,30H ;(30h)→AMOVA,R0 ;(R0)→AMOV40H,30H ;(30h)→40hMOVA,@Ri ;((Ri))→A內(nèi)部傳送類指令舉例試編出把30h和40h單元內(nèi)容進(jìn)行交換。

RAMXY累加器A30H40HMOVA,30H

;(30h)→A

MOV30H,40H

;(40h)→30h

MOV40H,A

;A→40h數(shù)據(jù)傳送類指令(續(xù))外部數(shù)據(jù)存儲(chǔ)器與累加器間傳送(5條):MOVX類指令可在累加器與以@DPTR或@Ri所代表的外部RAM之間進(jìn)行數(shù)據(jù)傳送。例如:

MOVXA,@DPTR——A((DPTR))MOVXA,@Ri——A

((Ri))MOVX@DPTR,A——(DPTR)(A)MOVX@Ri,A——(Ri)(A)外部RAM的字節(jié)傳送指令舉例【解】:外部RAM中的數(shù)據(jù)是不能直接傳送的,因此必須使用兩次MOVX指令完成此操作。

ORG2000H

MOVDPTR,#88H;為8位指針賦值 MOVXA,@DPTR;取x到累加器AMOVDPTR,#1818H;為16位指針賦值 MOVX@DPTR,A;x送RAM的1818h單元試用R0,R1作間址寄存器編寫程序,看看會(huì)遇到什么問(wèn)題?

已知外部RAM的88H單元有一個(gè)數(shù)x,試編程將x送外部RAM的1818H單元。程序存儲(chǔ)器向累加器傳送指令(2條):MOVCA,@A+DPTR

MOVCA,@A+PC

——通常稱為查表指令,尋址方式屬:“基址加變址尋址”數(shù)據(jù)傳送類指令(續(xù))@A+DPTR或@A+PC指向程序存儲(chǔ)器中的某單元。擬傳送給累加器ACC的數(shù)據(jù)就是程序中事先寫進(jìn)去的表格數(shù)據(jù)。這些表格數(shù)據(jù)往往用偽指令DB,DW等定義在程序中。外部ROM的字節(jié)傳送指令舉例已知累加器A中存有0~9范圍內(nèi)的數(shù),試用查表指令編寫出查找出該數(shù)平方的程序。采用DPTR作基址寄存器:

設(shè)平方表的首地址為2000h,累加器A中的內(nèi)容恰好是查表的偏移量。首先將表的起始地址2000h送入DPTR中。

MOVDPTR,#2000H;指針賦值MOVCA,@A+DPTR;平方值送AROM01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h2,采用PC作基址寄存器:與DPTR不同,使用PC作為基地址時(shí),必須對(duì)累加器A的數(shù)據(jù)進(jìn)行修正,以保證@a+pc恰好找到待查的平方值地址。

ORG1FFBH1FFBH74data

ADDA,#data;data=02h1FFDH83H

MOVCA,@A+PC;PC=1FFE1FFEH80FEH

SJMP$2000H00H

DB0 ;平房表首址2001H01H

DB12002H04H

DB42003H09H

DB92004H10H

DB162005H19H

DB25

:::2009H51H

DB81

ENDdata為MOVC指令首地址與表頭地址之間的單元數(shù)。74hdata83h80hFEh01491625364964812000h2009h2008h2007h2006h2005h2004h2003h2002h2001h1FFFh1FFEh1FFDh1FFCh1FFBh返回?cái)?shù)據(jù)傳送類指令(續(xù))數(shù)據(jù)交換指令(5條):為提供一種方便的累加器和寄存器或RAM之間的數(shù)據(jù)交換。避免了使用一般mov傳送指令完成交換時(shí)的不便。XCHA,direct(字節(jié)互換)XCHA,@Ri(字節(jié)互換)XCHA,Rn(字節(jié)互換)(A)(direct)[或((Ri)),或(Rn)]XCHDA,@Ri累加器Acc的低4位與((Ri))的低4位互換,各自的高4位不變SWAPA累加器Acc的低4位與自身的高4位互換數(shù)據(jù)交換指令舉例MOVP2,#0

MOVR1,#20h;指針賦初值 MOVXa,@R1;x→a XCHa,@R1;交換a?(20h),y→aMOVX@R1,a;y→(20h)片外RAM片內(nèi)RAMy

(x)片外RAMx(y)(y)

x20h20h累加器A123舉例:已知,片外RAM20h單元、內(nèi)部RAM20h單元分別有數(shù)x和y,試編程互將兩數(shù)相交換。堆棧操作指令(2條):√堆棧區(qū)由特殊功能寄存器堆棧指針SP

管理√堆棧區(qū)可以安排在RAM區(qū)任意位置,一般不安排在工作寄存器區(qū)和可按位尋址的RAM區(qū),而是放在RAM區(qū)的靠后的位置√尋址方式為直接尋址√堆棧總是指向棧頂√通常PUSH與POP兩條指令成對(duì)使用數(shù)據(jù)傳送類指令(續(xù))進(jìn)棧操作:PUSHdirect;sp+1→sp,(direct)→(sp)出棧操作:POPdirect;(sp)→(direct),sp-1→sp【舉例】:設(shè)片內(nèi)RAM的30h單元存有x,40h單元存有y。試將兩個(gè)單元內(nèi)容互換。

RAMxyyxyx棧底SP=07h40h30hpush30h

push40h

pop30h

pop40h例如:設(shè)(A)=7BH;(35H)=11H并且知道(SP)=60HPUSHACC;61H#7BHPUSH35H;62H(35H)即:62H#11HPOPACC;A(62H)即:A#11HPOP5AH;5AH(61H)即:5AH#7BH執(zhí)行下列程序后,A中的內(nèi)容為多少?該程序是一個(gè)查表程序。

ORG2100H;各指令的地址為:MOVA,#09H;2100H

MOVCA,@A+PC;2102HRET;2103HORG210AHTAB:DB0C0H;210AHDB0F9H;210BHDB0A4H;210CHDB0B0H;210DH

運(yùn)行結(jié)果:A=0A4H設(shè)累加器A中為16進(jìn)制表示(00H~09H)的BCD碼。試編程將其轉(zhuǎn)換為ASCII碼,并將其送到50H地址單元中。這是一個(gè)數(shù)值轉(zhuǎn)換程序。解:

MOVR0,AMOVDPTR,#TABASC

MOVCA,@A+DPTRMOV50h,ATABASC:DB30H,31H,32H,33H,34H,35HDB36H,37H,38H,39H

將A中存放的2位BCD碼轉(zhuǎn)換為ASCⅡ碼,并送到50H,51H單元中。解:ORG0030HMOVB,A

ANLA,#0FH

ADDA,#30HMOV51H,AMOVA,B

SWAPAANLA,#0FHADDA,#30HMOV50H,ARET算術(shù)運(yùn)算指令不帶進(jìn)位的加法指令(ADD)1、加法指令:帶進(jìn)位的加法指令(ADDC)加1指令(INC)2、減法指令:帶進(jìn)位的減法指令(SUBB)減1指令(DEC)3、十進(jìn)制調(diào)整指令:(DAA)4、乘法和除法指令:(MULDIV)加法指令(一):不帶進(jìn)位的加法指令格式: ADDA,Rn ;(A)+(Rn)→A ADDA,direct ;(A)+(direct)→A ADDA,@Ri ;(A)+((Ri))→A ADDA,#data ;(A)+data→A【注意】:1.參加運(yùn)算的數(shù)據(jù)都應(yīng)當(dāng)是8位的,結(jié)果也是8位并影響PSW。2.根據(jù)編程者的需要,8位數(shù)據(jù)可以是無(wú)符號(hào)數(shù)(0~255),也可以是有符號(hào)數(shù)(-127~+128)。3.不論編程者使用的數(shù)據(jù)是有符號(hào)數(shù)還是無(wú)符號(hào)數(shù),CPU都將它們視為補(bǔ)碼進(jìn)行運(yùn)算并影響PSW。不帶進(jìn)位的加法指令舉例(一)試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOVA,#19HCy=0; ADDA,#66HAC=0

OV=025A=00011001BP=1

+102data=01100110B127001111111B1,若兩數(shù)都是無(wú)符號(hào)數(shù),則因Cy=0無(wú)溢出,25+102=127。2,若兩個(gè)數(shù)是有符號(hào)數(shù),則因OV=0無(wú)溢出。cy000C7’C6’AC不帶進(jìn)位的加法指令舉例(二)試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 MOVA,#5AHCy=0; ADDA,#6BHAC=0;

OV=190A=01011010BP=0

+107data=01101011B

197

011000101B

C7’C6’1,若兩數(shù)是無(wú)符號(hào)數(shù),因Cy=0無(wú)溢出:90+107=1972,若兩數(shù)是有符號(hào)數(shù),因OV=1,故有溢出,兩個(gè)正數(shù)相加后變?yōu)樨?fù)數(shù),很明顯結(jié)果是不正確的。加法指令(二):帶進(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指令。加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均無(wú)影響。

2,由于上面的原因,INC指令不能作為一般的數(shù)據(jù)算術(shù)運(yùn)算使用,INC主要用于修改數(shù)據(jù)指針等控制、循環(huán)語(yǔ)句中使用。編程舉例已知M1、M2單元中存有兩個(gè)16位無(wú)符號(hào)數(shù)x1、x2(低位在前)。試寫出x1+x2,并將結(jié)果放入M1、M1+1單元(低8位在M1單元)。設(shè)兩數(shù)之和不會(huì)超過(guò)16位(65535)。RAMX2data8~15X2data0~7X1data8~15X1data0~7M1M1+1M2M2+1【解】:MOVR0,#M1;x1指針賦初值MOVR1,#M2;x2指針賦初值MOVA,@R0;取x1低8位送AADDA,@R1;x1與x2低8位相加MOV@R0,a;低8位和送m1單元INCR0 INCR1 ;修改指針MOVA,@R0;取x1的高8位送AADDCA,@R1

;x1與x2的高8位和Cy相加MOV@R0,A;結(jié)果送M1+1單元減法指令(帶進(jìn)位的減法指令)在51單片機(jī)的指令系統(tǒng)中,只有:

①帶進(jìn)位的減法SUBB

②減一DEC兩種指令。減法指令:格式: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è)問(wèn)題無(wú)論相減兩數(shù)是無(wú)符號(hào)數(shù)還是有符號(hào)數(shù),減法操作總是按有符號(hào)數(shù)來(lái)處理、影響PSW中相關(guān)的標(biāo)志(詳見舉例)。在51單片機(jī)的指令系統(tǒng)中沒有不帶Cy的減法,所以在使用SUBB指令前必須使用一條清除Cy的指令:CLRC。減法指令應(yīng)用舉例試分析執(zhí)行下列指令后累加器A和PSW中各標(biāo)志的變化。 CLRC MOVA,#52H01010010B=82 SUBBA,#0B4H10110100B=-76

82a=01010010

–-76

data=10110100

158110011110=-98

手工計(jì)算

C7’

C6’

AC

101

【分析】:CPU的計(jì)算得-98,很明顯答案是錯(cuò)誤的。原因是OV=1,既產(chǎn)生了溢出。所以,對(duì)于符號(hào)數(shù)的減法在運(yùn)算后一定要檢測(cè)OV=1減一指令格式: DECA;累加器A減一 DECRn;(Rn)-1→Rn DECdirect;內(nèi)存單元數(shù)據(jù)減一 DEC@Ri;內(nèi)存單元數(shù)據(jù)減一【注意】:1,除了第一條對(duì)PSW的P有影響外,其余對(duì)PSW均無(wú)影響。

2,由于上面的原因,DEC指令一般不作為數(shù)據(jù)算術(shù)運(yùn)算使用(因?yàn)椴荒軐?duì)PSW的OV等位產(chǎn)生影響,它主要用于修改數(shù)據(jù)指針在控制、循環(huán)語(yǔ)句中使用)。設(shè)(R0)=7FH,在內(nèi)RAM中,(7EH)=00H,(7FH)=40H

執(zhí)行:

DEC@R0DECR0DEC@R0答:(R0)=7EH,(7EH)=0FFH,(7FH)=3FH。

結(jié)果為:(R0)=

,(7EH)=

,(7FH)=

。

十進(jìn)制調(diào)整指令在CPU進(jìn)行BCD碼運(yùn)算時(shí),必須在運(yùn)算后進(jìn)行十進(jìn)制調(diào)整,這是因?yàn)?,CPU在運(yùn)算時(shí),并不知道數(shù)據(jù)是二進(jìn)制還是BCD碼。格式:DAA;若AC=1或A3~0>9,則(A)+06h→A;若Cy=1或A7~4>9,則(A)+60h→A

;若上述2個(gè)條件均滿足,則A←(A)+66h【注意】:1,DAA指令必須緊跟在加法指令之后;2,DAA指令只適用于加法指令的調(diào)整。BCD碼是指“用二進(jìn)制表達(dá)的十進(jìn)制數(shù)”。如:十進(jìn)制數(shù)20可以用二進(jìn)制數(shù)00010100B表示;也可以用十六進(jìn)制數(shù)14H表示;還可以用BCD碼00100000B或20H

表示。4個(gè)二進(jìn)制位就可以表示一位BCD碼:0000~1001可表示十進(jìn)制數(shù)(BCD數(shù))0~9;

8個(gè)二進(jìn)制位就可以表示兩位壓縮的BCD碼:00000000~10011001表示00~99。十進(jìn)制調(diào)整指令應(yīng)用舉例BCD加法運(yùn)算:試寫出完成85H+59H的BCD碼的加法程序。 MOVA,#85H ADDA,#59H DAA SJMP$85a=10000101B+59dtat=01011001B1441101111

0B低4位〉9,所以加06h

+00000110B

11100100B高4位〉9,所以加60h

01100000B

101000100B結(jié)果為144h(1包含在Cy)【注意】:144H是用16進(jìn)制數(shù)來(lái)表示十進(jìn)制,即BCD碼。乘法和除法指令這是51單片機(jī)唯一的一類單字節(jié)4周期指令,它相當(dāng)于4條加法指令的運(yùn)行時(shí)間。

格式:MULAB;a×b=ba(b存高8位,a存低8位)

DIVAB;a÷b=a…b(a存商,b存余數(shù))【注意】:指令對(duì)標(biāo)志的影響:

1,在乘法指令中對(duì)PSW的影響有Cy、OV、和P。具體如下:Cy←0;P取決于A中“1”的個(gè)數(shù);OV表明積的大小。當(dāng)積超過(guò)255(B≠0)時(shí),OV=1。

2,在除法指令中,Cy、P與乘法相同。在執(zhí)行除法指令時(shí),若B=0時(shí)OV=1,表示除數(shù)=0除法無(wú)意義,其余情況下OV被復(fù)位。BCD:MOVR0,#30H;R0指向被加數(shù)的十位、個(gè)位,MOVR1,#40H;R1指向加數(shù)的十位、個(gè)位,MOVA,@R0ADDA,@R1;被加數(shù)的十位、個(gè)位+加數(shù)的十位、個(gè)位DAA;十進(jìn)制調(diào)整MOV@R0,A;送結(jié)果6位BCD碼加法程序。設(shè)被加數(shù)放在32H、31H、30H單元中,加數(shù)放在42H、41H、40H單元中,和放在32H、31H、30H中。INCR0;R0指向被加數(shù)的千位、百位INCR1;R1指向加數(shù)的千位、百位MOVA,@R0

ADDCA,@R1;被加數(shù)的千位、百位+加數(shù)的千位、百位DAA;十進(jìn)制調(diào)整MOV@R0,A;送千位、百位的和INCR1INCR0MOVA,@R0ADDCA,@R1DAAMOV@R0,ARET無(wú)符號(hào)數(shù)的乘除運(yùn)算。用MUL和DIV指令實(shí)現(xiàn)A中的二個(gè)BCD數(shù)的相乘,并再轉(zhuǎn)換成二位BCD碼放于A中。解:定義數(shù)據(jù)緩沖區(qū):入口:A—壓縮BCD數(shù);出口:A存放積。MULBCD:MOVB,#10H;10H=16

DIVAB;A中的BCD數(shù)除16分成兩個(gè)BCD數(shù),;高字節(jié)在A中,低字節(jié)在B中。

MULAB;兩個(gè)BCD數(shù)相乘,積在A中MOVB,#0AH

DIVAB;積除10,A中為十位數(shù),B中為個(gè)位數(shù)SWAPA;A中的十位數(shù)置高4位中

ORLA,B;數(shù)位組合,A中高4位為積的十位數(shù),;低4位為個(gè)位數(shù)RET邏輯運(yùn)算指令功能:對(duì)2個(gè)8位二進(jìn)制數(shù)進(jìn)行邏輯與、或、非和異或操作;特點(diǎn):除了以累加器A為目標(biāo)寄存器的指令影響PSW的P位外,其余指令對(duì)PSW均無(wú)影響。

1,邏輯與運(yùn)算指令(ANL) 2,邏輯或運(yùn)算指令(ORL) 3,邏輯異或指令(XRL) 4,累加器清零和取反指令(CLR&CPL)5,循環(huán)移位指令邏輯與運(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上面的指令也可以分為兩類:1,以累加器A為目標(biāo)寄存器的邏輯運(yùn)算指令;2,以內(nèi)存單元為目標(biāo)的邏輯運(yùn)算指令。應(yīng)用舉例(一)已知R0=30H和(30H)=0AAH,試問(wèn)執(zhí)行下列指令后累加器A和30H單元中的內(nèi)容是什么?

1,MOVA,#0FFH2, MOVA,#0FH ANLA,R0 ANLA,30H(A=30H,(30H)=0AAH)(A=0AH,(30H)=0AAH) 3, MOVA,#0F0H4, MOVA,#80H ANLA,@R0 ANL30H,A(A=0A0H,(30H)=0AAH)(A=80H,(30H)=80H)很明顯:ANL操作可以從某個(gè)存儲(chǔ)單元中取出某幾位,而把其它的為屏蔽掉(清零)。應(yīng)用舉例(二)已知:M1單元有一個(gè)9的ASCII碼39H,試編程將其變?yōu)锽CD碼。解:1,使用ANLdirect,#data的指令。ANLM1,#0FH解:2,使用ANLA,#data指令。

MOVA,M1 ANLA,#0FH MOVM1,A邏輯或運(yùn)算指令格式:ORLA,Rn ;(A)∨(Rn)→AORLA,direct;(A)∨(direct)→A ORLA,@Ri ;(A)∨((RI))→A ORLA,#data;(A)∨data→A ORLdirect,A;(direct)∨(A)→direct ORLdirect,#data;(direct)∨data→direct同與運(yùn)算一樣,上面的指令也可以分為兩類:1,以累加器A為目標(biāo)寄存器的邏輯運(yùn)算指令;2,以內(nèi)存單元為目標(biāo)的邏輯運(yùn)算指令。應(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)算可以“置位”某些位。邏輯異或運(yùn)算指令格式:XRLA,Rn ;(A)⊕(Rn)→A XRLA,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ù)的某幾位變反。舉例已知:外部RAM的30H單元中有一個(gè)數(shù)AAH,現(xiàn)要將其高4位不變,低4位取反,試編程。解1,利用MOVXA,@Ri指令: MOVR0,#30H10101010 MOVXA,@R0⊕

00001111 XRLA,#0FH1010

0101 MOVX@R0,A解2,利用MOVXA,@DPTR

MOVDPTR,#0030H MOVXA,@DPTR XRLA,#0FH MOVX@DPTR,A累加器清零和取反指令用傳送指令可以實(shí)現(xiàn)對(duì)累加器A的清零和取反操作,但是它們都是雙字節(jié)指令。在51單片機(jī)的指令系統(tǒng)中專門設(shè)計(jì)了單字節(jié)、單周期對(duì)累加器清零和取反的指令。格式: CLRA;累加器清零 CPLA;累加器取反

邏輯運(yùn)算指令應(yīng)用舉例設(shè)X、Y和Z分別存在X、Y和Z單元。試編出能實(shí)現(xiàn)此電路功能的程序,并將結(jié)果送入F單元。⊕+XYZF解:MOVA,X ANLA,Y ;X∧Y→A MOVR1,A;送R1暫存 MOVA,Y XRLA,Z ;Y∨Z→A CPLA ;A取反 ORLA,R1;(X∧Y)∨(Y∨Z)→A MOVF,A ;A→F移位指令雖然51單片機(jī)只有4條移位指令,但它可以處理所有移位問(wèn)題。格式:

【注意】:只能對(duì)累加器A進(jìn)行移位。RLA左環(huán)移累加器A累加器ACy累加器ACy累加器ARRCA

帶進(jìn)位位右環(huán)移RRA右環(huán)移RLCA帶進(jìn)位位左環(huán)移舉例(一)已知:在M1和M1+1單元有一個(gè)16位數(shù)(M1存低8位),試編程將其擴(kuò)大2倍(設(shè)結(jié)果小于65535)。解:擴(kuò)大2倍可以用左移一位來(lái)實(shí)現(xiàn)。

CLRC ;清除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ù)回送舉例(二)已知:M1、M2單元中有2個(gè)BCD碼,試編程將其緊縮為一個(gè)字節(jié)并存入M1單元。解:MOVR1,#M1

MOVA,@R1

SWAPA INCR1

ORLA,@R1

MOVM1,A0000BCD10000BCD2M1M1+1BCD10000BCD1BCD20000BCD1累加器A書上部分例題編制一個(gè)循環(huán)閃爍燈的程序。有8個(gè)發(fā)光二極管,每次其中某個(gè)燈閃爍點(diǎn)亮5次后,轉(zhuǎn)移到下一個(gè)燈閃爍10次,循環(huán)不止。本程序的硬件連接如圖所示。當(dāng)P1.i輸出高電平時(shí),LED燈亮,否則不亮。

MOVA,#01H;燈亮初值SHIFT:LCALLFLASH;調(diào)閃亮5次子程序RRA;右移一位SJMPSHIFT;循環(huán)FLASH:MOVR2,#05H;閃爍5次計(jì)數(shù)FLASH1:MOVP1,A;點(diǎn)亮LCALLDELAY;延時(shí)MOVP1,#00H;熄滅LCALLDELAY;延時(shí)DJNZR2,FLASH1;循環(huán)5次RETDELAY:MOVR6,#255;1TmLOOP1:MOVR7,#255LOOP2:DJNZR7,LOOP2;2TmNOP位操作指令特點(diǎn):操作數(shù)不是字節(jié),而是某一位。每位的取值只能是“0”或“1”,因而也稱之為布爾變量操作。

布爾變量存在于片內(nèi)RAM的位尋址區(qū)(20H~2FH)、11個(gè)可以按位尋址的SFR。1.位傳送指令2.位置位、位清零和位取反指令3.位運(yùn)算指令4.位控制轉(zhuǎn)移指令1.位傳送指令格式:MOVC,bit其中:C為PSW中的Cy; MOVbit,C bit為布爾變量的位地址。

【解】:兩個(gè)位互換必須找一個(gè)位作為緩沖位。MOVC,00HMOV01H,C MOVC,7FH MOV00H,C MOVC,01H MOV7FH,C舉例:試將00H位和7FH位中的內(nèi)容互換。2.位置位、位清零和取反指令格式: CLRC ;0→Cy CLRbit ;0→(bit) SETBC ;1→Cy SETBbit ;1→(bit) CPLC ;/C→C CPLbit ;/(bit)→bit例:編程通過(guò)P1.0線連續(xù)輸出128個(gè)寬度為5個(gè)機(jī)器周期長(zhǎng)的方波。解:MOVR0,#128CLRP1.0LOOP:CPLP1.0NOPNOPDJNZR0,LOOP3.位運(yùn)算指令格式: ANLC,bit ;C∧(bit)→C ANLC,/bit;C∧/(bit)→C ORLC,bit ;C∨(bit)→C ORLC,/bit ;C∨/(bit)→C

4.位控制轉(zhuǎn)移指令(一)以Cy內(nèi)容為條件的轉(zhuǎn)移指令格式:JCrel ;若Cy=1,則(PC)+2+rel→PC ;若Cy=0,則(PC)+2→PC JNCrel ;若Cy=0,則(PC)+2+rel→PC ;若Cy=1,則(PC)+2→PC(二)以位地址內(nèi)容為條件的轉(zhuǎn)移指令格式:JBbit,rel;若(bit)=1,則(PC)+3+rel→PC ;若(bit)=0,則(PC)+3→PC

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

解:ORG0000HMOVA,30H

CJNEA,40H,LOOP1

SETB7FHSJMP$LOOP1:JCLOOP2MOV20H,AMOV21H,40HSJMP$LOOP2:MOV20H,40HMOV21H,ASJMP$

比較內(nèi)部RAM的30H和40H單元中的二個(gè)無(wú)符號(hào)數(shù)的大小,將大數(shù)存入20H單元,小數(shù)存入21H單元,若二數(shù)相等,則使內(nèi)RAM的第127位置1。

試判斷30H中的數(shù)的正負(fù),若為正數(shù),存入20H單元;若為負(fù)數(shù)則存入21H單元。解:

ORG0000HMOVA,30H

JB

ACC.7,LOOPMOV20H,ASJMP$LOOP:MOV21H,ASJMP$

控制轉(zhuǎn)移指令

1,無(wú)條件轉(zhuǎn)移指令 2,條件轉(zhuǎn)移指令 3,子程序調(diào)用和返回 4,空操作指令

1,無(wú)條件轉(zhuǎn)移指令格式:LJMPaddr16長(zhǎng)轉(zhuǎn)移指令,尋址范圍65535;AJMPaddr11絕對(duì)轉(zhuǎn)移,尋址范圍2K;

SJMPrel短轉(zhuǎn)移,轉(zhuǎn)移范圍(+127~-128);JMP@A+DPTR變址轉(zhuǎn)移,尋址范圍65535。02Haddr15~8addr7~0a10~8

00001a7~a080Hrel73HLJMP指令(三字節(jié))AJMP指令(雙字節(jié))SJMP指令(雙字節(jié))JMP指令(單字節(jié))長(zhǎng)轉(zhuǎn)移指令:(三字節(jié)雙周期指令)指令執(zhí)行時(shí),將指令碼中的addr16送入PC中,使程序無(wú)條件的轉(zhuǎn)向addr16所指向的新地址執(zhí)行程序。【舉例】:已知某單片機(jī)的監(jiān)控程序地址為A080H,試問(wèn)用什么方法使單片機(jī)開機(jī)后自動(dòng)的轉(zhuǎn)向該監(jiān)控程序?【解】:因?yàn)閱纹瑱C(jī)上電時(shí),PC=0000H,所以在0000H單元存放一條LJMP0A080H的指令即可。LJMPA0H80HROM0000H0001H0002H0003H絕對(duì)轉(zhuǎn)移指令:雙字節(jié)、雙周期指令。將AJMP指令中的11位轉(zhuǎn)移地址替換掉原來(lái)PC中16位地址中的低11位地址。指令中的11位地址,確定了地址的轉(zhuǎn)移范圍在2K以內(nèi),所以AJMP也稱“頁(yè)內(nèi)轉(zhuǎn)移”指令。101

0000110100101

XXXX

X10110100101A10a9a8

操作碼a7~a0AJMP指令PC程序計(jì)數(shù)器51單片機(jī)的ROM系統(tǒng)是以2K為一頁(yè)來(lái)劃分程序存儲(chǔ)器,這樣對(duì)于4K的片內(nèi)ROM存儲(chǔ)器可以分為2頁(yè);片外64K的ROM可以分為32頁(yè)。在執(zhí)行AJMP指令時(shí),PC的高5位決定了ROM中的頁(yè)地址;而AJMP指令的低11位地址用來(lái)選擇頁(yè)內(nèi)地址。在一般情況下,AJMP指令應(yīng)當(dāng)與目標(biāo)地址在同一頁(yè)內(nèi)。更具體的說(shuō):目標(biāo)地址應(yīng)當(dāng)與AJMP指令取出后的PC值(PC=PC+2)在同一頁(yè)內(nèi)。否則轉(zhuǎn)移將會(huì)出現(xiàn)錯(cuò)誤。ROM的64K存儲(chǔ)空間的頁(yè)面(部分)劃分表頁(yè)面PC高5位頁(yè)內(nèi)地址頁(yè)面PC高5位頁(yè)內(nèi)地址0頁(yè)000000000H~07FFH8頁(yè)010004000H~47FFH1頁(yè)000010800H~0FFFH9頁(yè)010014800H~4FFFH2頁(yè)000101000H~17FFH10頁(yè)010105000H~57FFH3頁(yè)000111800H~1FFFH11頁(yè)010115800H~5FFFH4頁(yè)001002000H~27FFH12頁(yè)011006000H~67FFH5頁(yè)001012800H~2FFFH13頁(yè)011016800H~6FFFH6頁(yè)001103000H~37FFH14頁(yè)011107000H~77FFH7頁(yè)001113800H~3FFFH15頁(yè)011117800H~7FFFHROM的64K存儲(chǔ)空間的頁(yè)面示意圖::::AAA:MOVA,R0MOVR1,A::AJMPAAA0100H07FEH000001111111

11111110PC值000010000000

00000000PC+2值000010010000

00000000AJMP指令中的11位地址原本AJMP指令要轉(zhuǎn)到本頁(yè)的0100H單元但是由于PC的高5位頁(yè)面地址發(fā)生了變化使AJMP指令實(shí)際轉(zhuǎn)到下一頁(yè)0900H單元。最后PC值發(fā)生跨頁(yè)錯(cuò)誤AJMP轉(zhuǎn)一指令是用來(lái)做頁(yè)內(nèi)2K范圍的轉(zhuǎn)移,如果使用不當(dāng),會(huì)發(fā)生錯(cuò)誤的“跨頁(yè)”操作。產(chǎn)生跨頁(yè)的原因是AJMP指令處于每一頁(yè)的最后兩個(gè)單元的結(jié)果,所以避免這種現(xiàn)象的方法就是不要在每一頁(yè)的最后兩個(gè)單元使用AJMP指令。如果目標(biāo)地址與AJMP地址不在同一頁(yè)內(nèi),建議使用LJMP指令替代AJMP。使用AJMP指令時(shí),11位的絕對(duì)地址可以用符號(hào)地址取代正確使用AJMP轉(zhuǎn)移指令例:在以下三種情況,判斷執(zhí)行KRD:AJMPKWRD后能否實(shí)現(xiàn)正常跳轉(zhuǎn)。KRD為轉(zhuǎn)移指令所在的地址,KWRD為跳轉(zhuǎn)目標(biāo)標(biāo)號(hào)地址。

(1)KRD=0730H;KWRD=0100H(2)KRD=07FEH;KWRD=0100H(3)KRD=07FEH;KWRD=0830H第一種情況能夠?qū)崿F(xiàn)正常跳轉(zhuǎn),由于KRD+02=0732H與KWRD=0100H的高5位相同,在同1頁(yè)內(nèi)。第二種情況不能夠?qū)崿F(xiàn)正常跳轉(zhuǎn),由于KRD+02=0800H與KWRD=0100H的高5位不相同,不在同1頁(yè)內(nèi)。第三種情況能夠?qū)崿F(xiàn)正常跳轉(zhuǎn)。短轉(zhuǎn)移SJMP指令格式:SJMPrel

rel為偏移量(+127~-128)rel(偏移量)的計(jì)算公式:

rel=目標(biāo)地址–源地址–2(其中:2為SJMP指令的長(zhǎng)度)【例1】:如圖,要轉(zhuǎn)到0116H時(shí):

rel=0116H-0110H-2=04H【例2】:要轉(zhuǎn)到0109H時(shí):rel=0109H-0110H-2=F7H(-9)實(shí)際編程時(shí),使用符號(hào)地址取代rel以簡(jiǎn)化計(jì)算,在匯編時(shí)由匯編程序來(lái)計(jì)算rel。SJMPrelPCPC+20109H0110H0116H變址轉(zhuǎn)移指令格式:JMP@A+DPTR單字節(jié)操作碼為73H特點(diǎn):轉(zhuǎn)移地址由累加器A的內(nèi)容與DPTR相加形成。用途:用來(lái)制作一個(gè)多分支的轉(zhuǎn)移結(jié)構(gòu)。根據(jù)A的數(shù)值設(shè)計(jì)散轉(zhuǎn)表程序。

MOVR1,A

MOVB,#02

MULAB

MOVDPTR,#TABLE;DPTR指向數(shù)據(jù)散轉(zhuǎn)表首地址

JMP@A+DPTR

RETTABLE:AJMPROVT0;散轉(zhuǎn)表

AJMPROVTl

AJMPROVT2當(dāng)(A)=0時(shí),散轉(zhuǎn)到ROVT0;(A)=1時(shí),散轉(zhuǎn)到ROVTl……。

因?yàn)锳JMP是雙字節(jié)指令,所以程序開始將A的內(nèi)容乘以2。2,條件轉(zhuǎn)移指令:(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例1、將外RAM的一個(gè)數(shù)據(jù)塊(首地址為10H)傳送到內(nèi)部數(shù)據(jù)RAM(首地址為30H),遇到傳送的數(shù)據(jù)為零時(shí)停止傳送,試編程。解:MOVR0,#30HMOVDPTR,#10HLOOP1:MOVXA,@DPTR

JZLOOP2

MOV@R0,AINCR0INCDPTRSJMPLOOP1LOOP2:SJMPLOOP2

(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

比較+轉(zhuǎn)移的指令使編程更為方便?!咀⒁狻浚?,4條指令都是3字節(jié)指令,所以執(zhí)行時(shí)PC+3→PC。2,指令的執(zhí)行實(shí)際上就是做不回送的減法,通過(guò)Cy反映出無(wú)符號(hào)數(shù)的兩數(shù)的大?。篊y=0則X>=Y(jié); 若Cy=1則X<Y。3,若參加比較的是有符號(hào)數(shù)時(shí),無(wú)法直接用Cy來(lái)判斷。必須事先對(duì)符號(hào)進(jìn)行判斷,再根據(jù)四種情況具體處理。

a,當(dāng)x、y均>0時(shí),同無(wú)符號(hào)數(shù)相同; b,當(dāng)x、y均<0時(shí),同無(wú)符號(hào)數(shù)相同; c,當(dāng)x>0,y<0時(shí),x>y; d,當(dāng)x<0、y>0時(shí),x<y;X>0?Y>0?Y>0?Cy>0?X<YX>YYNNYYNNY(3)減一條件轉(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)

溫馨提示

  • 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)論