① 單片機短轉移指令
條件轉移指令是指在滿足一定條件時進行相對轉移。
判A內容是否為0轉移指令
JZ
rel
JNZ
rel
第一指令的功能是:如果(A)=0,則轉移,否則順序執行(執行本指令的下一條指令)。轉移到什麼地方去呢?如果按照傳統的方法,就要算偏移量,很麻煩,好在現在我們可以藉助於機器匯編了。因此這第指令我們可以這樣理解:JZ
標號。即轉移到標號處。下面舉一例說明:
MOV
A,R0
JZ
L1
MOV
R1,#00H
AJMP
L2
L1:
MOV
R1,#0FFH
L2:
SJMP
L2
END
在執行上面這段程序前如果R0中的值是0的話,就轉移到L1執行,因此最終的執行結果是R1中的值為0FFH。而如果R0中的值不等於0,則順序執行,也就是執行
MOV
R1,#00H指令。最終的執行結果是R1中的值等於0。
第一條指令的功能清楚了,第二條當然就好理解了,如果A中的值不等於0,就轉移。把上面的那個例子中的JZ改成JNZ試試吧,看看程序執行的結果是什麼?
比較轉移指令
CJNE
A,#data,rel
CJNE
A,direct,rel
CJNE
Rn,#data,rel
CJNE
@Ri,#data,rel
第一條指令的功能是將A中的值和立即數data比較,如果兩者相等,就順序執行(執行本指令的下一條指令),如果不相等,就轉移,同樣地,我們可以
將rel理解成標號,即:CJNE
A,#data,標號。這樣利用這條指令,我們就可以判斷兩數是否相等,這在很多場合是非常有用的。但有時還想得知兩數比較之後哪個大,哪個小,本條指令
也具有這樣的功能,如果兩數不相等,則CPU還會反映出哪個數大,哪個數小,這是用CY(進位位)來實現的。如果前面的數(A中的)大,則CY=0,否則
CY=1,因此在程序轉移後再次利用CY就可判斷出A中的數比data大還是小了。
② 單片機匯編語言指令中,條件轉移指令JBC與JC的區別是什麼
一、作用不同:
JBC指令判斷該位為1則轉移,同時將該位置0。
JC指令判斷有借位則轉移,也就是說兩數相減為負轉移。
二、含義不同:
JBC指令相當與JB和CLR (位) 二條指命的組合,它可在轉移的同時清除被判位;
JC指令只能對CY進位位進行判斷為高後轉移,並不能清除它,二條指令都當被測位為高進時進行相對轉移。
三、位置不同:
JC是判斷C進位標志是否為1,為1則跳轉到指定位置。
JBC是判斷可位定址區域內指定位是否為1,為1則跳轉到指定位置,並同時清除該位(置0)。
(2)單片機程序轉移擴展閱讀:
直接使用匯編指令編寫單片機程序,對硬體的控制更加直接,可以直接操作物理地址,寄存器,埠等;其它更高級的語言(如:C語言)對硬體的控制是依賴於類庫來實現的。並且,對於一些對程序大小和運行速度有非常嚴苛要求的項目而言,都必須使用匯編指令。C語言只是為了方便編寫,與機器打交道的其實都是2進製得代碼,匯編語言就是這些代碼好記憶的名稱和規則,只是比C語言難理解些。
③ 單片機跳轉出范圍
為什麼單片機中可實現的轉移范圍是
單片機跳轉指令解析
控制轉移類指令
條件轉移指令Jcc根據指定的條件確定程序是否發生轉移。如果滿足條件則程序轉移到目標地址去執行程序;不滿足條件,則程序將順序執行下一條指令。
其通用格式為:
Jcc LABEL ;條件滿足,發生轉移:IP?IP+8位位移量
;否則,順序執行:IP?IP+2 其中,LABEL表示目標地址(8位位移量)。因為Jcc指令為2個位元組,所以順序執行就是指令偏移指針IP加2。條件轉移指令跳轉的目標地址只能用前面介紹的段內短距離跳轉(短轉移),即目標地址只能是在同一段內,且在當前IP地址-128~+127個單元的范圍之內。這種定址方式由於是相對於當前IP 的,所以被稱為相對定址方式。條件轉移指令不影響標志,但要利用標志。條件轉移指令Jcc中的cc表示利用標志判斷的條件,共16種。如下圖:
1、判斷單個標志位狀態
這組指令單獨判斷5個狀態標志之一,根據某一個狀態標志是0或1決定是否跳轉。
(1)JZ/JE和JNZ/JNE利用零標志ZF,判斷結果是否為零(或相等)
JE指令(相等時轉移)
JZ指令(等於0時轉移)
這是當ZF=1時轉移到目標地址的條件轉移指令的兩種助記符。這條指令既適用於判斷無符號數的相等,又適用於判斷帶符號數的相等。
JNE指令(不相等轉移)
JNZ指令(不等於0轉移)
這是當ZF=0時能轉移到目標地址的條件轉移指令的兩種助記符。這條指令也是既適用於判斷無符號數,又適用於判斷帶符號數。
(2)JS和JNS利用符號標志SF,判斷結果是正是負。
JS指令(為負轉移)——當滿足SF=1時,轉移到目標地址
JNS指令(為正轉移)——滿足SF=0時,轉移到目標地址
(3)JO和JNO利用溢出標志,判斷結果是否產生溢出
JO指令(溢出轉移)——OF=1時,轉移到目標地址 JNO指令(未溢出轉移)——OF=0時,轉移到目標地址
(4)JP/JPE和JNP/JPO利用奇偶標志PF,判斷結果中「1」的個數是偶是奇
JP/JPE指令(為偶轉移)——滿足PF=1時轉移 JNP/JPO指令(為奇轉移)——滿足PF=0時轉移 數據通訊為了可靠常要進行校驗。常用的校驗方法是奇偶校驗,即把字元ASCII碼的最高位用作校驗位,是包括校驗位在內的字元中為「1」的個數恆為奇數(奇校驗),或恆為偶數(偶校驗)。若採用奇校驗,在字元ASCII中為「1」的個數已為奇數時,則令其最高位為「0」;否則令最高位為「1」。
(5)JC/JB/JNAE和JNC/JNB/JAE,利用進位標志CF,判斷結果是否進位或借位,CF標志是比較常用的一個標志。 JC——滿足CF=1時轉移 JNC——滿足CF=0時轉移
JB(低於轉移) JNB(不低於轉移) JNAE(不高於等於轉移) JAE(高於等於轉移) 2、用於比較無符號數高低為區別有符號數的大小,無符號數的大小用高(Above)、低(Below)表示,它需要利用CF確定高低、利用ZF標志確定相等(Equal)。兩數的高低分成4種關系:低於(不高於等於)、不低於(高於等於)、低於等於(不高於)、不低於等於(高於);也就分別對應4條指令:JB(JNAE)、 JNB(JAE)、JBE(JNA)、JNBE(JA)。 JA/JNBE
JA即高於轉移,JNBE即不低於且不等於轉移,高於則沒有進位產生,即CF=0,不等於則ZF=0,所以這兩條指令滿足CF=0且ZF=0時轉移
JAE/JNB
高於或等於轉移/不低於轉移是當CF=0(高於就不產生進位)或ZF=1(等於)時轉移。
JB/JNAE
即低於/不高於且不等於轉移,是當CF=1(產生借位)且ZF=0(不相等)時轉移。
JBE/JNA
即低於或等於/不高於轉移,是當CF=1(借位產生)或ZF=1(相等)時轉移。
3、用於比較有符號數大小
判斷有符號數的大(Greater)、小(Less),需要組合OF、SF標志、並利用ZF標志確定相等與否。兩數的大小分成4種關系:小於(不大於等於)、不小於(大於或等於)、小於等於(不大於)、不小於等於(大於);也就分別對應4條指令:JL(JNGE)、JNL(JGE)、JLE(JNG)、 JNLE(JG)。
由上可見,條件轉移指令之前常有CMP、TEST、加減運算、邏輯運算等影響標志的指令,利用這些指令執行後的標志或其組合狀態形成條件。
JG/JNLE
大於/不小於且不等於轉移,是當標志SF與OF同號(即SF異或OF=0)且ZF=0時轉移
JGE/JNL大於或等於/不小於轉移,是當標志SF與OF同號(即SF異或OF=0)或ZF=0時轉移
JL/JNGL
小於/不大於也不等於時轉移,是當標志SF與OF異號(即SF異或OF=1)且ZF=0時轉移
JLE/LNG
小於或等於/不大於轉移,是當標志SF與OF異號(即SF異或OF=1)或ZF=1時轉移
4、判斷計數器CX是否為0
JCXZ LABEL ;CX=0,則轉移;否則順序執行
④ 51單片機為什麼在執行中斷服務程序時要先加入一條轉移指令
因為處理器需要接受中斷至執行用戶設置的程序的此段時間內發生的事情。
此程序屬於中斷響應階段,其內容有,1、先完成當前正在執行的指令,並保存下一條指令的地址。2、暫停主程序的執行後,將程序執行的地址接入到中斷入口地址。3、一般此時會在找中斷入口地址的單元內寫一條無條件轉移指令(因為該地址僅8位元組),使得程序跳轉到中斷服務程序中執行。
⑤ 單片機關於按鍵後跳轉問題代碼(轉移指令表問題)
「其中在對比得到偏移量之後為什麼要左移再執行跳轉jpt,而不是直接用偏移量a」
因為鍵值表中每個鍵值是1個位元組,然而偏移表jpt中每個跳轉指令是2個位元組(AJMP是雙位元組指令的局部跳轉)。
「還有就是這個程序是不是只能比對第一個鍵值,因為第一個鍵值比對完之後就跳轉到PR0,然後返回start又繼續重置了偏移量為0,所以是不是程序永遠都只比對第一個鍵值,往復循環呀?」
不對,你沒看懂這個程序。比對第一個鍵值,如果相符,就會跳轉到PR0,之後返回start……如果不相符,就會繼續比對下一個鍵值直到6個比對完。
⑥ 單片機系統指令的控制轉移指令
一、無條件轉移指令 AJMP addrll (2位元組指令)
2K(地址211)位元組范圍內的無條件跳轉指令。
64K程序存儲器空間分為32個區,每區2K位元組,轉移的目標地址必須與AJMP下一條指令的地址高5位地址碼A15-A11相同。
指令執行時,先PC加2,然後把addrll送入PC.10~PC.0,
PC.15~PC.11保持不變,程序轉移到目標地址。
注意:轉移目標首地址必須在AJMP指令下一條指令地址(PC+2)的2KB范圍內。
二、長跳轉指令 LJMP addr16 (3位元組指令)
64K位元組范圍內的無條件跳轉指令。
指令執行時,把指令的第二和第三位元組分別裝入PC的高位和低位位元組中,無條件地轉向addr16指出的目標地址。
目標地址可以在64K程序存儲器地址空間的任何位置。
注意:短跳轉、長跳轉指令中addrll、addr16直接寫上要轉向的目標地址標號(即符號地址)就可以。
三、相對轉移指令 SJMP rel (雙位元組)
rel為8位帶符號二進制補碼數(-128~+127),實現程序的雙向轉移。
在編寫程序時,直接寫上要轉向的目標地址標號就可以。
四、間接跳轉(散轉)指令JMP @A+DPTR (三位元組)
由A中8位無符號數與DPTR的16位數內容之和來確定。以DPTR內容作為基址,A的內容作變址。
五、條件轉移指令 (雙位元組)
JZ rel ; 如果累加器為「0」,則轉移
JNZ rel; 如果累加器非「0」,則轉移
六、比較不相等轉移指令(3位元組指令)
CJNE A, direct, rel
CJNE A, #data, rel
CJNE Rn, #data, rel
CJNE @Ri, #data, rel
1、比較前面兩個操作數(無符號整數)的大小,如果不相等則
轉移,若相等則順序執行下一條指令。
2、如果第一操作數小於第二操作數, 則Cy標志位置1, 否則清0。
如常把CJNE 第一操作數, 第二操作數, $+3
和JNC rel或JC rel 寫在一塊來判別2個數的大小。
$:本條指令在程序存儲單元的首地址;
$+3:CJNE指令的下一條指令,即JNC rel或JC rel
七、減1不為0轉移指令
DJNZ Rn, rel ;n=0~7
DJNZ direct, rel
將源操作數內容減1,結果回送到Rn寄存器或direct中去。如果源操作數內容不為0則轉移,為0則順序執行下一條指令。
主要用於控製程序循環。
1、把寄存器Rn或內部RAM的direct單元用作程序循環計數器
2、以減1後是否為「0」作為轉移條件,實現按次數控制循環
八、子程序調用、返回指令
1、短調用指令 ACALL addr11 (雙位元組)
2K范圍內的子程序調用。
2、長調用指令 LCALL addr16 (三位元組)
64K范圍內的子程序調用。
執行本指令時:
(1)斷點地址(調用指令的下一條指令的首地址PC+2或PC+3)
保護
(SP)+1→SP,然後PCL →(SP)
(SP)+1→SP,然後PCH →(SP)
(2)將子程序首地址送入PC,執行子程序
3、子程序返回指令 RET
斷點地址恢復
(SP) →PCH,(SP) - 1→SP
(SP) →PCL ,(SP) - 1→SP
功能:從堆棧中退出PC的高8位和低8位位元組,把棧指針減2,從PC值開始繼續執行程序。不影響標志位。
4、中斷返回指令 RETI
與RET指令相似,不同之處在於斷點地址恢復,清除中斷響應時被置「1」的51內部中斷優先順序寄存器的優先順序狀態。
子程序是編程時就已確定的固定位置調用,而中斷服務子程序是由中斷系統控制在特定條件下隨機調用的。
九、空操作指令 NOP,消耗1個機器周期的時間
⑦ MCS-51單片機的間接轉移指令,實現多分支轉移
用散轉表 直接用LJMP指令組成轉移表.由於LJMP是3位元組的指令,在組成指令轉移表時,當執行JMP @A+DPTR指令時,可能出現DPTR低8位向高8位的進位,用加法指令對DPTR直接修改來實現. 程序如下: ORG 0000H PJ2: MOV DPTR,#TAB2 CLR C MOV R5,#0 MOV A,R6 RLC A ;R6*2 JNC AD1 INC R5 ;有進位,高8位加1 AD1: ADD A,R6 ;R6*3 JNC AD2 INC R5 ;有進位,高8位加1 AD2: MOV A,R5 ADD A,DPH ;DPTR高8位調整 MOV A,R6 JMP @A+DPTR ;得散轉地址 TAB2: LJMB LOP0 LJMP LOP1 …… LJMP LOPn END 用AJMP組成的散轉表為二位元組一項,而用LJMP組成的散轉表則為三位元組一項,根據R6中的內容或乘2,或乘3得每一處理程序的入口地址表指針. 應該不難理解吧,耐心點看
⑧ 單片機編程 高手進 數據轉移清零
程序如下:
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:
MOV 38H, #0
MOV 39H, #0
MOV 3AH, #0
MOV R0, #31H
MOV R2, #4
ADD_LOOP:
MOV A, 3AH
ADD A, @R0 ;先加31H的
MOV 3AH, A
DEC R0
MOV A, 39H
ADDC A, @R0 ;再加30H的
MOV 39H, A
MOV A, 38H
ADDC A, #0
MOV 38H, A
INC R0
INC R0
INC R0 ;轉到33H
DJNZ R2, ADD_LOOP ;循環加四次,和就在38H、39H、3AH(低位元組)中
;――――下面求平均。右移2位,即除以4
CLR C
MOV A, 38H
RRC A
MOV B, A
MOV A, 39H
RRC A
MOV 3BH, A
MOV A, 3AH
RRC A
MOV 3CH, A
MOV A, B
RRC A
MOV A, 3BH
RRC A
MOV 3BH, A
MOV A, 3CH
RRC A
MOV 3CH, A
SJMP $ ;結束,平均值在3BH 3CH。
END