(玩電(dian)子) 電(dian)子技術學習與研(yan)究
當前位置︰單片機教程(cheng)網(wang) >> 基(ji)礎教程(cheng) >> 瀏覽文(wen)章

贵州快三官网

作者:佚名   來源:本站原創(chuang)   點擊數:x  更新時間(jian)︰2020年02月23日   【字體(ti)︰ 中(zhong) 小(xiao)

條件轉移指令(ling)是指在滿足一(yi)定條件時進行相對轉移。

判A內容是否為0轉移指令(ling)

JZ rel

JNZ rel

第一(yi)指令(ling)的(de)功能是︰如果(guo)(A)=0,則轉移,不(bu)然次序執行(執行本指令(ling)的(de)下一(yi)條指令(ling))。轉移到(dao)什(shi)麼(me)地(di)方去呢?如果(guo)按照傳統的(de)辦法,就要算偏移量,很(hen)麻煩,好(hao)在現(xian)在我們(men)能借助于機器匯(hui)編了。因(yin)此這第指令(ling)我們(men)能這樣理解(jie)︰JZ 標號。即轉移到(dao)標號處。下面舉一(yi)例說明︰

MOV A,R0

JZ L1

MOV R1,#00H

AJMP L2

L1: MOV R1,#0FFH

L2: SJMP L2

END

在執行上(shang)面這段(duan)程(cheng)序前如果(guo)R0中(zhong)的(de)值是0的(de)話,就轉移到(dao)L1執行,因(yin)此最終的(de)執行結果(guo)是R1中(zhong)的(de)值為0FFH。而如果(guo)R0中(zhong)的(de)值不(bu)等于0,則次序執行,也就是執行 MOV R1,#00H指令(ling)。最終的(de)執行結果(guo)是R1中(zhong)的(de)值等于0。

第一(yi)條指令(ling)的(de)功能清(qing)楚(chu)了,第二條當然就好(hao)理解(jie)了,如果(guo)A中(zhong)的(de)值不(bu)等于0,就轉移。把上(shang)面的(de)na)歉隼cheng)中(zhong)的(de)JZ改成(cheng)JNZ試(shi)試(shi)吧(ba),看看程(cheng)序執行的(de)結果(guo)是什(shi)麼(me)?

比較(jiao)轉移指令(ling)

CJNE A,#data,rel

CJNE A,direct,rel

CJNE Rn,#data,rel

CJNE @Ri,#data,rel

第一(yi)條指令(ling)的(de)功能是將A中(zhong)的(de)值和立即數data比較(jiao),如果(guo)兩(liang)者相等,就次序執行(執行本指令(ling)的(de)下一(yi)條指令(ling)),如果(guo)不(bu)相等,就轉移,同樣地(di),我們(men)能將rel理解(jie)成(cheng)標號,即︰CJNE A,#data,標號。這樣利用這條指令(ling),我們(men)就能判斷兩(liang)數是否相等,這在很(hen)多場合是非常有用的(de)。但有時還想得知(zhi)兩(liang)數比較(jiao)之後哪(na)個大,哪(na)個小(xiao),本條指令(ling)也具有這樣的(de)功能,如果(guo)兩(liang)數不(bu)相等,則CPU還會反cong)吵瞿na)個數大,哪(na)個數小(xiao),這是用CY(進位位)來實現(xian)的(de)。如果(guo)前面的(de)數(A中(zhong)的(de))大,則CY=0,不(bu)然CY=1,因(yin)此在程(cheng)序轉移後再次利用CY就可判斷出A中(zhong)的(de)數比data大還是小(xiao)了。

例︰

MOV A,R0

CJNE A,#10H,L1

MOV R1,#0FFH

AJMP L3

L1: JC L2

MOV R1,#0AAH

AJMP L3

L2: MOV R1,#0FFH

L3: SJMP L3

上(shang)面的(de)程(cheng)序中(zhong)有一(yi)條單片機指令(ling)我們(men)還沒學過,即JC,這條指令(ling)的(de)原型是JC rel,作用和上(shang)面的(de)JZ類似,但是它是判CY是0,還是1進行轉移,如果(guo)CY=1,則轉移到(dao)JC後面的(de)標號處執行,如果(guo)CY=0則次序執行(執行它的(de)下面一(yi)條指令(ling))。

分析(xi)一(yi)下上(shang)面的(de)程(cheng)序,如果(guo)(A)=10H,則次序執行,即R1=0。如果(guo)(A)不(bu)等于10H,則轉到(dao)L1處繼續執行,在L1處,再次進行xin)卸希 綣guo)(A)>10H,則CY=1,將次序執行,即執行MOV R1,#0AAH指令(ling),而如果(guo)(A)<10H,則將轉移到(dao)L2處指行,即執行MOV R1,#0FFH指令(ling)。因(yin)此最終結果(guo)是︰本程(cheng)序執行前,如果(guo)(R0)=10H,則(R1)=00H,如果(guo)(R0)>10H,則(R1)=0AAH,如果(guo)(R0)<10H,則(R1)=0FFH。

