ARM子函数定义中的参数放入寄存器的规则

关于ARM子函数定义中的参数放入寄存器的规则,网上也有很多文章和书籍介绍了,但是还有很多同学不太了解这个基础知识,这里摘取网上的一些介绍,简述一下。

对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回,关于ATPCS的详细内容可以查看ADS1.2 Online Books Developer Guide的2.1节。

简单ATPCS寄存器的使用规则:

1. 子程序通过寄存器R0~R3来传递参数. 这时寄存器可以记作: A0~A3 , 被调用的子程序在返回前无需恢复寄存器R0~R3的内容.

2. 在子程序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作: V1~V8 .如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量.

3.寄存器R12用作子程序间scratch寄存器,记作ip; 在子程序的连接代码段中经常会有这种使用规则.

4. 寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用做其他用途. 寄存器SP在进入子程序时的值和退出子程序时的值必须相等.

5. 寄存器R14用作连接寄存器,记作lr ; 它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其它的用途.

6. 寄存器R15是程序计数器,记作PC ; 它不能用作其他用途.

7. ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的.

补充:

ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递

子程序结果返回规则

1.结果为一个32位的整数时,可以通过寄存器R0返回.

2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.

3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回.

4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.

5.对于位数更多的结果,需要通过调用内存来传递.

时间: 2024-08-03 22:32:36

ARM子函数定义中的参数放入寄存器的规则的相关文章

函数声明和函数定义中的默认参数浅析

默认参数是存在于函数的声明中,还是函数的定义中呢? 我在VS6.0和VS2008下做了如下实验,并做出了简单的总结,有不足或者不准确的地方,欢迎大家拍砖,我会及时修正相关内容. 实验一:默认参数不能同时存在于函数声明和函数定义中. #include <iostream> #include <tchar.h> using namespace std; void SetHeight(double dHeight = 183.5); int _tmain(int argc, TCHAR*

php函数fgetcsv()中的参数enclosure的解读

原型 fgetcsv(resource fp, int length [, string delimiter [, string enclosure [, string escape]]]) 对于enclosure的解释是围绕字段的字符. 参考http://blog.ifeeline.com/217.html的说明: 包含逗号, 双引号, 或是换行符的字段必须放在引号内(只有三个特殊值时需要特别处理).字段内部的引号必须在其前面增加一个引号来实现引号的转码.分隔符逗号前后的空格 可能不会被修剪掉

python基础 函数定义 返回值 参数

函数定义 1 #python中函数定义.def函数定义的关键字,fun1函数名,x为函数的形参可以有多个,多个之间用“,”隔开:return 函数返回值的关键字,python中return可以是非必要 2 def fun1(x): 3 x += 1 4 return x 函数返回值 1 # 函数返回值可以有多个,之间使用“’”分隔,返回值讲多个值组成的元组进行返回. 当无return时python会隐式return “None”,如果只返回一个值就返回这个值本身 2 def fun2(x, y)

Gson将参数放入实体类中进行包装之后再传递

package com.sinoservices.dms.orderinfo.entity; public class OrderDetailKeyCondition { //工单主键 private Long id; public Long getId() { return id; } public void setId(Long id) { this.id = id; }} Gson gson = new Gson(); if(!"".equals(data) &&

Qt中的QTableView 中的列放入Widget

QTableView是Qt中Model View理念的框架,View只展现数据,所以通过互交修改编辑数据,需要用到委托这个概念Delegate. 所以基本思路是继承QItemDelegate这个类,然后overried里面的方法,然后通过QTableView的成员函数setItemDelegateForColumn就可以了. 以下代码是在某列中添加QComboBox: 1 ///////////////////////////EmployeePrivilegeComboxEditor.h////

【原】高光贴图参数放入颜色贴图的alpha通道中

今天美术想把高光贴图参数合成到Main贴图中,减少贴图数,挺好,知道省内存了. 于是简单改了改surface着色器. Shader "Custom/HighLightByAlphaPass" {    Properties {         _MainTex ("Base (RGBA A--HighLight)", 2D) = "white" {}         _MainColor("Diffuse",Color) =

将Oracle中的数据放入elasticsearch

package com.c4c.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.Date; import java.util.List; public clas

将.txt文件中的内容放入列表中

.txt文件如下: 代码实现: with open('F:/F/python_code/00.txt') as f: a = f.readlines() b = [n[:-1] for n in a] print(b) 原文地址:https://www.cnblogs.com/czz0508/p/10461405.html

Python中函数的参数定义和可变参数

转自:http://www.cnblogs.com/tqsummer/archive/2011/01/25/1944416.html  简洁易懂啊,好文 刚学用Python的时候,特别是看一些库的源码时,经常会看到func(*args, **kwargs)这样的函数定义,这个*和**让人有点费解.其实只要把函数参数定义搞清楚了,就不难理解了. 先说说函数定义,我们都知道,下面的代码定义了一个函数funcA def funcA():  pass    显然,函数funcA没有参数(同时啥也不干:D