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

ARM64下的函数sp指令调用栈操作

如下 1.JPG 三·通过LLDB和内存查看栈空间 我们需要特别关注sp,x0,x1 寄存器的变化 当我们执行函数A时:sp指向A函数的栈空间底部 2.JPG 此时x1 x0还未被赋值都为0x00b...当我们利用LLDB继续向下指向函数跳转到B函数时,修改x0的值,查看内存变化 IMG_5933(20210129-142055).JPG 1.JPG 我们得到了 跳转后的sp指针地址 2.JPG...read sp得到内存空间 IMG_5935(20210129-142102).JPG 由于0xb在内存地址中不明显,我们修改它让它成为一个特征值,修改x0的值我们可以发现内存地址是从地往高处写的 比较A函数...png 汇编代码解释: sub sp,sp #0x30 拉伸栈空间 stp x0,x1,[sp,#0x10] ldp x1,x0,[sp,#0x10] add sp,sp,#0x30 回缩栈空间 返回A函数

2.5K20
您找到你想要的搜索结果了吗?
是的
没有找到

通过反汇编理解函数调用机制(x86和ARM

10 int result; 11 result = add(a, b); 12 printf("%d",result); 13 } 执行反汇编指令:gcc...对上面汇编代码的分析: 进入main函数,保护现场,将rbp压入堆栈; 然后为main函数开拓新的堆栈框架,rbp与当前rsp相同,rsp再向上扩充16个字节(0x10);(以前的C程序只能在函数前面声明变量...,是因为编译器还么有那么“智能”,它只能通过分析前部分的变量,一次性的为程序扩充堆栈) 然后向栈底上方的偏移地址为8和12的单元存入数据1和2; 把数据送入通用寄存器中,以供新的函数调用; 跳转到add...eax; pop出rbp,回到main函数; 将eax中的运算结果赋给栈底上方偏移地址为4的单元; 然后调用printf函数显示结果。...使用arm-linux-gcc编译并反汇编:arm-linux-objdump -D -m arm a.out 得到arm机器的汇编代码(除去一些初始化的代码)如下: ? ?

1.9K20

C语言在ARM函数调用时,栈是如何变化的?

Arm指令集介绍 崇尚简单粗暴的介绍方式,我们直接来看各个寄存器的大体用法,详细用法可百度,不,谷歌。 1. r0-r3 用作传入函数参数,传出函数返回值。...在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。---如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。 2....r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。r11 是栈帧指针 fp。 3. r12 是内部调用暂时寄存器 ip。...在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。 4. 寄存器 r13 是栈指针 sp。它不能用于任何其它用途。...return c; } int main() { int i = 4; int j = 5; m = fun(i, j); return 0; } 编译一下,然后反汇编: $ arm-linux-gnueabi-gcc

13.6K83

C++对象的优化--减少不必要的函数调用

相对于之前,只有9次的函数调用,减少了两次!!! 二、函数返回时,返回临时对象,不要先定义对象,然后再返回。直接提前计算好构造该函数返回对象所需要的参数,直接返回临时对象。...,又减少了两次函数调用的开销!!!...,程序减少了相当大的一部分的函数调用开销,程序的效率也得到了很大的提升。...一次调用getObejct()函数可以减少7次的函数调用开销,那么100万次的调用,就能减少700万次的开销。量变产生质变!!!...对象优化的三条规则 1.当函数的形式参数需要传递对象时,不要用值接受,用引用接受。减少一次临时对象的构造和析构。 2.当函数的返回值为对象时,不要再函数题先定义好零时对象,然后再返回值。

45930

Qt窗口关闭和应用程序停止是否调用析构函数的一些说明

