当前位置: 首页 > news >正文

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函数调用规则介绍 首先介绍几个术语&#xff0c; AAPCS&#xff1a;Procedure Call Standard for the ARM ArchitectureAPCS&#xff1a;ARM Procedure Call StandardTPCS&#xff1a;Thumb Procedure Call StandardATPCS&#xff1a;AR…...

【java代码审计】命令注入

1 成因 开发者在某种开发需求时&#xff0c;需要引入对系统本地命令的支持来完成某些特定的功能&#xff0c;此时若未对用户的输入做严格的过滤&#xff0c;就可能发生命令注入。 2 造成命令注入的类或方法 Runtime类&#xff1a;提供调用系统命令的功能 ①Runtime.getRuntim…...

速锐得适配北汽EX系列电动汽车CAN总线应用于公务分时租赁

过去的几年&#xff0c;我们看到整个分时租赁业务出现断崖式下跌&#xff0c;这是我们看到这种市场情况&#xff0c;是必然&#xff0c;也是出乎意料。原本很多融资后的出行公司、大牌的出行服务商的分时租赁业务&#xff0c;受各种影响不得不转型成其他出行服务。例如&#xf…...

已解决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&#xff08;https://www.freebuf.com/&#xff09; 安全客&#xff08;https://www.anquanke.com/&#xff09; 雷锋网安全&#xff08;https://www.leiphone.com/category/security&#xff09; 先知社区&#xff08;https://xz.aliyun.com/&#xff09; CSDN安全…...

HUN工训中心:开关电路和按键信号抖动

工训中心的牛马实验 1.实验目的&#xff1a; 1) 认识开关电路&#xff0c;掌握按键状态判别、开关电路中逻辑电平测量、逻辑值和逻辑函数电路。 2) 掌握按键信号抖动简单处理方法。 3) 实现按键计数电路。 2.实验资源&#xff1a; HBE硬件基础电路实验箱、示波器、万用表…...

WordPress 主题 SEO 标题相关函数和过滤器教程wp_get_document_title()

WordPress 4.4.0 版本开始&#xff0c;加入了 wp_get_document_title(); 这个函数&#xff0c;而 wp_title(); 已经 deprecated 不推荐使用。因此&#xff0c;如果想要启用 WordPress 主题标题功能&#xff0c;在不安装 WordPress SEO 插件的情况下&#xff0c;可以使用以下代码…...

Qt 事件机制

【1】事件 事件是可以被控件识别的操作。如按下确定按钮、选择某个单选按钮或复选框。 每种控件有自己可识别的事件&#xff0c;如窗体的加载、单击、双击等事件&#xff0c;编辑框&#xff08;文本框&#xff09;的文本改变事件等等。 事件就是用户对窗口上各种组件的操作。…...

【Python】Numpy--np.linalg.eig()求对称矩阵的特征值和特征向量

【Python】Numpy–np.linalg.eig()求对称矩阵的特征值和特征向量 文章目录【Python】Numpy--np.linalg.eig()求对称矩阵的特征值和特征向量1. 介绍2. API3. 代码示例1. 介绍 特征分解&#xff08;Eigendecomposition&#xff09;&#xff0c;又称谱分解&#xff08;Spectral d…...

医疗床头卡(WIFI方案)

一、产品特性 7.5寸墨水屏显示WIFI无线通信&#xff0c;极简部署&#xff0c;远程控制按键及高亮LED指示灯指示800*480点阵屏幕锂电池供电&#xff0c;支持USB充电DIY界面支持文本/条码/二维码/图片超低功耗/超长寿命&#xff0c;一次充电可用一年基于现有Wifi环境&#xff0c…...

[YOLO] yolo博客笔记汇总(自用

pip下载速度太慢&#xff0c;国内镜像&#xff1a; 国内镜像解决pip下载太慢https://blog.csdn.net/weixin_51995286/article/details/113972534​​​​​​​ YOLO v2和V3 关于设置生成anchorbox&#xff0c;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自带的响应式导航栏是向下滑动的&#xff0c;但是有时满足不了个性化的需求: 侧滑栏使用定位fixed 使用bootstrap响应式使用工具类 visible-sm visible-xs hidden-xs hidden-sm等对不同屏幕适配 侧滑栏的侧滑效果不使用jquery方法来实现&#xff0c;使用的是css3 tr…...

奇瑞x华为纯电智选车来了,新版ADS成本将大幅下降

作者 | 德新 编辑 | 于婷HiEV获悉&#xff0c;问界M5将在4月迎来搭载高阶辅助驾驶的新款&#xff0c;而M9将在今年秋天发布。 奇瑞一侧&#xff0c;华为将与奇瑞首先推出纯电轿车&#xff0c;代号EH3。新车将在奇瑞位于芜湖江北新区的智能网联超级二工厂组装下线。目前超级二工…...

机器学习的特征归一化Normalization

为什么需要做归一化&#xff1f; 为了消除数据特征之间的量纲影响&#xff0c;就需要对特征进行归一化处理&#xff0c;使得不同指标之间具有可比性。对特征归一化可以将所有特征都统一到一个大致相同的数值区间内。 为了后⾯数据处理的⽅便&#xff0c;归⼀化可以避免⼀些不…...

程序员看过都说好的资源网站,看看你都用过哪些?

程序员必备的相关资源网站一.图片专区1.表情包&#xff08;1&#xff09;发表情&#xff08;2&#xff09;逗比拯救世界&#xff08;3&#xff09;搞怪图片生成&#xff08;4&#xff09;哇咔工具2.图标库&#xff08;1&#xff09;Font Awesome&#xff08;2&#xff09;iconf…...

Win11的两个实用技巧系列之设置系统还原点的方法、安全启动状态开启方法

Win11如何设置系统还原点?Win11设置系统还原点的方法很多用户下载安装win11后应该如何创建还原点呢&#xff1f;现在我通过这篇文章给大家介绍一下Win11如何设置系统还原点&#xff1f;在Windows系统中有一个系统还原功能可以帮助我们在电脑出现问题的时候还原到设置的时间上&…...

【Linux】项目的自动化构建-make/makefile

&#x1f4a3;1.背景会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的 规则来指定&#xff0c;哪些文件需要先编译&#xff…...

【Redis学习2】Redis常用数据结构与应用场景

Redis常用数据结构与应用场景 redis中存储数据是以key-value键值对的方式去存储的&#xff0c;其中key为string字符类型&#xff0c;value的数据类型可以是string(字符串)、list(列表)、hash(字典)、set(集合) 、 zset(有序集合)。 这5种数据类型在开发中可以应对大部分场景的…...

踩了大坑:https 证书访问错乱

文章目录一、问题排查及解决问题一&#xff1a;证书加载错乱问题二&#xff1a;DNS 解析污染问题问题三&#xff1a;浏览器校验问题二、终极解决方法2.1 可外网访问域名2.2 只能内网访问域名2.3 内网自动化配置2.4 错误解决一、问题排查及解决 今天遇到这样一个问题&#xff0…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...