關於微控制器在呼叫子程式時,進行了怎樣的堆疊操作

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

1樓:

「斷點的pc值入棧,還有哪些東西呢?」

取決於子程式的型別和程式設計方式。有些特殊型別的子程式是需要入棧的,若採用高階語言程式設計則編譯器會自動新增相應的入棧出棧語句。

「有人說臨時變數不入棧,那cpu從子程式執行退回斷點時,臨時變數的值是如何恢復的呢?」

呵呵,為何要恢復?呼叫子程式的時候會從區域性變數塊中新分配空間的,如同你後半部分所說。

2樓:

棧: 在函式呼叫時,第一個進棧的是主函式中函式呼叫後的下一條指令(函式呼叫語句的下一條可執行語句)的地址,然後是函式的各個引數,在大多數的c編譯器中,引數是由右往左入棧的,然後是函式中的區域性變數。注意靜態變數是不入棧的。

當本次函式呼叫結束後,區域性變數先出棧,然後是引數,最後棧頂指標指向最開始存的地址,也就是主函式中的下一條指令,程式由該點繼續執行。

堆:一般是在堆的頭部用一個位元組存放堆的大小。堆中的具體內容有程式設計師安排。

3樓:做而論道

微控制器在呼叫子程式時,進行了怎樣的堆疊操作?除了斷點的pc值入棧,還有哪些東西呢?

--沒有其它的了。

比如臨時變數?!有人說臨時變數不入棧,那cpu從子程式執行退回斷點時,臨時變數的值是如何恢復的呢?還是說臨時變數只是在c語言上的定義形式,...

--c語言,並沒有子程式。

--c語言,稱為函式。

--概念不能混用。

--呼叫c函式時,引數的傳遞方法,返回值的傳遞方法,各有好幾種:單個數值、陣列、指標...,講起來,得用好幾頁,還是看書去吧。

4樓:匿名使用者

可重入函式呼叫時,被調函式內部臨時變數要入棧。資料之所以入棧是因為空間資源重合了,需要保護原資料。

組合語言呼叫子程式地址入棧出棧情況

5樓:做而論道

子程式,應該稱為過程。

定義過程的時候,有 遠、近 的區別。

呼叫遠過程,就是段地址和偏移地址,都要入棧。

51微控制器呼叫子程式問題,怎樣51微控制器呼叫兩個子程式

直接跳回主程式,再初始化。怎樣51微控制器呼叫兩個子程式 5 天蠍神經俠侶 mov r0,08h mov a,0feh loop mov p1,a lcall del rr a djnz r0,loop 使用djnz 指令。為0執行下一指令,不為0跳轉。就可以呼叫內兩個容子程式了 估計是進入到倒計時...

微控制器用for迴圈編延時程式時uint i,j for

這是一個for的巢狀語句,你注意到沒有,因為兩個語句之間沒有分號,所以編譯器預設第二個for語句是第一個for語句的內部語句,怎麼理解呢?就是說你第一個for中的 i 減1一次,那第二個for中的語句將會執行110次,那麼這個110從 來呢?其實是根據你所用微控制器的晶振頻率來計算的,在這個程式當中...

為什麼這個微控制器延時子程式用了PUSH和POP

請你參考 高手們喜歡這樣寫,看懂了就沒有那麼可怕了,其實就是一種儲存資料的方法。下面逐句分析,先說明一下吧 push與pop必須成對出現,否則就亂了 另外誰跟誰是一對也得弄清。delay mov r2,30h 以下3行不解釋了 acall delay0 retdelay0 push 02h 把02h...