[导读]为什么会写篇栈变化的文章?做系统分析的话你肯定遇到过一些crash,oops等棘手问题,一般大家都会用gdb,objdump或者addr2line等工具分析pc位置来定位出错的地方。但是这些分析工具背后的本质原理就不见得理解深刻了,而且有的时候面对一系列backtrace或者st...
为什么会写篇栈变化的文章?做系统分析的话你肯定遇到过一些crash, oops等棘手问题,一般大家都会用 gdb, objdump 或者 addr2line等工具分析 pc 位置来定位出错的地方。但是这些分析工具背后的本质原理就不见得理解深刻了,而且有的时候面对一系列 backtrace 或者 stack 日志处于懵逼的状态。今天和大家一起看下面对 crash 日志的时候,如何利用 stack 来分析其变化的来龙去脉。Arm指令集介绍崇尚简单粗暴的介绍方式,我们直接来看各个寄存器的大体用法,详细用法可百度,不,谷歌。1. r0-r3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。---如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。2. r4-r11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。r11 是栈帧指针 fp。3. r12 是内部调用暂时寄存器 ip。它在过程链接胶合代码(例如,交互操作胶合代码)中用于此角色。在过程调用之间,可以将它用于任何用途。被调用函数在返回之前不必恢复 r12。4. 寄存器 r13 是栈指针 sp。它不能用于任何其它用途。sp 中存放的值在退出被调用函数时必须与进入时的值相同。5. 寄存器 r14 是链接寄存器 lr。如果您保存了返回地址,则可以在调用之间将 r14 用于其它用途,程序返回时要恢复6. 寄存器 r15 是程序计数器 pc。它不能用于任何其它用途。
演示代码假如现在你已经掌握了 arm 指令的用法,即便没有掌握也没关系,“书到用时回头翻”。这里以一段简单的 c 语言为例:#include
int m = 8;
int fun(int a,int b)
{
int c = 0;
c = a b;
return c;
}
int main()
{
int i = 4;
int j = 5;
m = fun(i, j);
return 0;
}
编译一下,然后反汇编:$ arm-linux-gnueabi-gcc main.c -o main $ arm-linux-gnueabi-objdump -D -D main
00010400 :
10400: e52db004 push {fp} ; (str fp, [sp, #-4]!)
10404: e28db000 add fp, sp, #0
10408: e24dd014 sub sp, sp, #20
1040c: e50b0010 str r0, [fp, #-16]
10410: e50b1014 str r1, [fp, #-20] ; 0xffffffec
10414: e3a03000 mov r3, #0
10418: e50b3008 str r3, [fp, #-8]
1041c: e51b2010 ldr r2, [fp, #-16]
10420: e51b3014 ldr r3, [fp, #-20] ; 0xffffffec
10424: e0823003 add r3, r2, r3
10428: e50b3008 str r3, [fp, #-8]
1042c: e51b3008 ldr r3, [fp, #-8]
10430: e1a00003 mov r0, r3
10434: e24bd000 sub sp, fp, #0
10438: e49db004 pop {fp} ; (ldr fp, [sp], #4)
1043c: e12fff1e bx lr
00010440 :
10440: e92d4800 push {fp, lr}
10444: e28db004 add fp, sp, #4
10448: e24dd008 sub sp, sp, #8
1044c: e3a03004 mov r3, #4
10450: e50b300c str r3, [fp, #-12]
10454: e3a03005 mov r3, #5
10458: e50b3008 str r3, [fp, #-8]
1045c: e51b1008 ldr r1, [fp, #-8]
10460: e51b000c ldr r0, [fp, #-12]
10464: ebffffe5 bl 10400
10468: e1a02000 mov r2, r0
1046c: e59f3010 ldr r3, [pc, #16] ; 10484
10470: e5832000 str r2, [r3]
10474: e3a03000 mov r3, #0
10478: e1a00003 mov r0, r3
1047c: e24bd004 sub sp, fp, #4
10480: e8bd8800 pop {fp, pc}
10484: 00021024 andeq r1, r2, r4, lsr #32
图解栈的变化过程如何能让读者接受吸收的更快,我一直觉得按照学习效率来讲的话顺序应该是视频,图文,文字。反正我是比较喜欢视频类的教学。这里给大家画下栈变化的过程是什么样子的。这里的图是结合上面的代码来画的,希望有助于读者的理解。1.程序在内存分布区域2.全局变量m赋值3.保存进入main之前的栈底, fp-sp之间是当前函数栈4.函数main的栈已经准备好了5.i入栈6.j入栈7.准备函数fun的调用, 形参反向入栈 先形参b入栈8.形参a入栈9.留空一个地址作为fun返回值, 待后面返回时填入10.fun返回地址入栈, 通常是main函数当前pc指针的下一个11.main函数的栈底地址入栈12.pc指针跳转fun代码13.c入栈14.可以看到函数fun的数据 形参a,b 在上一层函数的栈中. 一部分在自己的栈上. 此步取值到加法器中进行加法运算,再赋值给c15.c赋给返回值,填入上面的留空位置16.栈底恢复上一层17.lr赋值给pc, 实现了跳转18.返回值赋值给全局变量m19.前面函数调用的形参已经无用,回滚sp20.函数返回,清理main的栈空间总结这么多图有没有看花?相信到这里你已经了解了栈背后的来龙去脉,下一篇我们一起根据实际的 stack 错误案例剖析错误的可能性。往期推荐:物联网通信协议大汇总!
极客感十足的电子胸牌 ART-Badge V2.0在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总。点击
阅读原文,查看更多分享
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
近日,美国参议院公布了一项引人注目的国防政策方案,其中包含的“2025年国家人工智能保障准入和创新法案”(简称GAIN AI法案)再次在全球科技领域掀起波澜。
关键字:
AI
GPU
重庆2025年9月6日 /美通社/ -- iChongqing新闻报道:2025世界智能产业博览会于9月5日在重庆开幕,550余家企业参展,展示了从自动驾驶和人工智能(AI)座舱到扩展现实(XR)影视和机器人咖啡厅的30...
关键字:
人工智能
新能源汽车
AI
机器人
慕尼黑2025年9月6日 /美通社/ -- 近日,广汽正式推出全新增程技术——"星源增程"(英文名为ADiMOTION),全面提升增程器效率、动力响应及NVH表现,同时配合AI能量控制平台,实现每一度...
关键字:
广汽
AI
增程器
电机
北京2025年9月5日 /美通社/ -- 近日,2025年中瑞商业大奖颁奖典礼在北京举行,SGS通标标准技术服务有限公司(以下称SGS通标)作为瑞士SGS在中国的分支机构荣获了传承奖的殊荣。SGS通标北京总经理...
关键字:
可持续发展
ST
AI
ABILITY
北京2025年9月5日 /美通社/ -- 9月2日,济南城市投资集团有限公司(简称"济南城投")与软通动力信息技术(集团)股份有限公司(简称"软通动力")正式签署战略合作...
关键字:
AI
数字经济
智能化
人工智能技术
中国郑州2025年9月5日 /美通社/ -- 全球领先的电动客车制造商宇通客车("宇通",上交所代码:600066)全新升级的车联网系统Link+采用先进技术实现车队车辆与管理平台的智能互联。作为Vehicle+升级版,...
关键字:
LINK
车联网
AI
PS
大众汽车集团加速推进生产数字化转型 数字化生产平台(Digital Production Platform)成为大众汽车的"工厂云",在全球生产基地实现人工智能(AI)与前沿 IT...
关键字:
亚马逊
大众汽车
AI
数字化
北京2025年9月5日 /美通社/ -- 9月4日,在北京市人民政府新闻办公室举行的"一把手发布•京华巡礼"系列主题新闻发布会上,北京经开区对外发布,北京经济技术开发区(简称"北京经开区&q...
关键字:
人工智能
模型
开源
AI
RighValor现已基于Synaptics® Astra™ SL1600系列SOC运行,提供隐私至上的实时边缘智能。 加利福尼亚州帕洛阿尔托2025年9月5日 /美通社/ -- 边缘分布式代理AI先驱企业Righ今日...
关键字:
智能家居
SYNAPTICS
AI
ST
柏林2025年9月4日 /美通社/ -- 全球消费电子与家电领先品牌海信,将以AI Your Life为主题在IFA 2025呈现全线人工智能创新成果。从沉浸式娱乐、影院级画质到智能家居生活与气候智能健康,海信将展示AI...
关键字:
海信
AI
RGB
MINILED
深圳2025年9月3日 /美通社/ -- 全球可穿戴眼动追踪解决方案领军创新企业见臻科技(Ganzin Technology),今日于深圳光博会展隆重发布其突破性的 Gaze2AI™参考设计。该方案基于高性能 AUROR...
关键字:
AI
参考设计
TIMES
摄像头
9月5日至8日,2025世界智能产业博览会在重庆举行。期间,三十余家全国主流媒体深度参与智博会及制造行业峰会,实地探访“人工智能+”、数智工厂、具身智能等标杆案例,共探人工智能与制造业的深度融合场景价值。
关键字:
AI
智能制造
2025世界智能产业博览会期间,华为中国行2025·重庆AI+制造行业大会同步启幕。此次大会汇聚了政府部门、重庆及全国的制造业企业管理者、技术专家、行业伙伴等现场参会,共探AI与制造深度融合的前沿趋势,共商产业跃迁升级的...
关键字:
华为
AI
智能制造
9月5日,2025世界智能产业博览会在重庆盛大开幕。赛力斯集团首次以企业展馆形式亮相,展馆面积超过1万平方米,设立整车业务、动力业务、智能制造、赛力斯产业链伙伴等七大展区,系统呈现赛力斯在整车智能化、技术智能化和制造智能...
关键字:
AI
智能制造
北京2025年9月4日 /美通社/ -- 在全球新一轮科技革命与产业变革的澎湃浪潮中,人工智能作为引领创新的核心驱动力,正以前所未有的深度与广度重塑各行业发展格局。体育领域深度融入科技变革浪潮,驶入数字化、智能化转型快车...
关键字:
人工智能
智能体
AI
BSP
-DXC通过初创企业合作推动汽车与制造业AI创新 初创企业Acumino、CAMB.AI与GreenMatterAI合作将AI创新推向市场 合作源于DXC与STARTUP AUTOBAHN的伙伴关系 弗吉尼亚州阿什...
关键字:
汽车
AI
AN
AC
作为业内持续专注于物联网(IoT)芯片开发的厂商,Silicon Labs(芯科科技)自2021年剥离基础设施与汽车(I&A)业务后,全力聚焦物联网领域。而随着物联网迈向全场景无缝连接与人工智能(AI)端侧赋能的新阶段,...
关键字:
芯科科技
IoT
BLE
AoA
Sub-G
AI
北京2025年9月2日 /美通社/ -- 近日,深圳云天畅想信息科技有限公司(下称"云天畅想")与浪潮信息正式签署元脑生态战略合作协议。双方将聚焦教育行业AIGC应用落地,在AIGC实训平台、智能体平...
关键字:
AI
模型
开发平台
智能体
上海2025年9月1日 /美通社/ -- 2025年8月20日,由清博智能主办的"AI助力数字营销新突破"线下沙龙活动在上海顺利举行。活动邀请了三位身处一线的行业领袖,为参会者带来最前沿的趋势洞察、最...
关键字:
AI
AGENT
FUTURE
MARKETING
上海2025年9月1日 /美通社/ -- 在国家新闻出版署指导下,第十五届中国国际数字出版博览会于8月28日至31日举行。本届博览会以"数实相融,智赢未来"为主题,聚焦人工智能与知识服务新趋势。应在华国际出版商版权保护联...
关键字:
PAPER
PAL
AI
CTU