ARM核心函式呼叫原理

2021-10-01 16:00:13 字數 1257 閱讀 4036

1> 將返回點的位址壓棧;

2> 修改pc指標,跳轉到目標位址只執行;

3> 返回時,直接將返回位址從棧中彈出到pc指標,實現函式的返回

對於m3、m4核心,引入了乙個鏈結暫存器lr(link register),專門用來儲存函式返回位址。lr本子上相當於乙個深度為1的硬體棧,支援且僅1級函式呼叫。借助lr,核心對葉子函式的呼叫過程如下:

1> 將當前lr的值壓棧

2> 將返回點位址放入lr中(這是由跳轉指令自動完成的);

3> 修改pc指標,跳轉到目標位址執行(這實際上也是同一條指令完成的)

4> 返回時,直接將lr的值賦值給pc指標,實現函式的返回

5> 將先前把存在棧中的lr值出棧

arm的跳轉指令可以從當前指令向前或向後32m的位址空間跳轉。如下

b:跳轉指令

bl:帶返回的跳轉指令         (同時還將pc暫存器的值儲存到lr暫存器中)

blx:帶返回的狀態切換的跳轉指令

bx:帶狀態切換的跳轉指令

arm5 及以上版本中,實現了arm指令集和thumb指令集的混用。指令使用目標位址值的bit[0]來確定目標程式的型別。bit[0]的值為1,目標程式為thumb指令(半字對齊);bit[0]的值為0,目標程式為arm(字對齊)指令;

對於函式呼叫來說,是跳轉指令觸發的;對於中斷/異常處理來說,是未被遮蔽的中斷/異常請求觸發的。在arm cortex m核心引入了 "退出令牌(exc_return)"這一概念,執行過程額u下

1> 將當前 "返回點位址" 和 lr 的值壓棧(這是核心自動完成的)

2>將 "退出令牌" 放入lr中(這是核心自動完成的)

3>修改pc指標,跳轉到中斷/異常處理程式的首位址處執行(這是核心自動完成的)

4>返回時,直接將lr的值賦值給pc指標。由於當前lr內儲存的是退出令牌,觸發核心中斷/異常處理模式(這是核心自動完成的)

5>將先前儲存在棧中的lr值和 "返回點位址" 出棧,其中 "返回點位址" 被彈出到pc指標中,從先前的中斷點繼續執行(這是核心自動完成的)

ARM核心架構

接下來我們可以討論arm核心架構,這裡我提一下,為啥討論這個arm,因為筆者最先接觸和知道這個,riscv熟悉了我後面會補上這個內容,毫不誇張的說,riscv可能也會像linux那樣成功引領乙個時代的發展。廢話不扯多了,前面繞了個大圈子再回來講了這個arm架構,主要目的是也是為了講這個作一些鋪墊,a...

ARM函式呼叫時引數傳遞規則

之前在學習如何在c語言中嵌入彙編時有了解到c語言之前的引數呼叫是使用暫存器 r0傳遞第乙個引數,r1傳遞到第二個.一直到r3傳遞第四個引數.但是 實際上有時可能傳遞的引數非常多,超過8個,或是引數中有浮點數之類,引數也會超過4個暫存器,對於超出的部份並不使用r4,而是使用堆疊的方式.對於arm體系來...

ARM微控制器與ARM核心

人們常常把arm架構和arm微控制器混淆,其實使用arm核心的微控制器有很多,比如st公司的stm32f103,它就是使用arm cortext m3核心,那麼究竟什麼是arm核心呢?mcu microcontrol unit 俗稱微控制器,它有cpu,rom,ram,i o,中斷系統,定時器,時鐘...