A. 51單片機指令中sjmp的具體用法,詳解
這個不用想太多,就當作一條簡單的跳轉指令就好了。需要注意的是跳轉到的位置不能太遠,上下不超過127個單元。
B. 單片機指令SJMP小問題!!
指令存放在2個單元里,那是因為這個指令佔2個位元組,一個指令位元組,一個跳轉偏移。
它告訴你這個指令存在什麼地方,是因為SJMP的執行的是相對跳轉,也就是從這個當前地址向前後向後跳多少個位元組。
SJMP rel8 執行的操作如下:
PC = PC + 2 這是SJMP這條指令所佔用的空間
PC += rel8
所以當執行到SJMP 7eh的時候,PC=20A0H
根據這個公式:PC = 20A0H + 2 + 7eH = 2120H,所以最後程序跳轉到2120H執行
C. 單片機HERE:SJMP HERE指令
HERE: SJMP HERE 是原地轉移的意思。
一種應用是:用於調試程序其間,代替暫停指令,便於人們觀看前面程序的運行結果。
另一種應用是:用於程序連續運行的時候,貌似死機,實際上是等待中斷的發生。
D. 單片機的一條指令: SJMP $ 是啥意思
SJMP $意味著跳轉到該指令的開頭以開始執行,因此它變為循環執行,就地跳轉,通常用於等待中斷。
但是本指令也不宜濫用。這是一條死循環指令,如果系統的中斷是開放的,那麼SJMP $指令實際上是在等待中斷,當有中斷申請後,CPU 轉至執行中斷服務程序。
中斷返回時,仍然返回到這條死循環指令,繼續等待中斷,而不是返回到該指令的下一條指令。這是因為執行SJMP $後,PC 仍指向這條指令,中斷的斷點就是[3]這條指令的首位元組地址。
1)在51中,與外部存儲器RAM打交道的只可以是A累加器。所有需要送入外部RAM的數據必需要通過A送去,而所有要讀入的外部RAM中的數據也必需通過A讀入。
在此我們可以看出內外部RAM的區別了,內部RAM間可以直接進行數據的傳遞,而外部則不行,比如,要將外部RAM中某一單元(設為0100H單元的數據)送入另一個單元(設為0200H單元),也必須先將0100H單元中的內容讀入A,然後再送到0200H單元中去。
2)要讀或寫外部的RAM,當然也必須要知道RAM的地址,在後兩條指令中,地址是被直接放在DPTR中的。而前兩條指令,由於Ri(即R0或R1)只是一個8位的寄存器,所以只提供低8位地址。因為有時擴展的外部RAM的數量比較少,少於或等於256個,就只需要提供8位地址就夠了。
3)使用時應當首先將要讀或寫的地址送入DPTR或Ri中,然後再用讀寫命令。
E. 單片機中 為什麼要用SJMP $
這個語句sjmp $ 只有在做測試實驗等的時候才用的(為的是不讓單片機「跑飛」了),在工程裡面是沒用的。
F. 單片機 SJMP
短轉移指令,執行指令後程序跳轉到標號LP1處執行;
SJMP:Short Jump(短轉移);
G. 單片機中 SJMP $ 什麼意思
單片機 SJMP $表示重復執行這條指令。
void main()
{ p1=0x00;
while(1)
void DelayMS()
{ uchar i;
while(10)
for(i=0;i<120;i+ +);
}
p1=!p1;
}
2:
void timer_init()
{
TMOD=0x01;
TH0=(65536-0)/256;
TL0=(65536-0)%256;
TR0=1;
}
在上面程序1中,0x00表示一種狀態,即表示單片機P1口八位都是低電位0,而不是表示為等於零無意義。
在程序2中,初值賦為零,則表示整個定時為65.536ms,是該定時方式的最大值,而初值0則僅表示該值為零,沒有任何意義。
在單片機學習中,數值的表示方法是學習中應引起注意的細節,若不注意,有時因何而錯,都分辨不清。
單片微控制器,它不是完成某一個邏輯功能的晶元,而是把一個計算機系統集成到一個晶元上,相當於一個微型的計算機。運行中也僅能處理數字信號。
單片機只能識別二進制數,也就是高低電平1與0。但當數值太大時,用1和0來表示程序中的數值時顯得太繁鎖了,於是便用十六進制來表示。這樣表示起來方便,通用,
為了讓單片機按照我們的要求來工作,就必須對它賦予指令也就是編寫程序,在程序中同一個數值會因應用的位置不一樣,而理解含義就不一樣。
如下面程序1中用十六進製表示的0x00和定時程序2賦初值時用0(0=0x00)表示的初值。它們在不同程序中所表示的意義也不一樣,理解起來也就不能用同一種思維方式去理解。
H. 單片機程序中SJMP $指令怎樣用
$ 代表本指令的地址
sjmp $ 就是跳到此處,也就是原地踏步,是個死循環。讓程序停在此處。
I. 單片機中的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個時鍾周期。
(9)單片機sjmp擴展閱讀:
①短程轉移(直接短轉移)
指令格式: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中。
J. 單片機中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個時鍾周期。