弄懂了這條指令(ling),其它的(de)幾條就類似了,第二條是把A當中(zhong)的(de)值和直接地(di)址中(zhong)的(de)值比較(jiao),第三條則是將直接地(di)址中(zhong)的(de)值和立即數比較(jiao),第四條是將間(jian)址尋址得到(dao)的(de)數和立即數比較(jiao),這里就不(bu)詳談了,下面給出幾個對應的(de)例程(cheng)。

CJNE A,10H ;把A中(zhong)的(de)值和10H中(zhong)的(de)值比較(jiao)(注意和上(shang)題(ti)的(de)區別(bie))

CJNE 10H,#35H ;把10H中(zhong)的(de)值和35H中(zhong)的(de)值比較(jiao)

CJNE @R0,#35H ;把R0中(zhong)的(de)值作為地(di)址,從(cong)此地(di)址中(zhong)取(qu)數並和35H比較(jiao)

循(xun)環轉移指令(ling)

DJNZ Rn,rel

DJNZ direct,rel

第一(yi)條指令(ling)在前面的(de)例程(cheng)中(zhong)有詳細的(de)分析(xi),這里就不(bu)多談了。第二條指令(ling),只是將Rn改成(cheng)直接地(di)址,其它一(yi)樣,也不(bu)多說了,給一(yi)個例程(cheng)。

DJNZ 10H,LOOP

3.調用與返回(hui)指令(ling)

(1)主程(cheng)序與子程(cheng)序 在前面的(de)燈的(de)實驗中(zhong),我們(men)已yan)玫dao)過了子程(cheng)序,只是我們(men)並沒有明確地(di)介(jie)紹。子程(cheng)序是干什(shi)麼(me)用的(de),為什(shi)麼(me)要用子程(cheng)序技術呢?舉個例程(cheng),我們(men)數據老師布置了10道算術題(ti),經過觀察,每(mei)一(yi)道題(ti)中(zhong)都包含一(yi)個(3*5+2)*3的(de)運算,我們(men)能有兩(liang)種選擇(ze),第一(yi)種,每(mei)做一(yi)道題(ti),都把這個算式算一(yi)遍,第二種選擇(ze),我們(men)能先把這個結果(guo)算出來,也就是51,放在一(yi)邊,然後要用到(dao)這個算式時就將51代進去。這兩(liang)種辦法哪(na)種更好(hao)呢?不(bu)必(bi)多言(yan)。設計程(cheng)序時也是這樣,有時一(yi)個功能會在程(cheng)序的(de)不(bu)一(yi)樣地(di)方反復使用,我們(men)就能把這個功能做成(cheng)一(yi)段(duan)程(cheng)序,每(mei)次需要用到(dao)這個功能時就“調用”一(yi)下。

(2)調用及回(hui)過程(cheng)︰主程(cheng)序調用了子程(cheng)序,子程(cheng)序執行完之後必(bi)須再回(hui)到(dao)主程(cheng)序繼續執行,不(bu)能“一(yi)去不(bu)回(hui)頭(tou)”,那麼(me)回(hui)到(dao)什(shi)麼(me)地(di)方呢?是回(hui)到(dao)調用子程(cheng)序的(de)下面一(yi)條指令(ling)繼續執行(當然啦,要是還回(hui)到(dao)這條指令(ling),不(bu)又(you)要再調用子程(cheng)序了嗎?那可就沒完沒了了……)。參(can)考圖1

調用指令(ling)

LCALL addr16 ;長調用指令(ling)

ACALL addr11 ;短調用指令(ling)

上(shang)面兩(liang)條指令(ling)都是在主程(cheng)序中(zhong)調用子程(cheng)序,兩(liang)者有一(yi)定的(de)區別(bie),但在開(kai)始學習單片機的(de)這些指令(ling)時,能不(bu)加以區別(bie),而且能用LCALL 標號,ACALL 標號,來理解(jie),即調用子程(cheng)序。

(5)返回(hui)指令(ling)則說了,子程(cheng)序執行完後必(bi)須回(hui)到(dao)主程(cheng)序,如何返回(hui)呢?只要執行一(yi)條返回(hui)指令(ling)就能了,即執行  ret指令(ling)

4.空操作指令(ling)

nop   就是 空操作,就是什(shi)麼(me)事(shi)也不(bu)干,停一(yi)個周期,一(yi)般用作短時間(jian)的(de)延(yan)時。

發(fa)表評論】【告訴(su)好(hao)友】【收(shou)藏此文(wen)】【關閉窗(chuang)口

贵州快三官网

贵州快三官网 | 下一页