RISCV学习(1)基本模型认识
笔者来聊聊ARM的函数的调用规则
1、ARM函数调用规则介绍
首先介绍几个术语,
- AAPCS:Procedure Call Standard for the ARM Architecture
- APCS:ARM Procedure Call Standard
- TPCS:Thumb Procedure Call Standard
- ATPCS:ARM-Thumb Procedure Call Standard
- ABI:Application Binary Interface
- EABI:Embedded Application Binary Interface
前三个基本就是ARM 架构的程序调用标准(包括ARM指令以及thumb指令),最后两个是程序二进制接口,描述是汇编下面寄存器名使用、函数调用、压栈、参数传递以及程序返回等一系列接口标准。
比如x86与arm架构的ABI 就不兼容,寄存器都不一样,肯定就是无法互相使用,包括最近比较火热的RISC-V架构。
2、ARM32/64 函数调用规则
ARM架构下面分为32位以及64位的程序,其标准有些不同以及扩展,可分开来讲。
2.1、ARM
- 机器寄存器
对于ARM以及thumb指令集来说,总有16个寄存器使用,不管大小写,在汇编语言里面都是可以识别的,一般来说大写的有特殊用途,详情见下文。- R0-R3 作为函数参数传递以及返回值使用,也可以在程序中保存立即数。
- R12 (IP)链接器使用的暂存器
- R9 平台寄存器,ARM不推荐使用,避免平台依赖
- R4-R8,R10,R11 暂存器
- R11 作为栈指针,指向程序调用中开辟空间的栈底,可用来栈回溯,具体可以参考ARMARM学习(1) 寄存器的理解 ===》FP、SP、LR寄存器。
- R13 SP 栈指针
- R14 LR 链接寄存器
- R15 PC 程序计数器
- CPSR 状态寄存器 详情介绍见ARM学习(2) 寄存器的理解 ===》通用寄存器及状态寄存器。
- cp15 协处理 监控通用寄存器的使用

- 程序处理、内存以及栈
一个程序的内存通常会划分为几部分:Code、read-only static data、writeable static data、heap and stack,Code段里面会包括read-only static data,DATA段会包括初始化好的全局变量,BSS包括堆栈以及未初始化和初始化为0的全局变量- stack 临时存储变量以及传递额外的参数(程序调用时寄存器数量不足),
- 栈有范围限制,Limit < SP < Base
- 其次必须4 byte对齐,
- 程序必须访问栈的部分范围内区域(SP ,base-1),不能访问之外的区域,

- 子程序调用
- BL指令会跳到目标程序,并且修改LR为当前PC的按顺序下一条指令地址,指的是没跳转之前的PC的下一条。
- 需要注意修改LR最低位表示当前为什么状态,,0:是arm状态,无需修改(因为地址都是word 2Byte对齐的),1:是thumb状态,需要修改,

可以看到R14以及PC的值都是奇数,代表是thumb指令。


R15(PC):0x0801247E 位于 DMA_GetFlagStatus,
R14:0x08014ECB 位于 UART1_SentMsgL,保存了其返回的地址。
-
返回值
- R0:返回值是D-Word(32 bit),或者是单精度浮点型float,
- R0-R1:返回值是Q-Word(64 bit),或者双精度浮点型double
- R0-R3:返回值是128bit的向量

