首页 > 编程语言 >ATPCS规则 ------ 汇编传参规则

ATPCS规则 ------ 汇编传参规则

时间:2022-12-10 23:12:34浏览次数:44  
标签:ATPCS 局部变量 规则 子程序 参数 寄存器 ------ 数据 ARM

1、寄存器使用规则

ARM处理器中有r0-r15共16个寄存器,它们的用途有一些约定的习惯,并依据这些用途定义了别名,如表所示。

项目别名使用规则
r15 pc 程序计数器
r14 lr 连接寄存器
r13 sp 数据栈指针
r12 ip 子程序内部调用的scratch寄存器
r11 v8 ARM状态局部变量寄存器8
r10 v7、s1 ARM状态局部变量寄存器7、在支持数据栈检查的ATPCS中为数据栈限制指针
r9 v6、sb ARM状态局部变量寄存器6、在支持RWPI的ATPCS中为静态基址寄存器
r8 v5 ARM状态局部变量寄存器5
r7 v4、wr ARM状态局部变量寄存器4、Thumb状态工作寄存器
r6 v3 ARM状态局部变量寄存器3
r5 v2 ARM状态局部变量寄存器2
r4 v1 ARM状态局部变量寄存器1
r3 a4 参数/结果/scratch寄存器4
r2 a3 参数/结果/scratch寄存器3
r1 a2 参数/结果/scratch寄存器2
r0 a1 参数/结果/scratch寄存器1

寄存器的使用规则总结如下。

  1. 子程序间通过寄存器r0-r15来传递参数,这时可以使用它们的别名a0-a3.被调用的子程序返回前无需恢复r0~r3的内容。
  2. 在子程序中,使用r4-r11来保存局部变量,这时可以使用它们的别名v1-v8.如果在子程序中使用了它们的某些寄存器,子程序进入时要保存这些寄存器的值,在返回前恢复它们;对于子程序中没有使用到的寄存器,则不必进行这些操作。在Thumb程序中,通常只能使用寄存器r4~r7来保存局部变量。
  3. 寄存器r12用作子程序间scratch寄存器,别名为ip.
  4. 寄存器rl3用作数据栈指针,别名为sp。在子程序中寄存器r13不能用作其他用途。它的值在进入、退出子程序时必须相等。
  5. 寄存器r14称为连接寄存器,别名为lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址(比如将Ir值保存到数据栈中),r14可以用作其他用途。
  6. 寄存器r15是程序计数器,别名为pc。它不能用作其他用途。

2、数据栈使用规则

数据栈有两个增长方向:向内存地址减小的方向增长时,称为DESCENDING栈;向内地址增加的方向增长时,称为ASCENDING栈。

所谓数据栈的增长就是移动栈指针。当栈指针指向栈顶元素(最后一个入栈的数据)时,称为FULL栈;当栈指针指向栈顶元素(最后一个入栈的数据)相邻的一个空的数据单元时,称为EMPTY栈。

综合这两个特点,数据栈可以分为以下4种。

  • ①FD:Full Descending,满递减。
  • ②ED:Empty Descending,空递减。
  • ③FA:Full Ascending,满递增。
  • ④EA:Empty Ascending,空递增。

ATPCS规定数据栈为FD类型,并且对数据栈的操作是8字节对齐的。使用stmdb/ldmia批量内存访问指令来操作FD数据栈。

使用stmdb命令往数据栈中保存内容时,先递减sp指针,再保存数据,使用ldmia命令从数据栈中恢复数据时,先获得数据,再递增sp指针,sp指针总是指向栈顶元素,这刚好是FD栈的定义。

3、参数传递规则

一般来说,当参数个数不超过4个时,使用r0~r3这4个寄存器来传递参数:如果参数个数超过4个,剩余的参数通过数据栈来传递。
对于一般的返回结果,通常使用a0-a3来传递。
示例:假设CopyCode2SDRAM函数是用C语言实现的,它的数据原型如下:

