ATPCS规则

举报
嵌入式与Linux那些事 发表于 2022/03/29 00:53:50 2022/03/29
【摘要】 1.寄存器使用规则  ARM处理器中有rO-r15共16个寄存器,它们的用途有一些约定的习惯,并依据这些用途定义了别名,如表所示。 寄存器别名使用规则r15pc程序计数器r14lr连接寄存器r13sp...
1.寄存器使用规则

ARM处理器中有rO-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寄存器4

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

  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)

  
 
  • 1

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

01 1drr0,=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
  • 2
  • 3
  • 4
  • 5

 第1行将r0设为0x30000000,则CopyCode2SDRAM函数执行时,它的第一个参数buf的指向的内存地址为0x30000000。
 第2行将r1设为0,CopyCode2SDRAM函数的第二个参数start addr等于0。
 第3行将r2设为161024,CopyCode2SDRAM函数的第三个参数start addr等于161024。
 第5行判断返回值。

文章来源: blog.csdn.net,作者:嵌入式与Linux那些事,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_16933601/article/details/102788924

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。