歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> 嵌入式Linux ARM匯編(五)——ARM體系結構過程調用標准

嵌入式Linux ARM匯編(五)——ARM體系結構過程調用標准

日期:2017/3/3 12:10:59   编辑:Linux技術

嵌入式Linux ARM匯編(五)——ARM體系結構過程調用標准

一、AAPCS簡介

AAPCS --Procedure Call Standard for the ARM Architecture,提供了緊湊的編寫例程的一種機制,定義的例程可以與其他例程交織在一起。最顯著的一點是對這些例程來自哪裡沒有明確的限制。它們可以編譯自 C、 Pascal、也可以是用匯編語言寫成的。
APCS 定義了:A、對寄存器使用的限制。B、使用棧的慣例。C、在函數調用之間傳遞/返回參數。D、可以被‘回溯’的基於棧的結構的格式,用來提供從失敗點到程序入口的函數(和給予的參數)的列表。APCS 不是單一的給定標准,而是一系列類似但在特定條件下有所區別的標准。如果要寫用來與編譯後的C 連接的匯編代碼,則必須使用 APCS。基本過程調用標准可以確保分別編譯或匯編的子程序能夠協同工作。

二、AAPCS的標准規范

AAPCS不是一個強制的標准,只是一個對於ARM編程的推薦標准。以下從編程的基本數據類型、寄存器的使用規范、內存的分配、子函數的調用、函數的參數傳遞等方面解讀。

1、基本數據類型

類型機器類型
所占字節數字符型無符號字節(Unsigned byte)1
有符號字節(Signed byte)1
整數型無符號半(Unsigned half-word)2
有符號半字(Signed half-word)2
無符號字(Unsigned word)
4
有符號字(Signed word)
4
無符號雙字(Unsigned double-word)8
有符號雙字(Signed double-word)8
浮點型單精度浮點(Single precision)4
雙精度浮點(Double precision)8
指針型數據指針(Data pointer)
4
代碼指針(Code pointer)
4

2、寄存器的使用規范

寄存器的特定角色
寄存器編號可選寄存器名特殊寄存器名寄存器用法
R0
a1
函數調用時的參數寄存器,用來存放前4個函數參數並存放返回值。在函數內如果將這些寄存器用作其他用途,將破壞其值。
R1
a2
R2
a3
R3
a4
R4
v1
通用變量寄存器
R5
v2
R6
v3
R7
v4
R8
v5
R9
v6或SB或TR平台寄存器,不同的平台對該寄存器的定義不同R10v7
通用變量寄存器。在使用堆棧邊界檢測的情況下,r10保存堆棧邊界地址R11v8
通用變量寄存器
R12IP臨時過渡寄存器,函數調用時會破壞其值
R13SP堆棧指針
R14LR鏈接寄存器
R15PC程序計數器
寄存器r0~r3:子程序之間通過r0~r3來傳遞參數,當參數個數多於4個時,使用堆棧來傳遞參數。此時r0~r3可記作A1~A4。
寄存器r4~r11:在子程序中使用r4~r11保存局部變量。因此當進行子程序調用時要注意對這些寄存器的保存和恢復。此時r4~r11可記作V1~V8。
寄存器r12:用於保存堆棧指針SP,當子程序返回時使用該寄存器出棧,記作IP。
寄存器r13:堆棧指針,記作SP。
寄存器r14:鏈接寄存器,記作LR。用於保存子程序的返回地址。
寄存器r15:程序計數器,記作PC。
程序狀態寄存器CPSR:


3、進程、內存和棧

程序執行過程中,將內存劃分為以下5種類型:
A、代碼段
B、只讀數據段
C、可讀寫數據段
D、棧(stack)
E、堆(heap)
堆棧采用滿遞減類型(FD, Full Descending),即堆棧通過減小存儲器地址而向下增長,堆棧指針指向內含有效數據項的最低地址。

4、子程序調用標准

子函數的調用使用BL指令,根據返回結果的數據類型大小選擇的寄存器如下:
A、小於4字節的基本數據類型進行符號擴展成32位,結果保存在r0返回B、4字節大小的基本數據類型(如int)直接通過r0返回C、雙字大小的數據類型(如long long、double)通過r0和r1返回,其中r0包含返回結果的低32位D、不大於4字節的復合數據類型,結果保存在r0中返回(格式按使用LDR指令按字邊界對齊從內存中讀取)E、大於4字節的復合數據類型,將結果的內存地址通過r0返回

5、參數傳遞

A、固定個數自變量的函數前面的整形參數按順序分配給r0~r3,其余參數按順序分配給堆棧
B、可變個數自變量的函數參數值使用a1~a4(R0--R3)傳遞
本文出自 “生命不息,奮斗不止” 博客,請務必保留此出處http://9291927.blog.51cto.com/9281927/1785943
Copyright © Linux教程網 All Rights Reserved