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

嵌入式:什么是ATPCS

ATPCS介绍 ATPCS(ARM-Thumb Produce Call Standard)是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用...被调用的子程序在返回前无需恢复寄存器R0~R3的内容; 在子程序中,使用寄存器R4~R11来保存局部变量。这时,寄存器 R4~R11可以记作V1~V8。...在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量; 寄存器R12用作子程序间的scratch寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip(Intra-Procedure-call...寄存器sp在进入子程序时的值和退出子程序时的值必须相等; 寄存器R14称为链接寄存器,记作lr。它用于保存子程序的返回地址。...sl ARM状态局部变量寄存器7, 在支持数据栈检查的ATPCS中为数据栈限制指针 R11 v8 fp ARM状态局部变量寄存器8/帧指针 R12 ip 子程序内部调用的scratch寄存器 R13

1K50

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

ARM32中函数需要关注的点有哪些? 1. 怎么去识别ARM的函数? 2. 函数采用什么样的调用约定? 3. 函数的参数是怎样进行传递的? 4. 函数的返回值是通过怎样接收存储? 5....ARM函数调用约定采用的是:ATPCS ATPCS的英文全称是ARM-THUMB procedure call standard(ARM-Thumb过程调用标准) 总结:参数1~参数4 分别保存到 R0...r4 -r11:存储函数的局部变量,Thumb模式不会使用r8以后的寄存器 r12:是内部过程调用暂时寄存器(intra-procedure-call scratch register)。...在计算机中,栈非常重要。这个寄存器保存着栈顶的指针。这里可以看到更多关于栈的信息。 r14:链接寄存器(link register)。存储着当被调用函数返回时,将要执行的下一条指令的地址。...函数调用过程中涉及四个重要的寄存器:PC、LR、SP和FP。注意,每个栈帧中的PC、LR、SP和FP都是寄存器的历史值,并非当前值。

3.5K74
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    ARM汇编简单学习

    简介 ARM汇编语言是针对ARM架构设计的低级编程语言,用于直接操作硬件和编写高效的系统级程序。...寄存器 ARM处理器的寄存器系统在不同的架构版本中有所变化,但下面的内容将基于较常见的32位ARM Cortex-A系列处理器为例,详细介绍ARM寄存器系统的基本构成。...通用寄存器(General Purpose Registers, GPRs) ARM架构通常提供一组32位宽的通用寄存器,数量在不同的ARM架构版本和工作模式下有所不同,但至少包含R0至R15。...在ARM Cortex-A系列处理器中,常常提及32个32位通用寄存器(有时包括程序计数器PC)。...B label ; 无条件跳转到label BL subroutine ; 调用子程序并保存返回地址 BX/BLX:除了跳转外还能切换指令集状态,如从ARM态切换到Thumb

    15110

    arm上backtrace的分析与实现原理

    第二种可以查看到函数调用的关系,根据这些调用关系,就可以非常方便的跟踪到出问题的地方,然后进行一定的跟踪。但是需要理解寄存和汇编之类的知识。...第三种的信息最全,调用关系和参数信息都有,但是对工具链和系统都提出了一些要求。往往在嵌入式开发过程中,涉及到业务逻辑非常复杂的时候可以进行分析。但是一般的情况不会用到coredump。...R11:栈基址FP THUMB2下为R7。...2.1 APCS ARM过程调用标准规范了arm寄存器的使用、过程调用时 出栈和入栈的约定。如下图示意。 ? 栈回溯中输出的寄存器的值是入栈时保存起来的寄存器值。...04 总结 对于arm32体系架构的backtrace基本原理可以参考如上的描述,其中最核心的部分是每个函数的栈中寄存器地址指向的是上个函数的地址,所以利用这个特性,就可以一级一级的跟踪下去,从而实现栈的回溯功能

    6.8K30

    C和汇编如何互相调用?嵌入式工程师必须掌握

    、thumber程序调用规范) 为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则。...2)在子程序中,使用寄存器R4~R11来保存局部变量.这时,寄存器 R4 ~ R11可以记作V1 ~ V8。...在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。 3)寄存器R12用作过程调用时的临时寄存器(用于保存SP,在函数返回时使用该寄存器出栈), 记作ip。...;局部变量寄存器 R6 v3 必须保护;局部变量寄存器 R7 v4 必须保护;局部变量寄存器 R8 v5 必须保护;局部变量寄存器 R9 v6 必须保护;局部变量寄存器 R10 sl 栈限制 R11 fp...C调用汇编 例1:c调用汇编文件中函数带返回值 简化代码如下,代码架构可以参考《7. 从0开始学ARM-GNU伪指令、代码编译,lds使用》。

    1.9K40

    S3C2440④ | ARM-THUMB子程序调用规则ATPCS

    在GPIO的实验中,我们首先编写汇编程序操作寄存器点亮LED,奈何汇编语言可读性和可移植性太差,所以编写启动代码,设置栈顶指针SP,然后调用C语言中的main函数,转入C语言的世界,由C语言访问控制寄存器...其实,对于ARM处理器,在ARM指令集汇编程序和THUMB指令集汇编程序中制定了子程序调用的规则 —— ATPCS规则,这个规则包括: 寄存器使用规则 数据栈使用规则 参数传递规则 1.寄存器使用规则...) R13 sp 数据栈指针(指向栈顶) R12 ip 子程序内部调用的scratch寄存器 R11 v8 ARM状态局部变量寄存器8 R10 v7 ARM状态局部变量寄存器7 R9 v6 ARM状态局部变量寄存器...: 子程序间通过寄存器R0-R3传递参数和返回结果; 子程序中通过寄存器R4-R11保存局部变量; 寄存器R12用作子程序间scratch寄存器; 寄存器R13用作数据栈指针,指向栈顶; 寄存器R14用作链接寄存器...5.实验总结 通过本实验掌握了ATPCS规则在实际开发中的使用,在调用main函数时使用R0寄存器传递参数,总结如下: ARM处理器中子程序调用规则由ATPCS制定,包括寄存器使用规则,数据栈使用规则,

    90320

    STM32上的backtrace原理与分析

    13个通用寄存器,r0-r12 2个不同模式下使用的SP, PSP(SP_process) 和MSP(SP_main) 1个链接寄存器LR(r14) 1个程序计数器(PC) 1个程序状态寄存器(xPSR...通用寄存器R0-R12 上图将通用寄存器分为low register和high registers就是根据指令集来说的,对于thumb指令,是16位的,只能访问到low register,也就是R0-R7...程序链接寄存器LR 程序的链接寄存器在函数返回的时候会被使用到,比如一个函数A中执行的另外一个函数B,如下 void fun_A() { fun_B() } 那么当执行到fun_B的时候,首先编译器编译的汇编代码会将...对应的实际含义就是压入LR与R7寄存器,当执行PUSH后,SP指针会自动减去两个寄存器的大小,也就是8个字节。...rt-thread操作系统前面压栈的数据 # xPSR->PC->LR->R12->R3->R2->R1->R0 # R11 R10 R9 R8 R7 R6 R5 R4 FLAG 一共压了16

    2.7K62

    嵌入式ARM设计编程(四) ARM启动过程控制

    3)如何在C语言中调用汇编语言函数,并完成参数传递? 4)汇编语言函数中用到的寄存器如何保护与恢复,为什么要保护参考程序中的R11?...5)将delay.s中的R11改成R4,并将两条R11 的保护与恢复语句stmfd sp!,{r11} 和ldmfd sp!...答:由上代码可知,为保证程序调用时参数的正确传递,汇编程序设计要遵守ATPCS(ARM-Thumb Produce Call Standard),它是ARM程序和Thumb程序中子程序调用的基本规则,目的是为了使单独编译的...根据ATPCS规则,R11对应ARM 状态局部变量寄存器8,R11中含有循环次数的重要参量,因此要保护R11避免在程序运行与调用过程中受到影响而导致程序异常。...此外,还有ARM程序和Thumb程序中子程序调用的基本规则ATPCS(ARM-Thumb Produce Call Standard),目的是为了使单独编译的C语言程序和汇编程序之间能够相互调用。

    1.5K21

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

    按照 ARM 的调用约定(AAPCS)[1] ,在 fp 寄存器指向的栈空间上紧凑的存着上一层函数的 fp 地址和函数返回地址。大概样子就是下图这样。...额外提一下,特定的 fp 寄存器在 64 位上是 x29 寄存器,32 位则是 r7(Thumb Code) 或 r11(ARM Code) [2] 。 ?...不过它也有些问题,比如在 Arm 32 位上某些情况 fp 会被忽略掉或不准确 [3] ,也不能回溯穿过 JNI 和 OAT (没遵守 fp 的约定)。 [1]....ARM EH 的数据存放在 ELF 的 .ARM.exidx 和 .ARM.extab 中 [7] 。下图是 ARM 定义的回溯指令集合,相比 Dwarf 的实现简单一些。 ?...可以看到只有我们关心的寄存器才有相应的指令,比如 r7/r11 是 fp 寄存器,r4 可能存放了 dex pc,r10 存放着 JNI 的栈基地址,lr 是返回地址。

    6.6K41

    linux内核学习(四)之回顾简单的汇编知识(一))

    ,我们知道一般ARM都是采用risc架构的,如果有网友对risc-v架构感兴趣的,可以来交流学习),好了,废话就不多说了,开始进入主题啦!...(1)ARM状态下的通用寄存器与程序计数器: (2)ARM状态下的程序寄存器: 注意上面表格中小影阴直角三角形表示的是分组寄存器,所谓分组寄存器,就是说是当前模式下独有的,不共享。...注解: --1 其中 r0~r3 主要用于子程序间传递参数, r4~r11 主要用于保存局部变量,但在 Thumb 程序中,通常只能使用 r4~r7 来保存局部变量;r12 用作子程序间scratch...这个链接寄存器主要用在函数A和函数B,A正在运行时,突然要调用B,那么就引了一个分支了,然后这个函数B去运行,运行完之后还是要返回到最初然后继续往下走,那么这个时候返回值应该要有个记录,这就是链接寄存器...CPSR和SPSR都是程序状态寄存器,其中SPSR是用来保存中断前的CPSR中的值,以便在中断返回之后恢复处理器程序状态;CPSR是当前程序状态寄存器的意思,SPSR是程序状态保存寄存器,这里我在网上看到一个非常通俗易通的解释这两个寄存器的用法

    54810

    ARM架构的一次充电

    微架构包含:总线、电源管理、缓存、ARM架构 AMR架构又称为ARM CPU架构,它包含:指令集、寄存器组、异常模型、内存模型、调试,跟踪和分析。...,也叫可变寄存器,子程序使用时不需要保存; x16-x17: 子程序内部调用寄存器(IPx),使用时不需要保存,尽量不要使用; x18: 它是平台寄存器, 它的使用与平台相关, 尽量不要使用; x19-...A32 指令集就是在 Armv6 和 Armv7 架构中我们常说的 ARM 指令集,Armv8 及之后改名 A32 以与 A64 进行区分。...32 指令集就是在在 Armv6 和 Armv7 架构中被我们所熟知的 Thumb 指令集,Armv8 及之后改名为 Thumb32。...ARM处理器工作状态 从编程的角度来看,ARM微处理器的工作状态一般ARM和Thumb有两种,并支持在两种状态之间切换。

    1.1K20

    嵌入式:ARM的工作模式与寄存器组织

    文章目录 特权模式 处理器启动时的模式转换图 ARM的寄存器组织 ARM寄存器组成概述 ARM状态下的寄存器组织 Thumb状态下的寄存器组织 CPSR(当前程序状态寄存器)的低5位用于定义当前操作模式...它供需要访问系统资源的操作系统任务使用,但避免了使用与异常模式有关的附加寄存器,这就使得当任何异常出现时,都不会使任务的状态不可靠。...6个状态寄存器 CPSR;SPSR_svc、SPSR_abt、SPSR_und、SPSR_irq和SPSR_fiq ARM状态下的寄存器组织 ARM状态的寄存器简介 ARM状态下的寄存器组织...CPSR和SPSR的格式 Thumb状态下的寄存器组织 Thumb状态下的寄存器集是ARM状态下寄存器集的子集。...程序员可以直接访问8个通用的寄存器(R0~R7),程序计数器PC、堆栈指针SP、连接寄存器LR和当前状态寄存器CPSP。每一种特权模式都各有一组SP,LR和SPSR。

    1K20

    android 的hook技术,Android Native Hook技术(一)

    大家好,又见面了,我是你们的朋友全栈君。 原理分析 ADBI是一个著名的安卓平台hook框架,基于 动态库注入 与 inline hook 技术实现。...在目标进程的栈空间上构造dlopen()调用 要修改目标进程寄存器等信息,需使用到ptrace()函数,gdb等程序拥有查看、修改调试进程寄存器等的能力就是因为使用了ptrace()。...因为ARM使用了ARM和Thumb两种指令集,所以代码中需进行区分: if (addr % 4 == 0) { /* ARM指令集 */ } else { /* Thumb指令集 */ } 这样进行判断的依据是...第二个for循环用新的跳转指令进行覆写,关键的三条指令分别保存在jump[0]-[2]中: jump[0]赋值0xe59ff000,翻译成ARM汇编为 ldr pc,[pc,#0] ,由于pc寄存器读出的值是当前指令地址加...jump[2]保存的是hook函数地址。jump[1]仅用来4字节占位。Thumb分支原理与ARM分支一致,不再分析。

    95910

    嵌入式ARM设计编程(二) 字符串拷贝

    完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。...堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。...堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串中字符的个数。通过AXD查看寄存器和memory和寄存器中数据变化。...最后把R4~R11清空赋值为0。 提示:多字的加载与存储使用多寄存器寻址,使用的指令为LDM和STM。如: LDMIA R0!, {R4-R11} STMIA R1!...#3 ; 设置寄存器R6的初始值 MOV R7,#4 ; 设置寄存器R7的初始值 MOV R8,#5 ; 设置寄存器R8的初始值 MOV R9,#6 ; 设置寄存器R9的初始值

    45411

    arm汇编指令详解带实例_汇编buf指令

    ARM的编程模式和七种模式 基本设定 架构(32位) 约定 Byte(字节):8bits Halfword(半字) :16 bits (2 byte) Word(字):32bits(4 byte...ARM汇编特点 LDR/STR架构 ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被CPU处理。..., {r2-r7, lr} 将寄存器列表中的寄存器(R2到R7,lr)存入堆栈 相对寻址 beq flag ​ flag: 指令后缀 同一指令经常附带不同后缀,变成不同的指令。...SoC内部另一处理核心,协助主CPU实现某些功能,被主CPU调用执行一定任务。 ARM 处理器支持 16 个协处理器。在程序执行过程中,每个协处理器忽略属于 ARM 处理器和其他协处理器的指令。...mov指令替代或者文字池方式处理; adr总是以PC为基准来表示地址,因此指令本身和运行地址有关,可以用来检测程序当前的运行地址 在哪里 ldr加载的地址和链接时给定的地址有关,由链接脚本决定。

    1.4K11

    5_LED程序涉及的编程知识

    \参考资料\Arm架构参考资料\ ARM® and Thumb®-2 Instruction Set Quick Reference Card.pdf 5.2.2 汇编指令 ​ 汇编指令的格式,如下:...\ ATPCS(ATM-Thumb指令调用标准).pdf 参考章节: 所有 5.5.1 ATPCS规则 ​ ATPCS即ARM-THUMB procedure call standard(ARM-Thumb...过程调用标准)的简称,是基于ARM指令集和THUMB指令集过程调用的规范,规定了调用函数如何传递参数,被调用函数如何获取参数,以何种方式传递函数返回值。 ​...寄存器R0~R15在ATPCS规则的使用: 在函数中,通过寄存器R0R3来传递参数,被调用的函数在返回前无需恢复寄存器R0R3的内容 在函数中,通过寄存器R4~R11来保存局部变量 寄存器R12用作函数间...scratch寄存器 寄存器R13用作栈指针,记作SP,在函数中寄存器R13不能用做其他用途,寄存器SP在进入函数时的值和退出函数时的值必须相等 寄存器R14用作链接寄存器,记作LR,它用于保存函数的返回地址

    56310

    Android 渗透测试学习手册 第八章 ARM 利用

    8.1 ARM 架构导论 ARM 是基于精简指令集(RISC)的架构,这意味着其指令比基于复杂指令集(CISC)的机器少得多。...以下是这五个寄存器及其名称: R11: 帧指针 (FP) R12: 过程内寄存器 (IP) R13: 栈指针 (SP) R14: 链接寄存器 (LR) R15: 程序计数器 (PC) 下面的图展示了 ARM...架构: 在五个里面,我们会特别专注于这三个,它们是: 堆栈指针(SP):这是保存指向堆栈顶部的指针的寄存器 链接寄存器(LR):当程序进入子过程时存储返回地址 程序计数器(PC):存储要执行的下一条指令...执行模式 ARM 有两种不同的执行模式: ARM 模式:在 ARM 模式下,所有指令的大小为 32 位 Thumb 模式:在 Thumb 模式下,指令大部分为 16 位 执行模式由 CPSR 寄存器中的状态决定...还存在第三模式,即 Thumb-2 模式,它仅仅是 ARM 模式和 Thumb 模式的混合。 我们在本章不会深入了解 ARM 和 Thumb 模式之间的区别,因为它超出了本书的范围。

    43630

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

    这就需要了解寄存器使用约定,以 32 位 ARM 架构为例,其调用约定在 AAPCS(Procedure Call Standard for the ARM Architecture)官方文档中有详细描述...由于每一种 CPU 架构都有自己的指令集和函数调用约定,甚至同一种 CPU 架构下不同操作系统也会有不同的调用约定。为了方便讲解,本文涉及到的所有 API 实现均基于 32 位 ARM 架构。...不只是 32 位 ARM,大部分架构的调用约定中都有前 N 个参数直接使用寄存器,超过 N 个参数需要压栈的约定。...架构下的实现原理,要支持其它架构也就不难了,套路都类似,只需要熟悉每一种 CPU 架构的常用指令集和调用约定,最终就能实现一个支持全平台全架构的 owl.context 库。...当然,在具体实现过程中会有很多坑,如: win32 中如何在协程中支持 C++ 异常 Windows 中对 FS/GS 寄存器的特殊处理 x64 和 AMD64 调用约定的区别 ARM/THUMB 模式的兼容

    4.2K50

    ARM指令集

    指令在实现跳转的同时,完成处理器的工作状态的切换(ARM状态与Thumb状态间的切换)。 BX指令中,用寄存器的最低位来指示切换到哪一个工作状态。...因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。...标志位表示的是操作数1与操作数2的关系(大、小、相等),例如,当操作数1大于操作操作数2,则此后的有GT 后缀的指令将可以执行。...目的寄存器,操作数1和操作数2使用的寄存器必须在R0~R7之间。...5)乘法指令与乘加指令 ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和结果为64位两类,与前面的数据处理指令不同, 指令中的所有操作数、目的寄存器必须为通用寄存器

    75520

    ARM Linux 启动时的自解压过程 | Linux 内核

    接下来,内核设置一个局部的栈指针和 malloc() 区域,以便我们可以处理子例程调用和进行小内存分配,简单地说,就是可以执行 C 代码了。...如果找到附加的 DTB,并设置了 CONFIG_ARM_ATAG_DTB_COMPAT,我们首先将 DTB 扩展 50% 并调用 atagstofdt,它将使用来自 ATAG 的信息(例如内存块和内存大小...,解压类型因 Kconfig 选项而异:与编译内核时选择的解压器将链接到映像并从物理内存执行。...所有架构共享同一个解压库。调用的 _decompress() 函数将取决于链接到图像的 lib/decompress*.c 中的哪个解压缩器。...在调用解压器之前,解压器需要的所有关于压缩内核位置变量都设置在寄存器中了。

    2.9K10
    领券