首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ARM到C调用约定,NEON寄存器保存

ARM到C调用约定是指在ARM架构下,C语言与汇编语言之间的函数调用规则。它定义了函数参数的传递方式、寄存器的使用规则以及栈的管理方式。

在ARM架构中,函数参数的传递主要通过寄存器来完成。常见的寄存器用于传递函数参数的方式有以下几种:

  1. 寄存器传递:前四个整型参数(32位)会依次存放在r0、r1、r2和r3寄存器中。如果参数超过四个或者是浮点型参数,则会通过栈传递。
  2. 栈传递:当参数个数超过四个时,多余的参数会通过栈来传递。栈是一种后进先出的数据结构,用于存储临时数据。在函数调用过程中,参数会被依次压入栈中,然后在函数内部通过栈指针进行访问。

NEON寄存器是ARM架构中的一组SIMD(单指令多数据)寄存器,用于高效地进行并行计算。NEON寄存器可以同时处理多个数据,提高了计算效率。NEON寄存器的保存方式与普通寄存器类似,但在函数调用过程中需要特别注意保存和恢复NEON寄存器的状态。

在ARM到C调用约定中,为了保证函数调用的正确性和一致性,需要遵循以下规则:

  1. 函数调用方负责将参数传递给被调用方,并按照约定的方式保存寄存器状态。
  2. 被调用方负责保存和恢复被调用函数中使用的寄存器状态,以及处理栈的管理。
  3. 返回值通常通过寄存器r0来传递,如果返回值为浮点型,则使用浮点寄存器s0来传递。
  4. NEON寄存器的保存和恢复需要遵循特定的规则,以保证函数调用过程中不会破坏NEON寄存器的状态。

NEON寄存器的保存和恢复可以通过使用NEON指令来完成。在函数调用前,需要将NEON寄存器的状态保存到内存中,然后在函数调用结束后再将其恢复。这样可以确保函数调用过程中不会对NEON寄存器的状态造成影响。

总结起来,ARM到C调用约定定义了ARM架构下C语言与汇编语言之间的函数调用规则,包括函数参数的传递方式、寄存器的使用规则以及栈的管理方式。NEON寄存器是ARM架构中的一组SIMD寄存器,用于高效地进行并行计算,需要特别注意在函数调用过程中保存和恢复NEON寄存器的状态。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

听GPT 讲Rust源代码--compiler(25)

这些枚举常量用于标识不同的函数调用约定,在Rust编译器的其他部分可以使用这些枚举常量来判断和处理不同的函数调用约定。这些函数调用约定决定了函数参数和返回值的传递方式、寄存器的使用和保存等细节。...该函数根据调用约定规则计算出被调用函数需要在栈上分配多少空间来保存寄存器,并保证栈帧的正确对齐。这在函数调用时非常重要,因为它确保了函数调用的正确性和可靠性。...除此之外,该文件还实现了用于从栈上重新加载保存寄存器的函数,以及计算向栈上保存参数的偏移量等功能。这些功能都是为了实现符合PowerPC架构调用约定的函数调用过程。.../arm.rs 文件的作用是定义了在ARM架构上的函数调用约定(ABI)。...通过这些结构体和函数,arm.rs 文件实现了ARM架构上的函数调用约定,使得Rust代码可以在ARM架构上进行正确的函数调用和参数传递。

13910

ARM Neon Intrinsics 学习指北:从入门、进阶学个通透

