MCS51微控制器,中斷服務程式的返回指令和子程式的返回指令有

2021-03-22 02:18:15 字數 6027 閱讀 8855

1樓:

中斷服務程式的返回指令 彙編助記符 reti 機器指令 32h

子程式的返回指令 彙編助記符 ret 機器指令 22h

2樓:馬洋陌越

ret用於

一般程式的返回

reti用於中斷函式的返回

以上是一般微控制器書籍簡紹的,然而在實際應用中,我發現,在程式返回中一樣可以使用reti,而在中斷返回中卻無法使用ret,究其原因是因為reti比ret多做一件事情就是將「優先順序生效」觸發器清零

原來在8051構架中--中斷系統中含有兩個不可定址的「優先順序生效」觸發器。一個用於指出cpu是否正在執行高優先順序的中斷服務程式,這個觸發器為1時,系統將遮蔽所有的中斷請求;另一個則指出cpu是否正在執行低優先順序中斷服務程式,該觸發器為1時,將阻止除高優先順序以外的一切中斷請求。由此可見,若要響應同級甚至是低階中斷請求,必須使得該「優先順序生效」觸發器清零。

但該觸發器又是不可定址的,所以無法用軟體直接清零。」

微控制器裡中斷返回和子程式返回的區別是什麼? 5

3樓:可以叫我表哥

中斷服務子程式入口地址相對某一中斷是固定的,呼叫子程式的偏移地址是隨機的,基本過程差不多,返回時,中斷服務子程式用的是reti 呼叫子程式是ret。

呼叫中斷服務子程式和呼叫子程式都會把當前偏移地址的下一地址壓棧,但呼叫子程式的返回指令ret不影響標誌位,reti從中斷程式返回,並會清除內部相應的中斷狀態暫存器。

4樓:

基本沒有區別!都會在返回時恢復壓棧的pc指標並繼續執行程式。

中斷處理程式實際上也可以看做是一個普通的子程式,只是它的呼叫是預先設定的地址入口,並且它的呼叫時由中斷觸發的;而子程式是我們人為地呼叫的。

但是中斷子程式的返回有時要考慮對中斷的處理(如開關中斷允許、初始化資料-----比如計數器或者定時器的初始值處理等等)。

5樓:蔥要吃魚

中斷是微控制器的一個重要功能,中斷子程式專為執行中斷功能,它是在發生中斷後,自動執行的,不需要主程式呼叫;子程式要主程式呼叫才能執行。

6樓:匿名使用者

中斷返回後繼續執行斷點以後的程式,子程式返回其實是在編譯時把子程式插在主調程式之中,執行完子程式後順序執行後面的程式而已。

微控制器組合語言指令中中斷返回指令ret和reti有什麼不同?

7樓:匿名使用者

reti 是中斷返回指令;

ret 是子程式返回指令;

reti比ret多一步清除中斷優先順序狀態位,讓同級別的中斷有機會得到響應。

中斷指令「reti」做為中斷跳出指令除了將堆疊中儲存著的地址取出,送回pc;使程式從主程式的中斷處繼續往下執行的作用外,還有將「優先順序生效」觸發器清零的功能。

8樓:做而論道

ret 是子程式返回指令。

reti 是中斷服務程式返回指令。

兩者,用途不同。

9樓:匿名使用者

ret是子程式返回指令,返回到呼叫該子程式處的下一條指令執行,返回的地址是從ret執行前的sp中最後兩個值。

reti是中斷服務程式返回指令,返回到進入中斷服務的斷點處執行,返回的地址是從reti執行前的sp中最後兩個值。

10樓:匿名使用者

ret是普通子程式的返回指令,而不能用reti,所以,ret不是中斷返回指令,就是子程式返回指令。

而reti是用在中斷子程式的返回指令,必須用這個,這才叫中為返回指令,而不能用ret,這就是區別。

11樓:匿名使用者

ret是子程式返回指令,將堆疊中的地址彈出,而reti是中斷返回指令,除了將地址彈出,還將標誌彈出

微控制器中子程式和中斷服務程式有何異同?為什麼子程式返回指令ret和中斷返回指令reti不能相互替代?