---- 在main,栈上面创建一个窗口A,关闭窗口A时,会调用析构函数。 如果在这个窗口A的构造函数中再创建一个窗口B,并且在A的析构函数中对B进行释放。...第一种形式: MainWindow * b = new MainWindow(); 当关闭窗口A,再关闭窗口B时,创建B的析构函数调用,窗口A的析构函数调用 (这种关闭方式有明显的卡顿,当关闭A,按照规则...,窗口A的析构函数调用 (这种关闭方式无卡顿,实际上是B窗口被隐藏,并未主动执行析构,而在A的析构函数中被动执行,这也是为什么关闭B时,显示并未调用B析构,而关闭A时,才显示调用B析构的原因) 我们给窗口...把窗口A中关于窗口B释放的代码去掉,显示调用了窗口B的析构函数调用窗口A的析构函数,但是没有出现异常(存在卡顿,多次运行,发现还会存在A析构不执行的问题(析构中的打印语句并未被打印在控制台))。...,再在窗口A中再次释放B会报异常,把A中析构函数中的释放B的代码再次注释,运行,显示依次调用了窗口B的析构函数,窗口A的析构函数(无卡顿)。

2.4K10

GCC 编译器的使用

要编译出能在 ARM 平台上运行的程序,必须使用交叉编译工具 xxx-gcc、xxx-ld 等(不同版本的编译器的前缀不一样,比如 arm-linux-gcc),下面分别介绍。...本节文档使用 x86 上的 gcc 来试验,使用 ARM 板的交叉编译工具链做实验时效果也是类似的。不同的交叉编译器工具链前缀可能不同,比如 arm-linux-gcc。...GCC 忽略任何不需要汇编的输入文件。 (3)-E 预处理后即停止,不进行编译。预处理后的代码送往标准输出。 (4)-o file 指定输出文件为 file。...2.6 优化选项(Optimization Option) (1)-O 或-O1 优化:对于大函数优化编译的过程将占用稍微多的时间和相当大的内存。...(2)-O2 多优化一些。除了涉及空间和速度交换的优化选项,执行几乎所有的优化工作。例如不进行循环展开(loop unrolling)和函数内嵌(inlining)。

3.8K31

熟悉又陌生的arm 编译器详解(armccarmclang)

这个时候LLVM就出现了,是Chris Lattner在硕士和博士时提出和形成的编译器,不过其是采用GCC的前端进行语义分析,然后LLVM做优化和生成目标代码,可以叫做LLVM-GCC。...GCC armcc 是arm 公司开发的一款编译器,集成在KEIL以及ARM DS IDE里面,于5.06版本后停滞(AC5),不继续维护,其前端基于 Edison Design Group 。...-O1受限优化。编译器只执行可以描述为调试信息的优化。删除未使用的内联函数和未使用的静态函数。关掉严重降低调试视图的优化。...没有影响的函数可能会被乱序调用,或者如果结果是不需要的。 Backtrace 可能不准确,因为在栈的方面处理有变化,存在调用优化。...编译器自动内联函数 -O3最大优化。启用调试后,此选项通常会提供较差的调试视图。ARM 建议在较低的优化级别进行调试。

1.7K40

【教程】如何用GCC“零汇编”白嫖MDK

与亲生的两兄弟不同,牛头人arm gccArm公司从GCC开源社区“抱回来的孩子”。...正如错误提示中指出的那样,CMSIS会在一个叫做 __cmsis_start的函数中,调用 "_start" 函数,而这一函数正是gcc标准启动文件的入口,当你在MDK中选择"Do not use Standard...更糟糕的是,这种判定是具有“传染”性的,这意味着哪怕某一个section中存在没用到函数,只要该section被判定为要保留,则这些没有用到的函数调用函数,其所在section也会被传染。...此外,还有一些更高阶的优化选项并未提供在Optimisation列表中,例如,最高的性能优化"-Ofast",以及更聪明的链接优化“Link Time Optimisation”,详细的使用效果请参考gcc...在Github上的最新版本中,优化gcc的部署体验——也能像Arm Compiler 5以及Arm Compiler 6那样简单拖放lib即可完成部署: 具体步骤如下: 1、通过下面连接获取最新版本的

1.7K10

【嵌入式】基于ARM的嵌入式Linux开发总结

⑤ 实验室使用的OK6410开发板定制的编译器为32位的,其交叉编译工具链主要arm-linux-gcc,arm-linux-g++arm-linux-gdb等构成。...3、gcc/arm-linux-gcc用法: ① 基本用法:gcc hello.c;arm-linux-gcc hello.c;输出a.out ② 推荐用法:gcc hello.c -o hello.../arm-linux-gcc hello.c -o hello ,可以指定输出文件名称; ③ 主要的编译参数 -Wall 打印全部警告信息; -O{0-3,s} 支持代码优化,0无优化; ...(3)Makefile文件编写示例: 一个工程,2个源文件testa.c ,testb.c,一个头文件testb.h,编译器为arm-linux-gcc,生成的可执行文件为test,需支持代码优化、打印警告信息...(3)exit()函数调用exit系统调用之前要检查文件的打开情况,把文件缓冲区中的内容写回文件,就是”清理I/O缓冲”。

18.3K20

【反复横跳】从AC5到AC6转型之路(1)——补救和准备

(armclang)升级替换的序幕…… 嵌入式行业的长尾效应是及其突出的,且不说都2022年了还有很多人在坚持 MDK4,即便是从“Arm在2017年对外宣布停止维护 Arm Compiler 5”算起...这里给出我的几个反驳的几个理由,但我不指望能说服那些抱有这类想法的人: Arm Compiler 5已经停止维护,Arm Compiler 6还在持续更新。...)和 arm gcc。...---- 其实,这里 armclang 也是个二道贩子——它也是调用 armasm 来完成编译的,只不过在这之前,它会默认用C预编译器对汇编源代码进行预处理,换句话说,折磨armasm很多年的“如何在汇编代码中使用...Compiler 6 下告知编译器 main() 函数不带输入参数 默认情况下(使用默认的 libc),Arm Compiler 6会认为 main() 函数是带有标准的输入参数的: int main

