返回主程式指令是什麼微控制器,微控制器中斷返回指令

時間 2021-08-30 09:56:08

1樓:**飄渺迷人

ret 普通子程式

reti 中斷子程式

2樓:古梵吉

我仔細看了一下所有人的回答,有根本沒看懂樓主問題答非所問的,也有回答的差不離的,我來切一下重點好了。

樓主這所有問題其實歸根結底就是一個問題,堆疊和sp(堆疊指標)的問題

call指令執行時,就是先把當前程式指標壓入堆疊並使sp加1,然後開始執行call指令呼叫的子程式,當遇到ret指令時,把前面壓入堆疊的程式指標取出並sp減1(出棧),然後就回到call程式呼叫前位置了。

jmp指令並不會把程式指標壓入堆疊更不會影響sp(當然自己在jmp後用push指令除外)。自然call呼叫後使用jmp指令跳轉,最後遇到ret指令一樣能回到call程式呼叫前位置。就算你在jmp指令後使用push指令,只要和pop成對出現,還是會回到呼叫前的位置,不成對?

這堆疊不能這麼用的。。飛了。。飛了。

中斷其實和call指令時一樣的道理,至於用reti就如張庚(3樓)兄弟說的中斷是要多處理一些標誌位。

至於呼叫call多少次出錯,這還是堆疊和sp的問題。

如我上面所寫,call指令一次就得壓棧一次,而你在ret指令前又來一次call指令,那麼還得壓一次,這樣一直下去堆疊指標愈來愈大,就會佔用程式所要使用的ram地址,自然肯定會出錯,一半51微控制器預設sp為07h,而一般程式設計ram地址20h開始就會被程式佔用,一算就知道了,大概10幾20次吧,如果你中間還是用堆疊那麼就少點,如果你的程式佔用ram的地址靠後那麼就多點,不過一般夠用是肯定的了

3樓:匿名使用者

一般返回用ret ,中斷返回用reti

微控制器能否使用ljmp指令從主程式轉入子程式或從子程式跳回主程式,為什麼? 10

4樓:匿名使用者

這個當然是bai能使用ljmp指令du重主程式跳轉到子程式,或從zhi子程式跳回主dao程式,但一般是

回不允許這樣使用答ljmp指令的,很容易造成程式執行混亂。因為呼叫子程式保護現場要將當前的地址壓入堆疊,子程式返回時,會彈出該地址賦值給pc指標。如果使用,必須滿足以下條件:

1、跳出跳入成對出現,也就是說,從主程式用ljmp跳轉到子程式,那麼在子程式中的ret前,必須是用ljmp指令跳回。

2、不成對出現,但是如果子程式是ljmp跳轉來的控制,那麼在ret前,需要壓入返回位置的地址。比如:

主程式:

.....

ljmp  sub01

........

con: ;返回地址

......

sub: ;子程式

....

sub01: ;跳轉到的地址

....

mov dptr,#con ;返回前處理。

push dph

push dplret

5樓:匿名使用者

這是一條無條件轉移指令,而且是長轉移,轉移可達64k,已完全覆蓋51微控制器的程式空間,只要利用對應的標號,完全可以從主程式轉入子程式或從子程式跳回主程式。

6樓:

可以的,但要在相應跳轉處設好標籤

微控制器中,能否使用ljmp指令從主程式轉入子程式或從子程式跳轉回主程式,為什麼

7樓:匿名使用者

這個當復

然是能使用ljmp指令重主程式跳轉制到子程式,或從子程式跳回主程式,但一般是不允許這樣使用ljmp指令的,很容易造成程式執行混亂。因為呼叫子程式保護現場要將當前的地址壓入堆疊,子程式返回時,會彈出該地址賦值給pc指標。如果使用,必須滿足以下條件:

1、跳出跳入成對出現,也就是說,從主程式用ljmp跳轉到子程式,那麼在子程式中的ret前,必須是用ljmp指令跳回。

2、不成對出現,但是如果子程式是ljmp跳轉來的控制,那麼在ret前,需要壓入返回位置的地址。比如:

主程式:

.....

ljmp  sub01

........

con: ;返回地址

......

sub: ;子程式

....

sub01: ;跳轉到的地址

....

mov dptr,#con ;返回前處理。

push dph

push dplret

8樓:匿名使用者

不能這樣bai寫程式。