什麼是中斷,51子系列微控制器的中斷源有哪些,其優先順序是怎麼樣確定的;中斷返回指令和子程式返回指令的差

12樓:匿名使用者

51微控制器中斷源有

1.兩個外部中斷(init0) (init1),分別由ie0 和ie1兩位控制開啟

2.定時器中斷t0 和t1

3.串列埠中斷

優先順序由ip暫存器控制,只能分兩級,高或低。

優先順序相同的中斷源也分高低,順序為:外部中斷0>定時器中斷0>外部中斷1>定時器中斷1>序列中斷

中斷返回是reti 子程式返回是ret

13樓:匿名使用者

51微控制器的中斷源有:

外部中斷0

定時器0中斷

外部中斷1

定時器1中斷

串列埠中斷。

優先順序有ip暫存器對應的位來確定。

14樓:匿名使用者

可以採用組合6路與門或者或門(看高電平中斷還是低電平中斷)配合6個io口,只要一箇中斷源即可。但是速度會慢些。

具體做法跟原理是:六路(看電路而定,理論上可以無限擴充套件)中有一路產生中斷後,再用輪巡io口的方法找出哪一路電平發生的翻轉,然後就知道哪路產生中斷了。而且優先順序可以自己安排。

在微控制器中,ret和reti分別是什麼返回指令

15樓:匿名使用者

在微控制器中返回指令有ret、reti或者跳轉指令sjmp或ljmp。

ret是一般子程式返回指令,執行該指令,會自動彈出被保護的地址給pc指標。

reti是中斷服務程式返回指令,執行該指令,除了彈出被保護的地址指標給pc外,還會恢復影響中斷的一些標誌位,比如定時器中斷的tfn標誌。

16樓:東穎崇

ret是子程式返回

reti是中斷返回,並且清中斷標誌,以保證能繼續中斷.

17樓:匿名使用者

在微控制器中分別是什麼?返回指令?聽聽專業的人士了給你答覆吧,我也不會的。

18樓:匿名使用者

ret 是子程式的返回指令

reti 不清楚

51微控制器子程式中使用jmp(ajmp,ljmp,sjmp)指令 執行ret能不能回到主程式?

19樓:風間一葉

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

樓主這所有問題其實歸根結底就是一個問題,堆疊和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的地址靠後那麼就多點,不過一般夠用是肯定的了

20樓:做而論道

jmp(ajmp,ljmp,sjmp)指令,是轉移指令,它們在轉移的時候,並不保留當前的地址,所以使用ret指令,是無法回到原來的位置的。

使用lcall、acall指令,就是呼叫子程式的指令,是可以用ret指令返回的,因為lcall、acall指令儲存了原來的地址,可供ret使用。

另外,中斷程式中是可以使用jmp指令的,但是要保證,要儘快使用reti返回原來的斷點,否則就一直處於中斷之中,cpu以後就不會再相應同級別的中斷了。

------------------------

問題補充:

...,最後使用ret能不能回到call(acall,lcall)呼叫前的位置?

可以。...,多少次就會出錯?

lcall、acall指令儲存了原來的地址,是存放到堆疊裡面。

51微控制器的堆疊,是在片內ram中,空間是有限的。

空間究竟有多大,和你的棧底初始化的地址有關,另外,堆疊中,還會儲存其它的內容。所以,儲存返回地址的空間究竟能有多大,需要你自己計算。

多少次會出錯,是和你編寫的程式有關的。

你可以用keil軟體來除錯,把你的程式單步的執行走一遍,即可知道堆疊空間的使用情況了。

21樓:lixiao瀟瀟瀟

在子程式內用跳轉可以。但是如果在子程式內用跳轉 跳出了這個子程式執行別的去了,這個就要小心了,你的ret沒有執行(地址沒有出棧),可能會出現資料的錯誤,如果後面反覆呼叫該函式 也有可能因為地址只進棧不出棧 導致最終記憶體佔滿。

22樓:宇潔