int Copycode2sDRM(unsigned char*buf,unsigned long startaddr,int size)

在汇编代码中,使用下面的代码调用它,并判断返回值。

01 ldr r0,=0x30000000e1.//目标地址=0x30000000,这是SDRAM的起始地址
02 mov r1,#0//e2.源地址=0
03 mov r2,#16*1024B3.//复制长度16K
04 b1 CopyCode2SDRAM8//调用c函数CopyCode2SDRAM
05 cmp a0,#0//判断函数返回值
  • 第1行将r0设为0x30000000,则CopyCode2SDRAM函数执行时,它的第一个参数buf的指向的内存地址为0x30000000。
  • 第2行将r1设为0,CopyCode2SDRAM函数的第二个参数start addr等于0。
  • 第3行将r2设为161024,CopyCode2SDRAM函数的第三个参数start addr等于161024。
  • 第4行进行跳转执行c程序
  • 第5行判断返回值。

 

标签:ATPCS,局部变量,规则,子程序,参数,寄存器,------,数据,ARM
From: https://www.cnblogs.com/god-of-death/p/16972554.html

相关文章

  • 《Emergent Cooperation from Mutual Acknowledgment Exchange》 2022-AAMAS
    从相互交换确认中产生合作总结:为了改进传统的激励其他代理人机制,其存在隐私侵犯的问题,文中提出一种两阶段的请求和回应机制,即即使想要激励其他人送出的东西还需要得到......
  • Atcoder-ABC281-DEF题解
    AtcoderBeginnerContest281D.MaxMultiple(DP)题意在长度为\(N\)的序列\(A\)中,找到\(K\)个元素其和为\(D\)的倍数,找出满足要求最大的和,没有则返回-1。数......
  • 中断和异常
    ①中断的概念和作用当中断发生时,CPU立即进入核心态当中断发生后,当前运行的进程暂停运行,并由操作系统内核对中断进行处理对于不同的中断信号,会进行不同的处理发......
  • 算法9:LeetCode_给定一个二叉树,判断它是否是高度平衡的二叉树。
    我们在算法7中已经学习了二叉排序树,平衡二叉树的相关知识。既然我们知道平衡二叉树中,节点的左子树和右子树的高度差至多为1,那么我们就可以通过如下思路来进行判断。1.节......
  • C#中的WebAPI
    前端用:vue3,后端:net6,的结合代码vue3手动创建:勾选1、路由配置:router。2、vuex状态管理:store类似全局变量。3、在加上UI库:element-plus模板大致UI库模板如下:安装ui库命令:npmi......
  • 系统调用
    ①系统调用的概念和作用“系统调用”是操作系统提供给应用程序(程序员/编程人员)使用的接口,可以理解为一种可供应用程序调用的特殊函数,应用程序可以发出系统调用请来获得......
  • 《MySQL必知必会》之快速入门存储过程
    使用存储过程本章介绍什么是存储过程,为什么使用、如何使用,并介绍如何创建和使用存储过程的基本语法存储过程在实际应用中,往往需要执行多个表的多条sql语句存储过程就......
  • Linus爱GPL 但不喜欢GPL诉讼
    在上周多伦多举行的LinuxConNA会议上,LinusTorvalds和VMware副总裁DirkHohndel讨论了GNUGPL在Linux成功上所起的作用。Hohndel问,内核面临的一大挑战是分裂......
  • S1 - Lesson 85 - 86
    Words Paris cinema filmmoviegotothecinemawatchafilmwatchamovie beautifulnicesmartlovelygood-lookinggorgeousbeauty cityNewYork......
  • 获取Openstack认证令牌
    在运行身份管理服务的典型OpenStack部署中,可以指定用于认证的项目名、用户名和密码凭证。下面以使用cURL命令为例进行示范。(1)首先导出环境变量OS_PROJECT_NAME(项目名)、OS_......