如果這樣寫了du,程式也zhi會按照指令順序執行dao,但是很容易出現內

問題,導致程式跑容飛。

由於微控制器的ram是有限的,程式在進入子程式之前經常會使用ram來臨時儲存一些資料,包括sp指標在執行完子程式之後需要跳回的地址資訊。也就是堆疊的「壓棧」(push)。

子程式執行完後,要執行一個ret指令結束子程式,指標指向的堆疊單元讀取堆疊資料,這個過程叫做「出棧」(pop ),然後指標會正常的執行下去。

假如在子程式內直接用ljmp指令跳出到主程式,就會把堆疊壓入的資料沒有讀出,造成資料丟失,sp指標指向的地址沒有正確返回,造成堆疊不斷增加,直到不夠用了就會溢位。

再假如從主程式內直接用ljmp指令跳入子程式,在執行ret退出子程式時,就會造成錯誤的讀出堆疊內的資料。

9樓:匿名使用者

絕對不可以

會造成邏輯的混亂,因為堆疊會亂。

call的子程式的最後的返回需用 ret 語句而長轉移只能用在本段程式內(如主程式內或子程式內)而步能在2個之間跳轉。

10樓:快樂珍惜

如果是bailjmp 跳轉du的返回時需要 跳轉返回,不能使用zhi ret返回;

如果是call 呼叫dao子函回數,的返回可以使答用 ret 返回;

主要原因是call 的時候有自動 堆疊 動作,ret 會自動出棧,使棧保持平衡;否則會導致堆疊破壞和堆疊溢位;

滿意的話贊一個!

微控制器中斷返回指令

11樓:做而論道

程式結構錯誤。

……mov th0,#(65536-50000)/256 ;定時50毫秒

mov tl0,#(65536-50000)/256mov ie,#82h

setb tr0--主程式,到這,就沒有了,這那行?

??????

timer: ;--下面就是:定時器中斷服務程式mov th0,#(65536-50000)/256 ;初脈衝50ms

mov tl0,#(65536-50000)/256inc r6 ;脈衝加1

mov a,r6

……主程式中,還缺少:呼叫顯示、鍵盤、迴圈,等等部分。

12樓:匿名使用者

我感覺你的程式編譯都不能過,ljmp min,你min這個標號是沒有的,何況這還是一個變數。

13樓:不認識天老師

exit:reti 改為 reti 試試

不過不建議用中斷法做 用查詢方便 你開了中斷沒有關吧?

51微控制器的彙編程式中,ret指令必須和哪個指令配對使用

14樓:胖大海君

ret指令是子程式的最後一條指令,即恢復斷點,返回主程式。

沒有要求ret指令非要和哪一條指令要配對使用。

無論使用者是否呼叫子程式 即是否使用call指令 只要子程式存在 ret指令就存在

跟call指令沒司馬關係。

呵呵 滿意就選滿意回答吧

15樓:匿名使用者

ret 子程式返回指令,

call 子程式呼叫指令,

只要 呼叫子程式,就有 ret 結束子程式 返回,執行 子程式,子程式中還可以 呼叫子程式,可以多次 (多層)呼叫子程式。

一個子程式,可以給 多個 程式 呼叫,

所有 在一個 完整的 程式中 call 與 ret 的 個數 是不一定 相等的。

微控制器指令判斷正誤,微控制器的指令判斷正誤

1 clr a 對 2 mul r0,r1 錯,只有mul a,b 3 mov dptr,1050h 錯,猜測該題意圖應該是mov dptr,1050h,並且dptr除了立即數賦值外只能用movx dptr,a來為其賦值 4 mov a,r7 錯,只有r0與r1可以間址 5 add 30h,20h ...

求微控制器程式,求微控制器程式

能認識到自己的問題就證明你是一個有責任感的人。當然認識到自己的缺點只是一方面,主要還得加以改正,可能一個人的性格與脾氣不是一天二天就能改掉的,但一定要在衝動時忍耐。現在是建設文明,和諧社會。需要正能量。相信你一定能成功。跪求一個微控制器程式 求微控制器程式?然後不用點說完了直接發不就行了,微控制器程...

51微控制器蜂鳴器程式是什麼,求51微控制器蜂鳴器程式

迷你手工老張 include reg52.h typedef unsigned char u8 typedef unsigned int u16 sbit beep p1 5 void delay u16 i while i void main while 1 beep beep delay 100...