KG—ARM-Thumb子程序调用规则—ATPCS
为了使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相关推荐
- 【Android 逆向】Android 进程注入工具开发 ( 远程调用 | x86 架构的返回值获取 | arm 架构远程调用 )
文章目录 前言 一.x86 架构的返回值获取 二.ARM 架构远程调用 前言 在之前的博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 ...
- arm64 linux 除零正常返回,arm64程序调用规则
前言 这篇主要介绍arm64程序调用规则,详细分析了程序调用过程中,参数是如何传递的.Android.iOS.Linux等基本遵循这些规则,但是各个操作系统平台也有小部分自己特定的规则.下一篇,我将介 ...
- httpservlet.java:131_Servlet学习1:Http状态码、多个Servlet之间调用规则、多个Servlet之间数据共享实现方案...
Http状态码 1.介绍: 1)由三位数字组成的一个符号. 2)Http服务器在推送响应包之前,根据本次请求处理情况将Http状态码写入到响应包中[状态行]上 3)如果Http服务器针对本次请求,返回 ...
- 自己归纳整理的ARM THUMB指令机器码表
有个项目需要分析ARM THUMB指令的机器码,网上没有搜索到整理好的机器码表,只好自己把相关指令的机器码归纳整理出来,这里分享给大家.THUMB指令并不多,只有六十多条,这个数字真的是非常了不起,5 ...
- for循环10000次花多长时间_我的三菱FX PLC学习之子程序调用与循环
戳上方蓝字 "技成电工课堂" 关注我们哦! 上次,我们学习了程序流程转移中的条件跳转CJ,这次,我们接着向子程序调用CALL和FOR循环发起进攻吧! 显然,子程序调用CALL和FO ...
- JavaScript函数 this调用规则
不是我翻译的,但是觉得不错,为了分享,只好... JavaScript函数调用规则一 (1)全局函数调用: function makeArray( arg1, arg2 ){ return [this ...
- C++函数模板和普通函数的调用规则
C++函数模板和普通函数的调用规则: 普通函数可以进行自动类型转换. 函数模板必须严格类型匹配. C++编译器优先考虑普通函数. 如果函数模板可以产生一个更好的匹配,那么选择模板. 可以通过空模板实参 ...
- C++ 普通函数与函数模板 区别以及调用规则01
//普通函数 和 函数模板 区别 int myPlus(int a, int b) {return a + b; }template<class T> T myPlus2(T a, T b ...
- c++模板---1(模板概念,利用模板实现数组排序,函数模板调用规则)
什么叫泛型编程?1. 参数类型化. 2. 模板 模板概念 c++提供了函数模板,所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就成为函数模 ...
最新文章
- spring定时每天早上八点_Spring Boot教程(13) – 简单定时任务
- 求介绍matlab函数用法的书,MATLAB初学者教程--函数用法的简单介绍
- MySQL 性能优化及常用命令
- sphinx_Sphinx之谜:如何轻松地编写代码
- Hibernate读书笔记
- 快速排序算法理解-python
- feign直接走熔断_SpringCloud微服务面试必问:Hystrix 服务降级、熔断
- 人工智能切入垂直领域 风口已至?
- 使用SO-PMI算法构建行业/专业情感词典
- vue-router实现SPA购物APP基本功能
- 2018.12.11-21:45
- Blazor 状态管理
- 如何解除服务器注册,《天龙八部手游》服务器注册上限怎么办 服务器注册方法...
- C/C++二维数组的用法
- Python自学笔记-lambda函数(来自廖雪峰的官网Python3)
- 基于web的库存管理系统
- 在线搜索全网音乐支持歌曲外链下载等源码[免费开源]
- PR卡点插件 Premiere自动卡点自动剪辑插件 音乐鼓点节拍插件BeatEdit v1.0.10.2+使用教程
- 2020.7.25 PAT甲级7-2 The Judger (25分)
- 女朋友说“随便”到底是什么意思?
热门文章
- python使用ray框架改进原有代码,实现多进程与分布式
- 解决numpy报错UFuncTypeError: Cannot cast ufunc ‘add‘ output from dtype(‘x‘) to dtype(‘x‘)
- VS code解决Latex不显示参考文献,正文中显示[?]的问题
- 公司java框架让程序员变笨_框架会使程序员变笨吗?
- python全栈索引
- java框架之Quartz-任务调度整合Spring
- 使用bat执行java项目
- 【计算机网络】简单网络管理协议 SNMP
- VS2010调试小技巧
- Objective-C 一些很基础的总结