intrinsics是以类似调用C语言函数的方法调用Neon,并由编译器生成最终的二进制代码,assembly则是手工嵌入Neon汇编,直接生成二进制代码。...其他:相关的研讨会视频、库、文档等 ---- 1 入门 1.1 Neon介绍、简明案例与编程惯例 推荐阅读ARM官方的 Optimizing C Code with Neon Intrinsics (https...但注意,如果仅是单纯地用Assembly改写C++,优化效果和Intrinsics一样(188.37ms VS 187.70ms),进一步的性能改进来自于额外的预取指令(pld)和对双发射流水(硬件设计...因此,我们至少需要了解在编写Neon代码时,有多少个专用寄存器可供利用,这就涉及体系结构的知识。...从cache读取余下的第2~第16个int8数据寄存器仍然是要花费时钟周期的)。

4.4K41
  • aarch64下NEON的使用与思考

    此时就可以正常的看到使用了64位的浮点运算单元寄存器了 3.aarch64的NEON指令与寄存器 neon是一种基于SIMD的arm技术,单指令多数据流指令在多媒体场合比较适用。...下面是不同的arm体系架构下SIMD指令的支持情况 ? 对于armv8一条neon指令的格式如下: {}{} Vd., Vn., Vm....然后调用NEON的加法运算指令UQADD V0.16B, V0.16B, V1.16B,Q0代表数组A, Q1代表数组B, 每次读128bit (16个), 利用ARM vector无饱和相加指令UQADD...但是这里往往涉及的问题是图像的传输速度是否跟的上图像的处理速度?这个一般设计中,图像处理速度比图像传输速度快上许多。...另外就是关于SIMD在处理过程中中断到来后现场恢复的问题,实际上我们入栈和出栈的过程只是FPU/SIMD公用的寄存器来进行状态的保存和恢复,而实际的运算指令实际就是一条,所以如果要进行深度的SIMD指令级的定制

    5.3K51

    手把手教你从零开始实现C++协程

    这就需要了解寄存器使用约定,以 32 位 ARM 架构为例,其调用约定在 AAPCS(Procedure Call Standard for the ARM Architecture)官方文档中有详细描述...由于每一种 CPU 架构都有自己的指令集和函数调用约定,甚至同一种 CPU 架构下不同操作系统也会有不同的调用约定。为了方便讲解,本文涉及的所有 API 实现均基于 32 位 ARM 架构。...5) 压栈,此时寄存器调用栈的状态如下: 当代码运行 hello() 中时,通过 (r0,r1,r2,r3) 可以访问前 4 个参数,通过 FP 寄存器加偏移可以访问后 2 个参数,此时寄存器调用栈的状态如下...不只是 32 位 ARM,大部分架构的调用约定中都有前 N 个参数直接使用寄存器,超过 N 个参数需要压栈的约定。...当然,在具体实现过程中会有很多坑,如: win32 中如何在协程中支持 C++ 异常 Windows 中对 FS/GS 寄存器的特殊处理 x64 和 AMD64 调用约定的区别 ARM/THUMB 模式的兼容

    3.9K50

    ARM64 撬开逆向大门

    •CPSR:状态寄存器•FP(X29):保存栈帧地址(栈底指针)•LP(X30):通常称X30为程序的链接寄存器保存子程序结束后需要执行的下一条指令。 通用寄存器作用是什么? ?...,存储内存中。...LDUR指令:将内存中负数的数据取出来,并存放到寄存器中。 LDP指令:表示出栈指令 ? ARM64汇编的函数有那些需要重点关注? 1.函数调用约定是什么约定?...ARM64使用的是ATPCS(ARM-Thumb Procedure Call Standard/ARM-Thumb过程调用标准)的函数调用约定。2.函数需要用到到的指令有那些?...RET:子程序返回指令,返回地址默认保存在X30寄存器(LR链接寄存器) LR:保存子程序结束后需要执行的下一条指令 PC:表示当前执行的指令的地址。3.函数的参数怎么存储传递? 3.1.

    2.1K54

    armeabi-v7a架构(sv7a)

    在ANE中如果SDK调用了so库,则需要把so库放到ANE下Android-ARM/lib/armeabi (调试模式)或者 armeabi-v7a(发行模式)下。...-EOF- 在我们android APK的根目录有一个 libs文件夹,此文件夹下包含了armeabi 和armeabi-v7a两个文件夹,我们的c代码编译成的本地库(各种.so)就会放在这两个文件夹其中的一个...什么是 NEONNEON* 是一种 ARM* 技术,主要用于多媒体(智能手机和高清电视等)应用。...如欲了解有关此技术的详细信息,以深入了解 NEON 及其它性能考虑,请访问以下网址: http://www.arm.com/products/processors/technologies/neon.php...注意,数据运算通常会涉及到处理基于精度的打包浮点数值;并且需要在 XMM 寄存器之间,或在这些寄存器与内存之间批量传输数据。 XMM 寄存器主要用于取代 MMX 寄存器

    1.2K10

    NEON做色域变化_ 用单核性能无限逼近八核并行OpenCV

    二、相关知识 Neon汇编是一种针对ARM架构处理器的一种汇编语言,是一种SIMD(单指令多数据)架构的扩展,它允许处理器同时对多个数据执行相同的操作,从而显著提高处理速度,特别是对于处理多媒体和图形数据...Neon寄存器是128位的,可以被视为1个128位、2个64位、4个32位、8个16位或者16个8位的数据元素。Neon汇编通常也被用于优化性能,如视频编解码、图像处理和音频处理等。...三、相关工作 由于网上许多neon汇编优化工作都是和C语言相比,虽然具有一定参考意义,但本身C语言做的功能实现限制较多也比较简单,这篇博客更偏向于直接和OpenCV进行比较,毕竟在性能优化方面,OpenCV...那么接下来,我们先熟悉下几个会经常用到的neon函数以及数据类型: 数据操作 说明 vld1_u8 从内存中读取8*8位数据寄存器 vld1q_u8 从内存中读取16*8位数据寄存器 vld3q_u8...从内存中读取3个16*8位数据寄存器中 vst3q_u8 将三个128位寄存器的数据写到内存中 vld4_u8 从内存中读取4个8*8位数据寄存器中 vmull_u8 执行两个8*8位无符号整数的乘法操作

    14310

    学习在kernel态下使用NEON对算法进行加速的方法

    如下图,APU需要至少四条指令完成加操作,而NEON只需要1条,考虑ld和st,节省的指令更多。 ? 上述特性,使NEON特别适合处理块数据、图像、视频、音频等。...1.4 NEON 使用方式 1.4.1 NEON使用方式 NEON有若干种使用方式: C语言被编译器自动向量化,需要增加编译选项,且C语言编码时有若干注意事项。...C语言里调用,这些函数反汇编时会直接编程响应的NEON指令。...这种方式比较实用与C语言环境,且相对简单。本文后续使用这种方式进行详细说明。 1.4.2 C语言NEON数据类型 需包含arm_neon.h头文件,该头文件在gcc目录里。都是向量数据。.../drivers/zynq_fpga_driver/mmi_neon/lcd_hw_fs8812_neon.c:8: /home/liuwanpeng/lin/lib/gcc/arm-xilinx-linux-gnueabi

    1.8K21

    第十二章:向量指令 第一部分

    对于 ARM CPU,开发了 NEON 向量扩展。这些 64 位和 128 位的向量指令使用 32 个 64 位寄存器或 16 个 128 位寄存器ARM64 有 32 个 128 位寄存器)。...然后,相应的 32 位寄存器元素被相加,结果被写入第三个寄存器,最后复制 array_c。这个示例突出了内嵌函数的另一个显著特点。...ARM 中的 NEON 内嵌函数具有类似的命名模式(图2,b)。请记住,有两种类型的向量寄存器(64 位和 128 位)。字母 q 表示指令适用于 128 位寄存器。...ARM NEON 也为这些操作提供了指令,涵盖了 8 位、16 位、32 位和 64 位数据大小,包括有符号和无符号。...ARM NEON 中存在类似的指令(VZIP 指令系列)。其中一些使用两个目标寄存器而不是一个,因此处理输入数据的全部。还有一些反向工作的指令(VUZP),x86 上没有对应的指令。

    13810

    介绍一种性能较好的 Android native unwind 技术

    假如你在编译的时候启用了 -fno-omit-frame-pointer 选项(clang 默认启用这个选项),编译器会把某个特定的寄存器当 fp 寄存器,用来保存当前函数调用栈的起始地址。...按照 ARM调用约定(AAPCS)[1] ,在 fp 寄存器指向的栈空间上紧凑的存着上一层函数的 fp 地址和函数返回地址。大概样子就是下图这样。...这个 c 指的是表中 CFA 一列,可以把它理解成一个虚拟的保存着栈帧基地址的 stack pointer 寄存器,所以 c 的值就是当前的栈基地址。...有了 unwind tables 我们能找出来当前函数栈帧起始的位置以及可以计算出寄存器保存的返回地址是多少,经过多轮这样的迭代就可以回溯出整个调用栈。...穿过 JNI Android 的 JNI 函数调用是有保存栈帧基地址某个特定寄存器的,32 位上是 r10,64 位是 x28,具体可以看 AOSP 代码 [8.1] [8.2] 。

    6.3K41

    ARM的体系结构。

    NEON 技术是通过清晰方式构建的,并可无缝用于其本身的独立流水线和寄存器文件。  ...它具有 32 个寄存器,64 位宽(是 16 个寄存器,128 位宽的双倍视图。)  ...NEON 指令可执行“打包的 SIMD”处理:  寄存器被视为同一数据类型的元素的矢量  数据类型可为:有符号/无符号的 8 位、16 位、32 位、64 位单精度浮点  指令在所有通道中执行同一操作...  使用 NEON 技术的 ARM Cortex™-A 系列处理器,以及 ARM 的 Mali 多媒体硬件解决方案可用于多媒体应用,范围从智能手机和移动计算设备 HDTV。  ...nbsp;  通过具有双 128 位/64 位视图的大型 NEON 寄存器文件,可有效处理数据并尽可能减少对内存的访问,从而增加了数据吞吐量。764261140

    1.5K30

    60行代码加速20倍 NEON实现深度学习OD任务后处理绘框

    向量寄存器加载: 使用NEON的加载指令从内存中加载像素数据向量寄存器中。3....一种方法是使用循环,每次处理一行,然后更新寄存器中的值以反映特定颜色。我们可以使用NEON的广播指令来创建一个包含特定颜色所有分量的向量,然后使用存储指令将其写入图像的左侧和右侧边界。...2.2 向量寄存器加载 这一步需要将图像BGR通道元素加载到寄存器,由于图像一般为uint8格式,这里可以使用最大的寄存器,把位宽拉满,也就是一次性操作16个元素,调用NEON instrinc中的vld3q_u8...加载图像BGR数据uint8x16x3_t寄存器中,再将单个通道的数据分发到到单个uint8x16_t寄存器中,伪代码如下: // 假设img是指向图像BGR数据的指针 uint8x16x3_t bgr_data...(bottom_row2, pixels_bottom2); } 2.4 处理左右边框 这里就有点难受了,因为是ARM架构通用的汇编,不像一些厂家有专门处理竖直方向的寄存器或者额外的硬件加速模块

    14110

    安卓逆向:这是一篇逆向基础函数在ARM32中的刨根问底。

    ARM32中函数需要关注的点有哪些? 1. 怎么去识别ARM的函数? 2. 函数采用什么样的调用约定? 3. 函数的参数是怎样进行传递的? 4. 函数的返回值是通过怎样接收存储? 5....函数采用什么样的调用约定?...ARM函数调用约定采用的是:ATPCS ATPCS的英文全称是ARM-THUMB procedure call standard(ARM-Thumb过程调用标准) 总结:参数1~参数4 分别保存到 R0...这个寄存器保存着栈顶的指针。这里可以看到更多关于栈的信息。 r14:链接寄存器(link register)。存储着当被调用函数返回时,将要执行的下一条指令的地址。...以上代码中 bl 826C前面的三个ldr表示的是传递bl826C的三个函数参数。 参数大于四个的情况 ? ?

    3.5K74

    Ne10的编译与使用

    SIMD:单指令多数据流,能够复制多个操作数,并把它们打包在大型寄存器的一组指令集。...目前市场上的Android和iOS设备多采用ARM架构的芯片,而在ARM Cortex-A和Cortex-R系列处理器的IP设计中引入了Arm Neon技术,Arm Neon技术是针对Arm处理器的高级单指令多数据...考虑学习NEON成本过大,遇到需求首先考虑利用现有轮子,Arm-neon-enable-library有: ? 可以看到熟悉的Libyuv和Skia的身影 ?...铺垫了半天,终于轮到文章的主角了--Ne10 Ne10是ARM官方推出的一个开源库,它提供了一系列通用的,基于ARM Neon架构并且经过深度优化的函数集合 ?...在自己的cpp中引入NE10.h就可以使用了,比如实现FFT,直接调用库的api就好 ?

    2.7K30

    Cortex-A8A76

    Cortex-A8 关于Cortex-A8的微处理架构参考《ARM_Cortex-A8微处理器的架构和实现》 其中关于NEON有两段话摘录如下: NEON媒体引擎拥有自己的10段流水线,它从ARM整数流水线结束处开始...由于ARM整数单元中已解决所有错误预测和异常,所以向NEON媒体引擎发送指令后,因为它不会产生异常,所以必须完成。...数据处理指令是NEON整数指令或NEON浮点指令。...Cortex-A8 NEON单元不会并行发射两条数据处理指令,这样可避免复制数据处理函数块占用太多空间,同时可避免与读写寄存器端口复用相关的计时关键路径和复杂性。...几个ARM处理器内核: 《ARM内核全解析,从ARM7,ARM9Cortex-A7,A8,A9,A12,A15Cortex-A53,A57》 Cortex-A76 《Arm Cortex-A76的微架构改进了什么

    84420

    支付宝如何优化移动端深度学习引擎?

    2.1.基于C/C++的基本优化 编译器很牛逼,GCC/CLANG都有运行速度的优化选项,打开这些选项大部分情况下都会帮你的程序速度提升不少,虽然这还远远不够,但聊胜于无。...它是作为 ARM内核的一部分实现的,但有自己的执行管道和寄存器组,该寄存器组不同于ARM 核心寄存器组。NEON 支持整数、定点和单精度浮点 SIMD 运算。...经过良好设计的NEON代码,理论上可以比普通C语言版本快2-8倍。 NEON指令集分为ARMV7版本和ARMV8版本,寄存器个数和格式略有不同。...平台都可以跑,其次,代码简洁容易理解和维护,另外,编译器还会根据不同平台做代码重排;但是NEON intrinsic也有一些缺点,比如没有预取指令,分解Neon寄存器很麻烦,寄存器分配可能不高效,无法做显式的对齐加载...所有没有使用C++动态特性的lib库(搜索工程没有使用dynamic_cast关键字) Enable C++ Runtime Types 选项设置为NO。

    1.2K40
    领券