ARM架構過程呼叫標準AAPCS
AAPCS是ARM架構的處理器規定的一些標準
1、引數和返回值傳遞,對於簡單的情況,輸入引數由R0-R3分別用來記錄第1到第4個引數。當傳遞的引數超過4個時,就需要藉助棧來儲存引數。函式的返回值通常儲存在R0中,若返回值為64位的,R1也用來儲存返回值。
2、函式呼叫中的暫存器用法。函式或子程式應該保持R4-R11、R13和R14的數值。若這些暫存器在函式或子程式執行期間被修改,則其函式應該保持在棧中並在返回呼叫程式碼前恢復。這幾個暫存器也被稱作“被呼叫者儲存暫存器”,也就是需要被呼叫者(例如子函式,中斷等)進行儲存的暫存器。而對於R0-R3、R12、則屬於呼叫者儲存暫存器,這幾個暫存器是需要呼叫者做儲存工作。在發生異常或中斷啊時,R0-R3、R12、SP、PC會硬體自動程序壓棧。
3、連結暫存器LR用於函式或子程式呼叫時返回地址的儲存,若某函式需要呼叫另外一個函式或子程式,則它需要首先將LR的數值儲存到棧中,否則,當執行了函式呼叫後,LR的當前值就會丟失。
看幾個簡單的例子,以STM32F407為例子
一個簡單的例子,一個有兩個引數的求和函式。在傳引數1和2的時候,R0,R1作為了傳參時的暫存器。
返回值通過R0傳遞。再看看LR如何使用的呢,m=sum(1,2);的下一條語句的地址是0x8000536,進入sum子函式後,這個地址被儲存到了LR中(第二張圖),LR的實際儲存的是0x8000537,這是因為LR最低位置1表示是thumb狀態。
函式中再次呼叫子函式,如何處理呢,我們為了體現效果,在sum函式再加一個函式,這個函式本身沒什麼作用
與沒有新增wuyong函式相比,進入sum的時候多了一條PUSH {r4-r5,lr},這是因為:
1、r0,r1在接下來wuyong函式中需要拿來傳遞兩個引數,所以用r3,r4來儲存了原先R0和R1的值,R5儲存了局部變數e的值。所以先將r4,r5儲存到了棧中
2、由於sum又呼叫了子函式,所以需要先將lr儲存到棧中,呼叫wuyong時,lr需要儲存執行完wuyong函式後的返回地址。
執行完這一句後,r4,r5,lr被推入了棧中。
上述幾個過程,把AAPCS的一些要點大概過了一下,細節的東西有興趣可以繼續研究研究
相關推薦
ARM架構過程呼叫標準AAPCS
AAPCS是ARM架構的處理器規定的一些標準1、引數和返回值傳遞,對於簡單的情況,輸入引數由R0-R3分別用來記錄第1到第4個引數。當傳遞的引數超過4個時,就需要藉助棧來儲存引數。函式的返回值通常儲存在R0中,若返回值為64位的,R1也用來儲存返回值。2、函式呼叫中的暫存器用
理解APCS-- ARM過程呼叫標準
轉自: http://blog.csdn.net/keyboardota/article/details/6799054 (紅色標記是自己修正部分) 因為需要在QNX Momentics中混合C語言和ARM彙編進行開發,於是初步瞭解了一下APCS。和大家分享一下我自己
程式碼 or 指令,淺析ARM架構下的函式的呼叫過程
摘要:linux程式執行的狀態以及如何推導呼叫棧。 1、背景知識 1、ARM64暫存器介紹: 2、STP指令詳解(ARMV8手冊): 我們先看一下指令格式(64bit),以及指令對於寄存機執行結果的影響 型別1、STP <Xt1>, <Xt2>, [<Xn|SP>],
arm linux 系統呼叫過程
在Linux下系統呼叫是用軟中斷實現的,下面以一個簡單的open例子簡要分析一下應用層的open是如何呼叫到核心中的sys_open的。 t8.c 1: #include <stdio.h> 2: #include <sys/types.h> 3:
ARM架構核心執行過程
在瞭解這些之前我們首先需要了解幾個名詞,這些名詞定義在/Documentation/arm/Porting裡面,這裡首先提到其中的幾個,其餘幾個會在後面kernel的執行過程中講述: 1)ZTEXTADDR boot.img執行時候zImage的起始地址,即kernel解壓程式碼的地址
arm linux 系統呼叫過程
在Linux下系統呼叫是用軟中斷實現的,下面以一個簡單的open例子簡要分析一下應用層的open是如何呼叫到核心中的sys_open的。 t8.c 1: #include <stdio.h> 2: #include <sys/types.
arm架構的初始化過程步驟
ARM處理器模式 ARM微處理器支援7種執行模式,分別為: 使用者模式(usr):ARM處理器正常的程式執行狀態。 快速中斷模式(fiq):用於高速資料傳輸或通道處理。 外部中斷模式(irq):用於通用的中斷處理。 管理模式(svc):作業系統使用的保護模式。 資料訪問終止模式(abt):當資料或指令預取終止
ARM架構的標準軟硬體系統漸成形
談到x86架構,最早其實來自4004晶片(4位元,也是世界上第一顆CPU),該晶片用於交通號誌控制,嚴格而論是個微控制器(Micro Controller),不是電子資料處理的微處理器(Micro Processor),4004後有4040、8008(8位元)、8080、8
x86、arm、mips架構函式呼叫例項分析
原文網址:http://nieyong.github.com/wiki_cpu/ 在看過了上面的幾節之後,在潛意識中你想記住的東西肯定很多了。這個時候,你需要靜下心來休息一下在沉澱一下。 "Now is a good point to take a break to l
【arm】arm架構64位入門基礎:架構分析、暫存器、呼叫規則、指令集、程式除錯以及參考手冊
Date: 2018.8.21 1、參考 2、ARM64位架構分析 ARM64位採用ARMv8架構,64位操作長度,對應處理器有Cortex-A53、Cortex-A57、Cortex-A73、iphones的A7和A8等。 AARCH64是全新32位固定長
SylixOS中ARM架構的MMU實現分析
SylixOS ARM MMU 1. 理論知識 1.1 快表(TLB)與頁表 在虛擬頁式存儲管理中設置了快表(TLB),用於保存正在運行進程頁表的子集,通常快表存放在高速緩沖存儲器(Cache)中。而頁表存放在內存中,並通過特殊功能寄存器(TTB)等告知系統頁表存儲在內存中的基址。 1.2 一
ARM 架構
code 需要 目的 決定 程序計數器 內存 計數器 頂部 有一種 ARM有16個通用寄存器, R0-R15, 5個用於特殊目的, R11(幀指針, FP), R12(過程內寄存器, IP), R13(棧指針, SP), R14(鏈接寄存器, LR), R15(程序計數器,
【筆記】Mybatis高階查詢(七)--儲存過程呼叫
以下例子展示Mybatis儲存過程呼叫,與普通查詢基本一樣,只是在配置對映時要加上statementType=“CALLABLE”,由於儲存過程方式不支援Mybatis的二級快取,所以要加上useCache=“false”。 在儲存過程中使用引數時,除了配置屬性名外,還需要指定
通過Libsoc在嵌入式ARM簡化GPIO呼叫
By Toradex胡珊逢 1). 簡介 嵌入式裝置往往會通過 GPIO 連線外設,從而實現通訊、狀態監測、控制等功能,使用者需要操作特定的 GPIO。在 Linux 系統中,使用者應用一般無法直接訪問 SoC 的 GPIO 暫存器,而使用特定的引腳編號,然而不同ARM模組平臺供應商的管腳定
【Windows原理】非同步IO-_APC(非同步過程呼叫)
// 同步IO的缺點是, 在讀寫檔案時, 如果檔案太大, 或者讀寫的時間太長, 就會在讀寫函式中 // 阻塞住. // 非同步IO解決了這個問題, 非同步IO讀寫檔案時, 檔案再大也不會阻塞住 // 但是非同步IO要完成這樣的特性是有一點付出的 // 非同步讀寫檔案後, 需要通過一些方式
RPC 協議 Remote process call 遠端過程呼叫
RPC資訊協議由兩個不同結構組成:呼叫資訊和答覆資訊。 簡單的說,RPC就是從一臺機器(客戶端)上通過引數傳遞的方式呼叫另 一臺機器(伺服器)上的一個函式或方法(可以統稱為服務)並得到返回的結果。 RPC 會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊
【筆記】ARM架構和ARM晶片(三)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
【筆記】ARM架構和ARM晶片(二)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
一個jdbc與儲存過程呼叫之間的資料對映問題
背景 一個功能,管理員直接新增使用者賬號,儲存過程如下【postgresql資料庫】: -- 儲存過程 管理員直接新增會員賬號 CREATE OR REPLACE FUNCTION "sp_account_member_reg_by_admin"( para_nam
RPC(遠端過程呼叫)簡介
RPC(Remote Procedure Call Protocol)——遠端過程呼叫協議,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。 之前聽過這個名詞,但是也只是大概記住了“遠端呼叫”之類的關鍵詞,而其他並沒有太多瞭解。 來到TX實習,確實如別人所說的那樣