3.8K30

【Android FFMPEG 开发】FFMPEG 交叉编译配置 ( 下载 | 配置脚本 | 输出路径 | 函数库配置 | 程序配置 | 组件配置 | 编码解码配置 | 交叉编译配置 | 最终脚本 )

配置的内容 : ① 输出配置 : 配置生成的相关文件输出路径 ; ② 函数库配置 : 配置静态库 , 动态库 , 函数优化等相关参数 ; ③ 命令行程序配置 : 配置是否生成命令行程序 , FFMPEG...优化函数库 : ① 设置后效果 : FFMPEG 编译时可以选择优化函数库大小 , 让编译出来的函数库尽可能小 , 但相应的编译速度会降低很多 ; ② 设置的要性 : 由于是在 Android 中进行开发.../configure --enable-small 命令 , 启用优化函数库大小的功能 ; # 启用函数库大小优化 ..../configure --arch=arm 6 . 配置编译后的应用平台 : 编译后的函数库要在 Android 平台使用 ; ..../prebuilt/linux-x86_64/bin/arm-linux-androideabi- # 后面的 gcc , g++ , ar 等工具由脚本自己补充 , 这里我们指定 gcc 前面的前缀内容

1.3K20

arm上backtrace的分析与实现原理

1.2 函数的压栈与入栈操作 ? 当函数main调用func1的时候其栈的过程如上图所示,每个函数都有自己的栈空间,这一部分我们称为栈帧,在函数调用的时候创建,在函数返回后销毁。...以linux内核实现arm栈回溯为例, 通过向gcc传递选项-mapcs或-funwind-tables,可选择APCS或unwind的任一方 式实现栈回溯。...gcc的有些编译优化命令,会让FP寄存器优化掉,比如-fomit-frame-pointer这个优化会让fp寄存器节省下来给其他的地方使用。所以要充分考虑这些问题。...2.1 APCS ARM过程调用标准规范了arm寄存器的使用、过程调用时 出栈和入栈的约定。如下图示意。 ? 栈回溯中输出的寄存器的值是入栈时保存起来的寄存器值。...unwind是最新的编译器(>gcc-4.5)为arm支持的新特性。

6.2K30

实用技能分享,充分利用内联函数,内联汇编,内部函数和嵌入式汇编提升代码执行效率和便捷性(2021-12-17)

一、内联函数Inline function: 内联函数就是带inline关键字修饰的函数,作用是将函数直接嵌入到调用函数的代码中,从而降低调用函数所占用的时间。...因为这样才能发挥内联的优势: LL库这里用的关键字是__STATIC_INLINE,这个是ARM的CMSIS软件包专门做的定义方式,对MDK,IAR和GCC都做了适配,通用。...: 三、内部函数Instruction Intrinsics 使用内联汇编程序的一个限制是编译器的各种优化对其可能不起作用,这里时候就可以考虑改用内部指令。...内部函数看起来像一个普通的函数调用,但它实际上是编译器识别的内置函数。...内部函数编译为内联代码,作为单个指令或作为一小段指令序列,一般用双下划线 (__) 标记 针对内部函数ARM的CMSIS软件包也是做了一大批,主要分两类: 1、一类是CPU使用的内部函数,部分截图

