为了使C语言程序和汇编程序之间能够互相调用,必须为子程序间的调用制定规则~~

然后呢,在ARM处理器中,这个规则被称为ATPCS:ARM程序和Thumb程序中子程序调用的规则(如果用过51单片机汇编和C的混合编程,那这个就So Easy了~~)。

这里只是说说基本的ATPCS规则包括寄存器使用规则、数据栈使用规则、参数传递规则。

1、寄存器使用规则:

ARM处理器中有r0-r15共16个寄存器,它们的用途是有一些约定的习惯的!

并依据这些用途定义了别名。

如图:

寄存器的使用情况如下:

1)子程序间通过寄存器r0-r3来传递参数,这时可以使用它们的别名a0-a3,被调用的子程序返回前无需回复r0-r3的内容。

2)在子程序中,使用r4-r11来保存局部变量,这时可以使用它们的别名v1-v8,如果在子程序中使用了它们的某些寄存器,子程序进入时要保存这些寄存器的值,返回时再次恢复它们;

对于子程序中没有使用到的寄存器,则不必进行这些操作,在Thumb指令中,通常只能使用寄存器r4-r7来保存局部变量。

3)寄存器r12用作子程序间scratch寄存器,别名为ip。

4)寄存器r13用作数据栈指针,别名为sp,在子程序中寄存器r13不能用作它用,它的值在进入、退出子程序时必须相等。

5)寄存器r14称为连接寄存器,别名为lr,它用于保存子程序的返回地址。

如果在子程序中保存了返回地址(比如将lr值保存到数据栈中),r14可用作它用。

6)寄存器r15是程序计数器,别名pc,没有别的用途~~

2、数据栈使用规则

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

向内存地址增加的方向增长时,称为ASCENDING栈。

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

当栈指针指向栈顶元素相邻的一个空的数据单元时,称为EMPTY栈。

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

1)FD: Full Descending,满递减。

2)ED:Empty Descending,空递减。

3)FA:Full Ascending,满递增。

4)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 CopyCode2SDRAM(unsigned char *buf,unsigned long StartAddr,int size)

在汇编代码中,使用下面的代码调用,同时判断返回值:

ldr r0,=0x30000000     @ 1、目标地址=0x30000000,这是SDRAM的起始地址

mov r1,#0              @ 2、源地址=0

mov r2,#16*1024        @ 3、复制长度=16K

bl  CopyCode2SDRAM     @ 4、调用C函数CopyCode2SDRAM

cmp a0,#0              @ 5、进行判断

KG—ARM-Thumb子程序调用规则—ATPCS相关推荐

  1. 【Android 逆向】Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )

    文章目录 前言 一.x86 架构的返回值获取 二.ARM 架构远程调用 前言 在之前的博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 ...

  2. arm64 linux 除零正常返回,arm64程序调用规则

    前言 这篇主要介绍arm64程序调用规则,详细分析了程序调用过程中,参数是如何传递的.Android.iOS.Linux等基本遵循这些规则,但是各个操作系统平台也有小部分自己特定的规则.下一篇,我将介 ...

  3. httpservlet.java:131_Servlet学习1:Http状态码、多个Servlet之间调用规则、多个Servlet之间数据共享实现方案...

    Http状态码 1.介绍: 1)由三位数字组成的一个符号. 2)Http服务器在推送响应包之前,根据本次请求处理情况将Http状态码写入到响应包中[状态行]上 3)如果Http服务器针对本次请求,返回 ...

  4. 自己归纳整理的ARM THUMB指令机器码表

    有个项目需要分析ARM THUMB指令的机器码,网上没有搜索到整理好的机器码表,只好自己把相关指令的机器码归纳整理出来,这里分享给大家.THUMB指令并不多,只有六十多条,这个数字真的是非常了不起,5 ...

  5. for循环10000次花多长时间_我的三菱FX PLC学习之子程序调用与循环

    戳上方蓝字 "技成电工课堂" 关注我们哦! 上次,我们学习了程序流程转移中的条件跳转CJ,这次,我们接着向子程序调用CALL和FOR循环发起进攻吧! 显然,子程序调用CALL和FO ...

  6. JavaScript函数 this调用规则

    不是我翻译的,但是觉得不错,为了分享,只好... JavaScript函数调用规则一 (1)全局函数调用: function makeArray( arg1, arg2 ){ return [this ...

  7. C++函数模板和普通函数的调用规则

    C++函数模板和普通函数的调用规则: 普通函数可以进行自动类型转换. 函数模板必须严格类型匹配. C++编译器优先考虑普通函数. 如果函数模板可以产生一个更好的匹配,那么选择模板. 可以通过空模板实参 ...

  8. C++ 普通函数与函数模板 区别以及调用规则01

    //普通函数 和 函数模板 区别 int myPlus(int a, int b) {return a + b; }template<class T> T myPlus2(T a, T b ...

  9. c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)

    什么叫泛型编程?1. 参数类型化. 2. 模板 模板概念 c++提供了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就成为函数模 ...

最新文章

  1. spring定时每天早上八点_Spring Boot教程(13) – 简单定时任务
  2. 求介绍matlab函数用法的书,MATLAB初学者教程--函数用法的简单介绍
  3. MySQL 性能优化及常用命令
  4. sphinx_Sphinx之谜:如何轻松地编写代码
  5. Hibernate读书笔记
  6. 快速排序算法理解-python
  7. feign直接走熔断_SpringCloud微服务面试必问:Hystrix 服务降级、熔断
  8. 人工智能切入垂直领域 风口已至?
  9. 使用SO-PMI算法构建行业/专业情感词典
  10. vue-router实现SPA购物APP基本功能
  11. 2018.12.11-21:45
  12. Blazor 状态管理
  13. 如何解除服务器注册,《天龙八部手游》服务器注册上限怎么办 服务器注册方法...
  14. C/C++二维数组的用法
  15. Python自学笔记-lambda函数(来自廖雪峰的官网Python3)
  16. 基于web的库存管理系统
  17. 在线搜索全网音乐支持歌曲外链下载等源码[免费开源]
  18. PR卡点插件 Premiere自动卡点自动剪辑插件 音乐鼓点节拍插件BeatEdit v1.0.10.2+使用教程
  19. 2020.7.25 PAT甲级7-2 The Judger (25分)
  20. 女朋友说“随便”到底是什么意思?

热门文章

  1. python使用ray框架改进原有代码,实现多进程与分布式
  2. 解决numpy报错UFuncTypeError: Cannot cast ufunc ‘add‘ output from dtype(‘x‘) to dtype(‘x‘)
  3. VS code解决Latex不显示参考文献,正文中显示[?]的问题
  4. 公司java框架让程序员变笨_框架会使程序员变笨吗?
  5. python全栈索引
  6. java框架之Quartz-任务调度整合Spring
  7. 使用bat执行java项目
  8. 【计算机网络】简单网络管理协议 SNMP
  9. VS2010调试小技巧
  10. Objective-C 一些很基础的总结