调用GetSysTime之后,r0则获取到值,然后r1计算好之后,则cmp进行比较r0,r1.
-
参数传递
- R0-R3 和栈进行传递
- 参数少的函数,只用寄存器就可以了,减少访问内存带来的负载
- 优先寄存器,然后栈,寄存器从小到大,栈地址从小到大。
1、函数声明:void OLED_DrawBMP_test(unsigned char x0, unsigned char y0,unsigned char x1, unsigned char y1,unsigned char BMP[],unsigned char state1,unsigned char state2);
2、共用7个参数:x0,y0,x1,y1,BMP[],state1,state2
3、前四个参数都分别存储在r0-r3,
4、后面三个参数存储在栈中,strd r7,r6,[r13] 以及str r6,[r13,#0x8] ,前面指令存储r7 r6 两个参数,后面地址偏移8之后,又存储一个参数,总计三个参数,存储顺序依次都是参数从左向右去存储。
5、不符合__cdecl、__stdcall、__fastcall这三种调用标准。

-
内部联合工作(ARM与Thumb指令)
- 子程序调用和程序返回支持两张状态切换。bx或者blx都可以切换状态。
2.2、ARM64
参考文档
1、ARM Procedure Call Standard
2、Procedure Call Standard for the ARM 64-bit Architecture (AArch64)
相关文章:
RISCV学习(1)基本模型认识
笔者来聊聊ARM的函数的调用规则 1、ARM函数调用规则介绍 首先介绍几个术语, AAPCS:Procedure Call Standard for the ARM ArchitectureAPCS:ARM Procedure Call StandardTPCS:Thumb Procedure Call StandardATPCS:AR…...
【java代码审计】命令注入
1 成因 开发者在某种开发需求时,需要引入对系统本地命令的支持来完成某些特定的功能,此时若未对用户的输入做严格的过滤,就可能发生命令注入。 2 造成命令注入的类或方法 Runtime类:提供调用系统命令的功能 ①Runtime.getRuntim…...
速锐得适配北汽EX系列电动汽车CAN总线应用于公务分时租赁
过去的几年,我们看到整个分时租赁业务出现断崖式下跌,这是我们看到这种市场情况,是必然,也是出乎意料。原本很多融资后的出行公司、大牌的出行服务商的分时租赁业务,受各种影响不得不转型成其他出行服务。例如…...
已解决ERROR: Failed building wheel for opencv-python-headless
已解决ERROR: Failed building wheel for opencv-python-headless Failed to build opencv-python-headless ERROR: Could not build wheels for opencv-python-headless, which is required to install pyproject.toml-based projects报错信息亲测有效 文章目录报错问题报错翻…...
每日获取安全资讯的网站,国内外共120个
国内 FreeBuf(https://www.freebuf.com/) 安全客(https://www.anquanke.com/) 雷锋网安全(https://www.leiphone.com/category/security) 先知社区(https://xz.aliyun.com/) CSDN安全…...
HUN工训中心:开关电路和按键信号抖动
工训中心的牛马实验 1.实验目的: 1) 认识开关电路,掌握按键状态判别、开关电路中逻辑电平测量、逻辑值和逻辑函数电路。 2) 掌握按键信号抖动简单处理方法。 3) 实现按键计数电路。 2.实验资源: HBE硬件基础电路实验箱、示波器、万用表…...
WordPress 主题 SEO 标题相关函数和过滤器教程wp_get_document_title()
WordPress 4.4.0 版本开始,加入了 wp_get_document_title(); 这个函数,而 wp_title(); 已经 deprecated 不推荐使用。因此,如果想要启用 WordPress 主题标题功能,在不安装 WordPress SEO 插件的情况下,可以使用以下代码…...
Qt 事件机制
【1】事件 事件是可以被控件识别的操作。如按下确定按钮、选择某个单选按钮或复选框。 每种控件有自己可识别的事件,如窗体的加载、单击、双击等事件,编辑框(文本框)的文本改变事件等等。 事件就是用户对窗口上各种组件的操作。…...
【Python】Numpy--np.linalg.eig()求对称矩阵的特征值和特征向量
【Python】Numpy–np.linalg.eig()求对称矩阵的特征值和特征向量 文章目录【Python】Numpy--np.linalg.eig()求对称矩阵的特征值和特征向量1. 介绍2. API3. 代码示例1. 介绍 特征分解(Eigendecomposition),又称谱分解(Spectral d…...
医疗床头卡(WIFI方案)
一、产品特性 7.5寸墨水屏显示WIFI无线通信,极简部署,远程控制按键及高亮LED指示灯指示800*480点阵屏幕锂电池供电,支持USB充电DIY界面支持文本/条码/二维码/图片超低功耗/超长寿命,一次充电可用一年基于现有Wifi环境,…...
[YOLO] yolo博客笔记汇总(自用
pip下载速度太慢,国内镜像: 国内镜像解决pip下载太慢https://blog.csdn.net/weixin_51995286/article/details/113972534 YOLO v2和V3 关于设置生成anchorbox,Boundingbox边框回归的过程详细解读 YOLO v2和V3 关于设置生成an…...
Linux 常用 API 函数
文章目录1. 系统调用与库函数1.1 什么是系统调用1.2 系统调用的实现1.3 系统调用和库函数的区别2. 虚拟内存空间3. 错误处理函数4. C 库中 IO 函数工作流程5. 文件描述符6. 常用文件 IO 函数6.1 open 函数6.2 close 函数6.3 write 函数6.4 read 函数6.5 lseek 函数7. 文件操作相…...
【转载】bootstrap自定义样式-bootstrap侧边导航栏的实现
bootstrap自带的响应式导航栏是向下滑动的,但是有时满足不了个性化的需求: 侧滑栏使用定位fixed 使用bootstrap响应式使用工具类 visible-sm visible-xs hidden-xs hidden-sm等对不同屏幕适配 侧滑栏的侧滑效果不使用jquery方法来实现,使用的是css3 tr…...
奇瑞x华为纯电智选车来了,新版ADS成本将大幅下降
作者 | 德新 编辑 | 于婷HiEV获悉,问界M5将在4月迎来搭载高阶辅助驾驶的新款,而M9将在今年秋天发布。 奇瑞一侧,华为将与奇瑞首先推出纯电轿车,代号EH3。新车将在奇瑞位于芜湖江北新区的智能网联超级二工厂组装下线。目前超级二工…...
机器学习的特征归一化Normalization
为什么需要做归一化? 为了消除数据特征之间的量纲影响,就需要对特征进行归一化处理,使得不同指标之间具有可比性。对特征归一化可以将所有特征都统一到一个大致相同的数值区间内。 为了后⾯数据处理的⽅便,归⼀化可以避免⼀些不…...
程序员看过都说好的资源网站,看看你都用过哪些?
程序员必备的相关资源网站一.图片专区1.表情包(1)发表情(2)逗比拯救世界(3)搞怪图片生成(4)哇咔工具2.图标库(1)Font Awesome(2)iconf…...
Win11的两个实用技巧系列之设置系统还原点的方法、安全启动状态开启方法
Win11如何设置系统还原点?Win11设置系统还原点的方法很多用户下载安装win11后应该如何创建还原点呢?现在我通过这篇文章给大家介绍一下Win11如何设置系统还原点?在Windows系统中有一个系统还原功能可以帮助我们在电脑出现问题的时候还原到设置的时间上&…...
【Linux】项目的自动化构建-make/makefile
💣1.背景会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译ÿ…...
【Redis学习2】Redis常用数据结构与应用场景
Redis常用数据结构与应用场景 redis中存储数据是以key-value键值对的方式去存储的,其中key为string字符类型,value的数据类型可以是string(字符串)、list(列表)、hash(字典)、set(集合) 、 zset(有序集合)。 这5种数据类型在开发中可以应对大部分场景的…...
踩了大坑:https 证书访问错乱
文章目录一、问题排查及解决问题一:证书加载错乱问题二:DNS 解析污染问题问题三:浏览器校验问题二、终极解决方法2.1 可外网访问域名2.2 只能内网访问域名2.3 内网自动化配置2.4 错误解决一、问题排查及解决 今天遇到这样一个问题࿰…...
用LVGL玩转嵌入式UI:5个实战控件代码详解(按钮/滑块/图片/标签/开关)
LVGL嵌入式UI开发实战:五大核心控件深度解析与代码优化 在资源受限的嵌入式设备上实现流畅美观的用户界面,一直是开发者面临的挑战。LVGL(Light and Versatile Graphics Library)作为一款轻量级开源图形库,凭借其丰富的…...
OpenClaw+ollama-QwQ-32B自动化测试:从用例生成到结果分析
OpenClawollama-QwQ-32B自动化测试:从用例生成到结果分析 1. 为什么选择OpenClaw做测试自动化 作为一个长期与测试代码打交道的开发者,我一直在寻找能够真正减轻重复劳动的解决方案。传统的测试框架虽然成熟,但编写和维护测试用例仍然占据了…...
MQTT通信中的QoS级别详解:SpringBoot如何选择最适合的传输质量?
MQTT通信中的QoS级别详解:SpringBoot如何选择最适合的传输质量? 在物联网和分布式系统架构中,消息传输的可靠性往往直接关系到业务逻辑的正确性。MQTT协议作为轻量级发布/订阅模式的通信标准,其QoS(服务质量࿰…...
嵌入式 数据结构 线性表 学习笔记
线性表线性结构的特点是:1、存在唯一的一个被称作“第一个”的数据元素2、存在唯一的一个被称作“最后一个”的数据元素3、除第一个之外,集合中的每个元素均只有一个前驱4、除最后一个以外,集合中的每个数据元素均只有一个后继顺序表示和实现…...
如何用ABC系统三分钟搞定复杂电路优化:顺序逻辑综合与形式验证的完整指南
如何用ABC系统三分钟搞定复杂电路优化:顺序逻辑综合与形式验证的完整指南 【免费下载链接】abc ABC: System for Sequential Logic Synthesis and Formal Verification 项目地址: https://gitcode.com/gh_mirrors/ab/abc 在现代数字电路设计中,你…...
2026年03月27日全球AI前沿动态
一句话总结AI领域覆盖通用/垂直大模型、智能体应用、物理机器人、硬件算力、企业战略、产品更新、投融资、行业观点、民生教育、研究资源全维度,国产技术密集突破、智能体全面落地、硬件自研提速、安全风险频发、老年AI教育落地,行业向实用化、国产化、安…...
人工智能毕业设计2026方向集合
0 选题推荐 - 人工智能篇 毕业设计是大家学习生涯的最重要的里程碑,它不仅是对四年所学知识的综合运用,更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要,它应该既能体现你的专业能力,又能满足实际…...
别再手动改配置了!用Flutter的--dart-define实现开发/测试/生产环境一键切换
Flutter多环境配置实战:用--dart-define打造全链路自动化工作流 每次切换环境都要手动修改十几个配置项?还在为不同环境的API地址、应用图标和包名管理头疼?是时候告别这种低效的开发方式了。作为一位经历过无数个深夜调试环境的Flutter开发者…...
OpenRGB:统一多品牌设备控制的开源RGB解决方案
OpenRGB:统一多品牌设备控制的开源RGB解决方案 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Releases can …...
开源工具实现游戏存档编辑:虚幻引擎存档处理全指南
开源工具实现游戏存档编辑:虚幻引擎存档处理全指南 【免费下载链接】uesave 项目地址: https://gitcode.com/gh_mirrors/ue/uesave 在游戏开发与玩家体验中,虚幻引擎的存档文件往往以二进制格式存储,这给数据修改、备份与分析带来了挑…...