1.2K30

如何在实时操作系统(RTOS)中使用GCC的栈溢出保护(SSP)功能

二、GCC栈溢出保护的工作原理 GCC栈溢出保护(SSP)是在函数中插入一个额外的变量(stack canary),该变量位于函数返回地址所在内存的后面,函数进入的时候该变量被赋为特定的值,函数返回前判断该变量的值有没有改变...下图结合第一部分的代码片段展示SSP的工作原理:图1是正常的调用不会产生任何异常;图2写入了20个字节,导致Buffer发生缓冲区溢出,并把返回地址覆盖了,这会导致程序产生非预期的行为,但是程序并不知道发生了栈溢出...但是,并非所有的编译器能提供完整的支持,比如arm-none-eabi就会报下面的错误: arm-none-eabi/bin/ld: cannot find -lssp_nonshared arm-none-eabi...arm-none-eabi-ar rcs libssp.a arm-none-eabi-ar rcs libssp_nonshared.a 这时候重新编译,GCC会提示缺少符号__stack_chk_guard...; } 如果SSP已生效,函数__stack_chk_fail会被调用,否则SSP未生效,这时可以尝试禁用编译器的优化选项。

3.1K31

第007课 裸机开发步骤和工具使用(SourceInght NotePad++使用)

在X86平台编辑和和编译器arm-linux-gcc编译ARM架构的程序, 两者属于不同的架构平台,从而属于交叉编译模式。...编译器 推荐使用arm-linux-gcc arm-linux-gcc是基于linux平台的arm编译器。它是开源免费的编译器。...arm-linux-gcc功能强大、稳定、支持的arm芯片众多、更新速度快。 入门误区:使用ads、MDK ads(停止更新)、MDK,是windows平台的编译器,功能较弱。...符号窗口:显示了当前打开文件的函数名、结构体名、宏定义等等。 上下文窗口:光标放在某个函数上(变量上、宏定义上),在下面的上下文窗口就可以看到相应的定义。...7.高亮关键词 光标放在关键词上,然后右键菜单—>highlight word 8.查看函数定义位置 光标放在函数上,然后右键菜单—>jump to defintion,或者ctrl + 鼠标左键。

61210

6_Makefile与GCC

ARM板性能越来越强,可以认为ARM板就相当于一台PC,当然可以在ARM板上安装开发工具,比如安装ARM版本的GCC,这样就可以在ARM板上编译程序,在ARM板上直接运行这个程序。 ​...# 2 "main.c" 2 # 5 "main.c" int main() { printf("%d ask\n",100); return 0; } 你会发现头文件被展开和printf函数调用...注意:在命令行中,静态库夹在的库必须位于调用该库的目标文件之后。 6.2.2.4 代码优化选项 ​ gcc提供几种不同级别的代码优化方案,分别是0,1,2,3和s级,用-Olevel选项表示。...默认0级,即不进行优化。典型的优化选项: ​ (1)-O :基本优化,使代码执行的更快。 ​ (2)-O2:胜读优化,产生尽可能小和快的代码。如无特殊要求,不建议使用O2以上的优化。 ​...程序执行完,库仍需保留在系统上,以供程序运行时调用

3.5K10

教你在RISCV中使用DSP指令!

arm_cos_f32(radians); 如果用标准的数学库中的cos函数,同样也能够达到目的,标准库函数则需要消耗更多的机器周期,而使用了DSP库,则更加方便高效的进行计算。...rv__v_uadd16(uint16x4_t a, uint16x4_t b); int16x4_t __rv__v_sadd16(int16x4_t a, int16x4_t b); 那么有上述函数可以供调用...,不需要任何的库文件的支持,因为在gcc编译器中,内部自己可以根据这些内联函数进行汇编实现。...#include "riscv_math.h" 直接调用NMSIS库中暴露出来的函数即可。...然而直接使用DSP提供的指令进行计算,工作量还是很大,同时优化也不一定非常的好,此时使用NMSIS库提供的函数,直接利用优化好的数学函数进行数据计算,这样才是高效最简单的方式。

1.8K11
领券