我個人覺得你好像把這些指令的功能弄混了,jmp(ajmp,ljmp,sjmp)指令這些指令時單純的跳轉指令,比如jmp loop 這條指令,就是程式跳轉到loop這個地方去執行,並沒有什麼返回不返回的說法,除非執行過程中遇到別的指令。這幾個指令的區別的跳轉的距離,有短跳轉,長跳轉,這些你去看看指令表應該就知道了。

至於ret 是專門給子程式呼叫的時候用的,當你呼叫一個子程式,子程式執行完之後,必須要寫一個ret 這個指令,用來返回你呼叫子程式的那句程式的位置,以便程式繼續執行。

而reti 是專門給中斷子程式使用的,是用來做中斷返回用的。

這兩個指令跟jmp沒有關係,使用的時候在子程式裡依然可以使用jmp,但需要注意的是你用完jmp就不會返回到原來的地方,所以一般在子程式使用jmp不會超出本子程式的範圍,否則可能會造成程式跑飛,亂套了。

call(acall,lcall)呼叫中使用了jmp(ajmp,ljmp,sjmp)指令,最後使用ret能不能回到. 這個問題跟我剛才說的一樣。

call(acall,lcall)呼叫前的位置?

這個給你舉例說吧:

.....

mov a,#00h

call loop ;這裡就是call呼叫之前的位置

mov r1,#21h ;這裡是call呼叫之後返回的位置

......

loop:

jc c

mov a,#01h

retcall(acall,lcall)指令中呼叫call(acall,lcall),多少次就會出錯?

這個問題我還沒遇到過,一般在call中繼續用call呼叫子程式不會出什麼錯誤,除非你做的地址有重複,或者使用的暫存器有衝突,或者堆疊沒有設計好,才會出錯的,

我的回答基本就這些,這是第一次給別人回答,這些都是我自己的理解,因為我剛學的時候也遇到過類似的問題,不知道能不能對你有所幫助。

23樓:匿名使用者

進入中斷程式 後,執行reti,程式 轉回進入中斷子程式之前的位置。如果 用了jmp跳轉走了,回不回到原處,很難說了。

24樓:張庚

組合語言的這種跳轉指令最直接了,跟著順一遍就ok了一般是呼叫後,ret回主程式,這個的原理在於在call的時候,自動的把當前程式執行的位置存入堆疊,等於執行了一個push,ret的時候自動出站,把地址吐出來並跳到該位置

中斷程式的reti和ret的不同在於它還涉及開關中斷允許標誌樓主自己可以推斷一下,只要你jmp出去還在ret之前jmp回來,沒有影響到該狀態下的堆疊順序就ok可以。這個常見的,當你的子程式或者中斷程式裡有判斷分支的時候,常常會用判斷性的跳轉語句

微控制器相對很接近硬體,只要把它各個指令執行的原理理清了,這個小東西怎麼工作的,就可以靈活的利用組合語言來控制了

簡述MCS51微控制器的中斷入口地址

外部中斷0 0003h 定時 計數器中斷 000bh 外部中斷 0013h 定時 計數器1中斷 001bh 序列中斷 0023h 簡述mcs 51微控制器的中斷入口地址 外部中斷0 03h 定時器 計數器t0 0bh 外部中斷1 13h 定時器 計數器t1 1bh 序列口中斷 23h 80c51微控...

51微控制器的中斷服務程式能否用主程式中的某一段代替

可以的,但是得判斷中斷標誌位,判斷有中斷時跳轉到reti,正常執行主程式時不跳轉。其實還不如把主程式寫兩遍,一個是不帶rei的主程式,一個是中斷服務程式,後面要加reti 舉個例子,假設你可以判斷tf0 中斷0的溢位標誌 000bh ajmp main1 0100h main main1 jb tf...

MCS 51型微控制器它在開機復位後CPU如何確定和改變當前工作暫存器組的

改變 rs0 rs1 的資料就可以改變工作暫存器組,軟體給這兩個東西賦值就行了.上電覆位後,在初始化程式裡,對暫存器psw的rs1 rs0 psw.4 psw.3 4組工作暫存器區選擇控制位1和位0。預設應該是暫存器組0.當你需要使用工作暫存器時,cpu通過暫存器psw的rs1 rs0 psw.4 ...