① 單片機中sjmp和ljmp是啥意思啊
MCS-51的控制轉移類指令,共17條,分為無條件轉移指令、條件轉移指令、子程序調用和返回指令、空操作指令等四類。
無條件轉移指令(共4條)
LJMP addr16 ; PC〈—— addr16
AJMP addr11 ; PC〈—— PC+2 , PC10-0〈—— addr11
SJMP rel ; PC〈—— PC+2 , PC 〈—— PC+rel
JMP @A+DPTR ; PC〈—— A+DPTR
第一條指令稱為長轉移指令(Long Jump);
第二條指令叫作絕對轉移指令(Absolute Jump);
第三條指令稱作短轉移指令(Short Jump);
第四條指令是變址定址轉移指令(散轉指令)。
顯然,每條指令均以改變程序計數器PC(Program Counter)中的內容為宗旨。
(1)長轉移指令(64KB范圍內轉移指令)
長轉移指令的功能是:把指令碼中的目標地址addr16裝入程序計數器PC,使機器執行下一條指令時無條件轉移到addr16處執行程序,不影響任何標志。由於addr16是一個16位二進制地址(地址范圍為0000H—FFFFH),因此長轉移指令一條可以在64KB范圍內轉移的指令。為了使程序設計方便易編,addr16常採用標號地址(如:LOOP、LOOP1、MAIN、START、DONE、NEXT1……)表示,只有在上機執行前才被匯編(或代真)為16位二進制地址。
長轉移指令為三位元組,雙周期指令。
上機試試吧!很直觀的! For Example: LJMP F886H
注意:
在下載的這個8051DEBUG軟體中,不支持標號,且程序狀態字PSW(Program State Word)中的D0位,即奇偶標志位P,與正確的正好相反,這一點是錯誤的,用的時候留意一下。
只要記好:累加器ACC中1的個數為奇數,則P=1;否則P=0。
(2)絕對轉移指令(2KB范圍內的轉移指令)
絕對轉移指令是一條雙位元組雙周期指令,11位地址addr11(a10—a0)在指令中的分布是:
a10 a9 a8 0 0 0 1|a7 a6 a5 a4 a3 a2 a1 a0,其中,00001B是操作碼。在程序設計中,11位地址也可以用符號表示,但在上機執行前必須按照上述指令格式加以代真。
絕對轉移指令執行時分為兩步:
第一步是取指令操作,程序計數器PC中內容被加1兩次;
第二步是把PC加2後的高5為地址PC15—PC11和指令代碼中低11位構成目標轉移地址:PC15—PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
其中,a10—a0的地址范圍是全「0」——全「1」。因此,絕對轉移指令可以在2KB范圍內向前或向後跳轉。
如果把單片機64KB定址區分成32頁(每頁2KB),則PC15—PC11(00000B—11111B)稱為頁面地址(即:0頁—31頁),a10—a0稱為頁內地址,但應注意:AJMP指令的目標轉移地址不是和AJMP指令地址在同一個2KB區域,而是應和AJMP指令取出後的PC地址(即:PC+2)在同一個2KB區域。例如:若AJMP指令地址為2FFEH,則PC+2=3000H,故目標轉移地址必在3000H—37FFH這2KB區域中。
例如:MGH2001:AJMP addr11,
其中,MGH2001為AJMP addr11指令的標號地址,由該指令在程序存儲器中的位置確定,addr11為11位地址,試分析該指令執行後的情況以及指令碼的確定方法。
解:設MGH2001=3100H,addr11=10110100101B,則根據上述指令碼格式可得絕對轉移指令的格式碼為:1 0 1| 0 0 0 0 1|1 0 1 0 0 1 0 1|(a10 a9 a8|操作碼|a7—a0|)
即:A1A5H。該指令執行後:
PC15——PC11 a10 a9 a8 a7 a6 a5 a4 a3 a2 a1 a0
PC= 0 0 1 1 0 1 0 1 1 0 1 0 0 1 0 1 B =35A5H
即:程序轉移到35A5H處執行。
(3)短轉移指令(-126—+129范圍內的轉移指令)
短轉移指令的功能是先使程序計數器PC加1兩次(即:取出指令碼),然後把加2後的地址和rel相加作為目標轉移地址。因此,短轉移指令是一條相對轉移指令,是一條雙位元組雙周期指令,指令碼格式為:80H rel(操作碼 地址偏移量),這里,80H是SJMP指令的操作碼;rel是地址偏移量,在程序中也常採用符號地址,上機運行前才被代真成二進制形式。
遇到具體問題時,頭腦中一定要清楚一個關系式:目標轉移地址=源地址+2+rel
(4)變址定址轉移指令(只能在256個存儲器單元內轉移)
這是一條單位元組雙周期無條件轉移指令。
在指令執行之前,用戶應預先把目標轉移地址的基地址送入DPTR,目標轉移地址對基地址的偏移量放在累加器A中。在指令執行時,MCS-51單片機把DPTR中基地址和累加器A中地址偏移量相加,以形成目標轉移地址送入程序計數器PC中。
通常,DPTR中基地址是一個確定的值,常常是一張轉移指令表的起始地址,累加器A中之值為表的偏移量地址,機器通過變址定址轉移指令便可實現程序的分支轉移跳轉的范圍不一樣,可以說是到達的遠近距離不一樣。存儲空間佔用不一樣。
AJMP 的范圍是11位地址,也就是2K的空間內,佔用存儲空間2個位元組,執行周期24個時鍾周期。
LJMP 的范圍是16位地址,也就是64K的空間內,佔用存儲空間3個位元組,執行周期24個時鍾周期。
SJMP 的范圍是8位地址,也就是256BIT的空間內,佔用存儲空間2個位元組,執行周期24個時鍾周期。
JMP一般配合DPTR使用,存儲空間1個位元組,執行周期24個時鍾周期。一般用於多分枝選擇的時候使用,比如按鍵處理。
ACALL,LCALL和以上說明類似,是調用指令,ACALL佔用存儲空間2個位元組,執行周期24個時鍾周期。LCALL佔用存儲空間3個位元組,執行周期24個時鍾周期。
② 單片機中的AJMP LJMP SJMP JMP有什麼區別
1、位元組不同
SJMP 如果跳轉到的標號地址距離當前PC所指的地址小於256位元組,用SJMP。
AJMP 如果跳轉到的標號地址距離當前PC所指的地址小於2K位元組,用AJMP。
LJMP 如果跳轉到的標號地址距離當前PC所指的地址小於64K位元組,用LJMP。
ACALL是調用的子程序入口地址距離當前PC所指地址需介於0~2K,LCALL是0~64K。
2、跳轉的范圍不一樣。
AJMP 的范圍是11位地址,也就是2K的空間內,佔用存儲空間2個位元組,執行周期24個時鍾周。
LJMP 的范圍是16位地址,也就是64K的空間內,佔用存儲空間3個位元組,執行周期24個時鍾周期。
SJMP 的范圍是8位地址,也就是256BIT的空間內,佔用存儲空間2個位元組,執行周期24個時鍾周期。
JMP一般配合DPTR使用,存儲空間1個位元組,執行周期24個時鍾周期。一般用於多分枝選擇的時候使用,比如按鍵處理。
ACALL,LCALL和以上說明類似,是調用指令,ACALL佔用存儲空間2個位元組,執行周期24個時鍾周期。LCALL佔用存儲空間3個位元組,執行周期24個時鍾周期。
(2)單片機ljmp擴展閱讀:
①短程轉移(直接短轉移)
指令格式:JMP SHORT OPRD
語法格式: JMP 地址標號 ;(IP)←(IP)+8位位移量
指令功能:OPRD為轉移地址的標號,指令中的SHORT規定了OPRD為有符號的8位二進制數,OPRD為轉移地址的偏移量。該指令將程序執行的順序轉移到由(IP)+OPRD形成的新的程序執行的目標地址,從而實現程序的轉移。
轉移的目標地址OPRD在指令中可以直接使用標號地址,但要求轉移的目標地址的范圍只能在JMP指令所處地址的-128~+127位元組范圍之內,如超出該范圍,匯編時出錯。
② 近程轉移(段內直接轉移)
指令格式:JMP NEAR PTR OPRD
語法格式: JMP 地址標號 ;(IP)←(IP)+16位位移量
指令功能:與短程轉移的功能和要求相同,不同之處是近程轉移的OPRD為有符號的16位二進制數,指令將程序執行的順序轉移到由(IP)+OPRD形成的新的程序執行的目標地址。
轉移的目標地址的范圍只能在JMP指令所處地址的-32768~+32767位元組范圍之內,如超出該范圍,匯編時出錯。使用該指令時NEAR可省略
③段間直接轉移(遠程轉移)
指令格式:JMP FAR PTR OPRD
語法格式: JMP 地址標號 ;(IP)←新的偏移地址, ;(CS)←新的代碼段地址
指令功能:指令中用FAR PTR規定了該指令為段間的轉移,OPRD為目的地址的標號,目的地址與JMP指令所在地址不在同一段內。執行該指令時要修改CS和IP的內容,將OPRD所在段的段地址送CS中,OPRD的段內偏移地址送IP中。
④ 段內間接轉移
指令格式:JMP WORD PTR OPRD
語法格式:JMP reg16/mem ;(IP)←新的偏移地址
指令功能:與短程轉移的功能和要求相同,不同之處是段內間接轉移的OPRD 可以是除立即數外的任何寄存或存儲器定址方式,轉移的目標地址由OPRD的內容確定。
⑤ 段間間接轉移
指令格式:JMP DWORD PTR OPRD
語法格式:JMP mem32
指令功能:指令中用DWORD PTR規定了該指令為段間間接轉移,OPRD只能是存儲器定址方式。執行該指令時將定址到的內存單元的第一個字送入IP中,第二個字送入CS中。
③ 51單片機中,ljmp 2d什麼意思
LJMP是長跳轉,可以在程序的64K范圍內跳轉
2d就是跳轉的去處,是個標號
我們常在程序的開頭見 LJMP MAIN 也是這個意思
④ 51單片機匯編程序入口後加的跳轉指令"LJMP"是因為什麼 如:ORG 0 LJMP STAR ORG 0003H LJMP INT0S
要弄明白這個問題,你要對51單片機的中斷有一個初步的了解,我可以給你介紹一下。
比方說你希望不管程序運行到哪裡,只要你一按某個按鍵,就執行一段你預先寫好的程序,然後再回到原來的地方繼續。你按按鍵的動作可以視為單片機的一個I/O管腳電平由高到低(如果你把按鍵接在I/O和地之間)。在51單片機中,有兩個I/O可以實現這樣的功能(這就是外中斷,ORG
0003H
LJMP
INT0S
中的INT0S就是外中斷0,具體你可以查51單片機中斷系統的資料)。
那它到底是怎樣實現的呢?比方說,某一時刻,你的按鍵按下了,處理器會知道滿足了外中斷的觸發條件,那它會執行哪一段程序呢?設計師人為地給它規定了一個固定的地址,如外中斷0被觸發時就是跳到地址為0003H的單元開始執行,別的中斷(定時器等)同理,都有一個固定的地址,一旦被觸發就會自動跳到那個地址,這就是中斷向量。
那為什麼是0003H而不是程序存儲器的末尾呢?這是因為不同51單片機的存儲器大小是不同的,如果中斷向量也因此而不同的話,單片機開發的麻煩就太多了。所以設計師乾脆就把中斷向量放在開頭。單片機復位後是從0000H開始執行的,總不能讓它一開始就無緣無故中斷,所以要轉移到一個和中斷向量不相乾的地方執行主程序。ORG
0
LJMP
STAR(其實應該是START)就是這樣一個轉移指令,轉到標記為START的主程序處開始執行。一條LJMP指令的長度為3,這也就是第一個中斷向量為0003H的原因了(不浪費一絲空間,不得不佩服Intel設計師的高明)。
ORG
0003H
LJMP
INT0S
為什麼中斷向量處還要跳轉呢?這是因為中斷向量間的空間也很有限,只能完成一些最簡單的任務,稍微長一點的程序就需要放在更大的空間里,從中斷向量處跳轉到該處執行真正的中斷服務程序。
有關中斷系統的具體內容,建議你還是看看相關資料,我只是把它的基本原理和你講了一下,真正使用還是請你自己探索。
⑤ 為什麼 MCS-51單片機的中斷入口地址處通常放LJMP指令。可以不用子程序調用指
轉移指令。
LJMP就是這樣一個轉移指令,轉到標記為START的主程序處開始執行。一條LJMP指令的長度為3,這也就是第一個中斷向量為0003H的原因了。因為中斷向量間的空間也很有限,只能完成一些最簡單的任務,稍微長一點的程序就需要放在更大的空間里,從中斷向量處跳轉到該處執行真正的中斷服務程序。建議你還是看看相關資料。
⑥ 單片機中,能否使用LJMP指令從主程序轉入子程序或從子程序跳轉回主程序,為什麼
這個當然是能使用LJMP指令重主程序跳轉到子程序,或從子程序跳回主程序,但一般是不允許這樣使用LJMP指令的,很容易造成程序運行混亂。因為調用子程序保護現場要將當前的地址壓入堆棧,子程序返回時,會彈出該地址賦值給PC指針。如果使用,必須滿足以下條件:
1、跳出跳入成對出現,也就是說,從主程序用LJMP跳轉到子程序,那麼在子程序中的RET前,必須是用LJMP指令跳回。
2、不成對出現,但是如果子程序是LJMP跳轉來的控制,那麼在RET前,需要壓入返回位置的地址。比如:
主程序:
.....
LJMPSUB01
........
CON: ;返回地址
......
SUB: ;子程序
....
SUB01: ;跳轉到的地址
....
MOV DPTR,#CON ;返回前處理。
PUSH DPH
PUSH DPL
RET
⑦ 單片機匯編時,子程序的LJMP問題
在單片機匯編程序中,如果LJMP到子程序(如果不是調用且用RET返回的話就不能叫子程序了,)那麼必須再用LJMP跳回來才行,如果是LCALL調用,但LJMP跳回,那麼將破還堆棧結構,程序就會出現混亂了。有如下關系:
LCALL
.......
RET
這必須成對出現。
⑧ 單片機中LJMP和SJMP有啥區別啊,這兩個程序中的LJMP和SJMP可以互換么
LJMP是長轉移,范圍是在64K地址范圍內。SJMP是短轉移,轉移地址范圍在-128~127之間。程序中因為轉移范圍較小,兩個指令都可以。
⑨ 哪位單片機高手幫我解釋一下下面程序中的LJMP什麼意思
ljmp是長跳轉。
因為30H之前有中斷入口地址,所以不能隨便佔用,需要跳過去,
我個人都是跳轉到0100H,根據個人愛好,呵呵
⑩ 單片機AJMP指令和LJMP指令有何區別
區別如下:
1、定義不同。
AJMP是無條件跳轉指令之一,叫做絕對跳轉。而LJMP則是長轉移指令。如果一個程序代碼在2KB以內(是指編譯後的BIN代碼),可以用AJMP指令。如果一個程序代碼超過了2KB,就要用LJMP指令了。
2、范圍不同。
AJMP 跳轉的范圍是2KB之內的,就是AJMP指令和跳轉的目的地址在ROM中的同一個2KB范圍內。
LJMP 跳轉的范圍是64KB全部的ROM存儲區。
3、使用功能不同。
AJMP主要是用來改變程序執行的路線,到需要的指令或程序去執行。ljmp長轉移指令的功能是:把指令碼中的目標地址addr16裝入程序計數器PC,使機器執行下一條指令時無條件轉移到addr16處執行程序,不影響任何標志。