ARM汇编学习六

本文深入探讨了ARM架构下的函数调用机制,包括栈帧的创建与销毁、寄存器的保存与恢复,以及叶函数与非叶函数的区别。通过具体的C程序实例和汇编代码,详细解释了函数的序言、主体和尾声部分如何工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道函数利用堆栈来保存局部变量,保存寄存器状态等。为了让所有事物有序运行,函数使用栈帧,即堆栈中的一片本地化内存区域,专用于特定的函数。栈帧是在函数的prologue中创建的。将帧指针(FP)设置到堆栈帧的底部,然后为栈帧分配的堆栈缓存会被开辟。栈帧(从它的底部开始)通常包含返回地址(之前的LR)、之前的帧指针、需要保存的任何寄存器、函数参数(如果函数允许大于4)、局部变量等。虽然堆栈帧的实际存储的内容可能有所不同,但之前概述的那些内容是最常见的。最后,堆栈帧在函数运行到结尾部分时被破坏。
栈中栈帧的抽象简图如下所示
在这里插入图片描述
我们写个c程序体验一下
程序如下,在pro.c
int main()
{
int res = 0;
int a = 1;
int b = 2;
res = max(a, b);
return res;
}

int max(int a,int b)
{
do_nothing();
if(a<b)
{
return b;
}
else
{
return a;
}
}
int do_nothing()
{
return 0;
}
可以看到main调用了max
在这里插入图片描述
设置好布局
在这里插入图片描述
我们就在max下断点
break max,run,如下所示
在这里插入图片描述
结合c源码可知,会传入两个参数给max,这反映在汇编里其实就是由我在上图红框框出来的两条指令实现的
看max的汇编
在这里插入图片描述
可以知道c源码中的if语句的比较操作就是这里的cmp r2,r3实现的,所以我们直接跳到这里来看看布局
所以我们一直执行到两条str执行之后,输入nexti 9即可
在这里插入图片描述
此时,FP(R11)指向0xBEFFF234,这里是栈帧的底部。堆栈上的地址(绿色地址)存储0x000 010418,这是返回地址。 0xBEFFF234 上面的4字节(0xBEFFF230)中存储了值0xBEFFF24c,它是上一个的帧指针的地址。地址0xBEFFF22C处的 0x1和0xBEFFF228处0x2是函数max执行过程中用到的局部变量。

接下来我们学习ARM函数
想理解ARM函数首先需要熟悉函数的结构组成,他们是:
1.Prologue 序言
2.Body 函数主体
3.Epilogue 尾声
Pologue序言的目的是保存程序的先前状态(通过将LR和R11的值存储到堆栈上)并为函数的局部变量开辟堆栈空间。虽然序言的实现可能取决于所使用的编译器,但通常通过使用PUSH/ADD/SUB指令来完成。典型用法如下:
push {r11, lr} /* 序言开始,保存FP并将LR入栈 /
add r11, sp, #0 /
设置栈帧的底部*/
sub sp, sp, #16 /* 序言的终止,在栈上分配一些缓存区,这样也为栈帧分配了一些内存空间*/

函数的主体部分通常负责执行某种特殊的和特定的任务。函数的这一部分可以包含多种指令、分支(跳转)到其他函数等。典型用法如下:
mov r0, #1 /* setting up local variables (a=1). This also serves as setting up the first parameter for the function max /
mov r1, #2 /
setting up local variables (b=2). This also serves as setting up the second parameter for the function max /
bl max /
Calling/branching to function max */
上面的片段设置局部变量,然后调用到另一个函数。这段代码还告诉我们,函数的参数(在这种情况下是函数max的参数)如何通过寄存器传递。在某些情况下,当有超过4个参数需要被传递时,我们将使用堆栈来存储剩余的参数。还需要注意的是,函数的结果是通过寄存器R0返回的。因此,无论函数(max)的结果究竟是什么,我们应该能够在函数返回之后,从寄存器R0中把它提取出来。还有一点要指出的是,在某些特定情况下,返回值的长度可能是64位的长度(超过32位寄存器的大小)。在这种情况下,我们可以使用R0与R1组合起来,来返回64位结果。

函数的最后一部分,尾声(epilogue),用来将程序恢复到初始状态(调用函数之前的状态),所以可以接着从函数被调用之前的位置继续往后执行。为了实现该目标,我们需要读取堆栈指针(SP)。这是通过使用帧指针寄存器(R11)作为参考并执行加法或者减法操作来完成的。当我们重新调整堆栈指针时,我们通过将它们从堆栈中弹出到各自的寄存器中来恢复先前(prologue)保存的寄存器值。POP指令可能是结尾部分的最后指令,这取决于函数的类型 。但是,在恢复寄存器值之后,我们可能会使用BX指令来离开函数。尾声(Epilogue)的一个例子是这样的:
sub sp, r11, #0 /* 尾声开始,调整SP寄存器*/
pop {r11, pc} /* 尾声的结束。从堆栈中恢复之前的FP,并把之前保存的LR载入PC,跳转到那里继续执行。函数的栈帧至此全部销毁完毕*/

简单的总结一下,就是:
序言部分建立了函数的运行环境;函数体部分实现函数的逻辑并将返回值存储进R0;尾声部分恢复了函数被调用之前的状态并继续运行。

接下来看看函数的类型:叶和非叶。叶函数是这样一类函数,它本身不调用/分支另一函数。非叶函数是一种函数,除了它自己的逻辑外,还得调用/分支到另一个函数。这两种函数的实现是相似的。然而,它们有一些不同之处。为了分析这些函数的差异,我们修改下之前的c源码
源码如下所示,在pro1.c里面
在这里插入图片描述
可以看出,main是非叶函数,max是叶函数,接下来编译链接生成Pro1
使用objdump查看汇编
在这里插入图片描述
直接看重点:main和max的
在这里插入图片描述
叶函数和非叶函数在序言和尾声处的实现方式有差异,先来看我上图圈出的序言的差异
非叶函数的序言需要将更多的寄存器保存在堆栈里。背后的原因在于,由于非叶函数的天然属性,在执行这样的函数期间LR被修改了,因此需要保存该寄存器的值,以便以后能够恢复。一般来说,如果必要的话,序言可以保存更多的寄存器。所以我们在上图可以看到main push了fp,lr;而max只push了fp
在看看尾声的差异
在这里插入图片描述
在max函数中可以看到,使用BL指令分支到叶函数。我们使用函数的标签作为参数来启动分支。在编译过程中,标签被替换为内存地址。在跳转到该位置之前,下一条指令的地址被保存到LR寄存器,这样我们就可以返回到函数max结束时离开的位置。
我们在max函数中看到:用于离开叶函数的BX指令以LR寄存器作为参数。如前所述,在跳转到函数max之前,BL指令将函数main的下一个指令的地址保存到LR寄存器中。由于叶函数不在执行期间改变LR寄存器的值,所以该寄存器现在可以用于返回父(main)函数。

至此,arm汇编学习已经结束。

参考:
azeria-labs 的arm教程
https://azeria-labs.com

学习ARM汇编指令的经典资料。 对ARM的各种汇编指令进行了深入全面的讲解,并给出了各种示例和详细注解,并且还对一些值得注意的点或是容易犯错误的地方进行了总结。 目录 前言................................................................................................................................................................i 目录................................................................................................................................................................I ARM7TDMI(-S)指令集及汇编....................................................................................................................1 ARM处理器寻址方式..........................................................................................................................2 寄存器寻址....................................................................................................................................2 立即寻址........................................................................................................................................2 寄存器偏移寻址............................................................................................................................2 寄存器间接寻址............................................................................................................................3 基址寻址........................................................................................................................................3 多寄存器寻址................................................................................................................................4 堆栈寻址........................................................................................................................................4 块拷贝寻址....................................................................................................................................5 相对寻址........................................................................................................................................5 指令集介绍............................................................................................................................................7 ARM指令集..................................................................................................................................7 指令格式................................................................................................................................7 第2个操作数................................................................................................................7 #immed_8r...........................................................................................................7 Rm..........................................................................................................................8 Rm,shift..................................................................................................................8 条件码............................................................................................................................9 ARM存储器访问指令........................................................................................................11   LDR和STR........................................................................................................11   LDM和STM.......................................................................................................14   SWP.....................................................................................................................17 ARM数据处理指令............................................................................................................19 数据传送指令..............................................................................................................20   MOV............................................................................................................20   MVN............................................................................................................20 算术逻辑运算指令......................................................................................................20   ADD.............................................................................................................20   SUB..............................................................................................................21   RSB..............................................................................................................21   ADC.............................................................................................................21   SBC..............................................................................................................21   RSC..............................................................................................................22   AND.............................................................................................................22   ORR..............................................................................................................22   EOR..............................................................................................................22   BIC...............................................................................................................23 比较指令......................................................................................................................23   CMP.............................................................................................................23   CMN.............................................................................................................23   TST...............................................................................................................24   TEQ..............................................................................................................24 乘法指令......................................................................................................................25   MUL.............................................................................................................25   MLA.............................................................................................................25   UMULL........................................................................................................25   UMLAL........................................................................................................26   SMULL........................................................................................................26   SMLAL........................................................................................................26 ARM跳转指令....................................................................................................................27   B...........................................................................................................................27   BL.........................................................................................................................27   BX........................................................................................................................27 ARM协处理器指令............................................................................................................28   CDP......................................................................................................................28   LDC......................................................................................................................29   STC......................................................................................................................29   MCR.....................................................................................................................30   MRC.....................................................................................................................30 ARM杂项指令....................................................................................................................31   SWI......................................................................................................................31   MRS.....................................................................................................................32   MSR.....................................................................................................................33 ARM伪指令........................................................................................................................34   ADR.....................................................................................................................35   ADRL...................................................................................................................35   LDR......................................................................................................................36   NOP......................................................................................................................37 Thumb指令集.............................................................................................................................39 Thumb指令集与ARM指令集的区别..............................................................................39 Thumb存储器访问指令.....................................................................................................40   LDR和STR........................................................................................................41   PUSH和POP......................................................................................................43   LDMIA和STMIA..............................................................................................43 Thumb数据处理指令.........................................................................................................45 数据传送指令..............................................................................................................46   MOV............................................................................................................46   MVN............................................................................................................46   NEG..............................................................................................................47 算术逻辑运算指令......................................................................................................47   ADD.............................................................................................................47   SUB..............................................................................................................48   ADC.............................................................................................................49   SBC..............................................................................................................49   MUL.............................................................................................................50   AND.............................................................................................................50   ORR..............................................................................................................50   EOR..............................................................................................................51   BIC...............................................................................................................51   ASR..............................................................................................................51   LSL...............................................................................................................52   LSR..............................................................................................................52   ROR..............................................................................................................53 比较指令......................................................................................................................53   CMP.............................................................................................................53   CMN.............................................................................................................54   TST...............................................................................................................54 Thumb跳转指令.........................................................................................................55   B...................................................................................................................55   BL.................................................................................................................55   BX................................................................................................................55 Thumb杂项指令.........................................................................................................56   SWI..............................................................................................................56 Thumb伪指令.............................................................................................................57   ADR.............................................................................................................57   LDR..............................................................................................................57   NOP..............................................................................................................58 伪指令..................................................................................................................................................59 符号定义伪指令..........................................................................................................................59   GBLA、GBLL、GBLS..............................................................................................59   LCLA、LCLL、LCLS................................................................................................60   SETA、SETL、SETS.................................................................................................61   RLIST...........................................................................................................................61   CN................................................................................................................................62   CP.................................................................................................................................62   DN、SN.......................................................................................................................62   FN.................................................................................................................................63 数据定义伪指令..........................................................................................................................63   LTORG.........................................................................................................................64   MAP.............................................................................................................................64   FIELD..........................................................................................................................65   SPACE..........................................................................................................................66   DCB.............................................................................................................................66   DCD和DCDU............................................................................................................67   DCDO..........................................................................................................................67   DCFD和DCFDU........................................................................................................68   DCFS和DCFSU.........................................................................................................68   DCI...............................................................................................................................69   DCQ和DCQU............................................................................................................69   DCW和DCWU..........................................................................................................70 报告伪指令..................................................................................................................................70   ASSERT.......................................................................................................................70   INFO............................................................................................................................71   OPT..............................................................................................................................71   TTL和SUBT..............................................................................................................72 汇编控制伪指令..........................................................................................................................73   IF、ELSE和ENDIF...................................................................................................73   MACRO和MEND.....................................................................................................74   WHIL和WEND.........................................................................................................75 杂项伪指令..................................................................................................................................76   ALIGN.........................................................................................................................77   AREA...........................................................................................................................78   CODE16和CODE32..................................................................................................79   END.............................................................................................................................80   ENTRY.........................................................................................................................80   EQU.............................................................................................................................81   EXPORT和GLOBAL................................................................................................81   IMPORT和EXTERN.................................................................................................82   GET和INCLUDE......................................................................................................83   INCBIN........................................................................................................................83   KEEP............................................................................................................................83   NOFP...........................................................................................................................84   REQUIRE....................................................................................................................84   PEQUIRE8和PRESERVE8.......................................................................................84   RN................................................................................................................................84   ROUT...........................................................................................................................85 ARM伪指令................................................................................................................................86   ADR.............................................................................................................................86   ADRL...........................................................................................................................86   LDR..............................................................................................................................86   NOP..............................................................................................................................86   LDFD...........................................................................................................................86   LDFS............................................................................................................................87 Thumb伪指令.............................................................................................................................87   ADR.............................................................................................................................87   LDR..............................................................................................................................87   NOP..............................................................................................................................88 ARM汇编程序设计............................................................................................................................88 文件格式......................................................................................................................................88 ARM汇编的一些规范................................................................................................................88 汇编语句格式......................................................................................................................88 标号......................................................................................................................................89   基于PC的标号...................................................................................................89   基于寄存器的标号..............................................................................................90   绝对地址..............................................................................................................90 局部标号..............................................................................................................................90 符号......................................................................................................................................91 常量......................................................................................................................................91   数字常数..............................................................................................................91   字符常量..............................................................................................................92   布尔常量..............................................................................................................92 段定义..................................................................................................................................92 宏定义及其作用..................................................................................................................93 子程序的调用..............................................................................................................................94 数据比较跳转..............................................................................................................................95 循环..............................................................................................................................................95 数据块复制..................................................................................................................................95 栈操作..........................................................................................................................................96 特殊寄存器定义及应用..............................................................................................................96 散转功能......................................................................................................................................97 查表操作......................................................................................................................................97 长跳转..........................................................................................................................................97 对信号量的支持..........................................................................................................................98 伪指令使用..................................................................................................................................98 一个完整的例子..........................................................................................................................98 外围部件控制..............................................................................................................................99 三级流水线介绍..........................................................................................................................99 C与汇编混合编程............................................................................................................................100 内嵌汇编....................................................................................................................................100 内嵌汇编的指令用法........................................................................................................103 内嵌汇编器与armasm汇编器的差异.............................................................................104 内嵌汇编注意事项............................................................................................................104 访问全局变量............................................................................................................................106 C与汇编相互调用....................................................................................................................107 寄存器的使用规则............................................................................................................108 堆栈使用规则....................................................................................................................108 参数传递规则....................................................................................................................109 C程序调用汇编程序........................................................................................................110 汇编程序调用C程序.......................................................................................................111 ARM指令集列表..............................................................................................................................113 ARM存储器访问指令表列表..................................................................................................113 ARM数据处理指令列表..........................................................................................................114 ARM乘法指令列表..................................................................................................................115 ARM跳转指令列表..................................................................................................................116 ARM协处理器指令列表..........................................................................................................117 ARM杂项指令列表..................................................................................................................118 ARM伪指令列表......................................................................................................................119 Thumb指令集列表...........................................................................................................................120 Thumb存储器访问指令列表...................................................................................................120 Thumb数据处理指令列表.......................................................................................................121 Thumb跳转指令及软中断指令列表.......................................................................................122 Thumb伪指令列表...................................................................................................................123 汇编预定义变量及伪指令................................................................................................................124 预定义的寄存器和协处理器名................................................................................................124 通用寄存器........................................................................................................................124 程序状态寄存器................................................................................................................124 浮点数寄存器....................................................................................................................124 协处理器及协处理器寄存器............................................................................................125 内置变量列表............................................................................................................................125 伪指令列表................................................................................................................................126 指令条件码列表........................................................................................................................128 CPSR和SPSR分配图.............................................................................................................................129
### 学习ARM汇编的入门指南 学习ARM汇编语言需要从基础概念入手,并结合实际操作进行深入理解。以下是一些关键点和资源推荐,帮助初学者快速掌握ARM汇编的基础知识。 #### 1. ARM汇编的基本概念 ARM汇编是一种低级编程语言,直接与硬件交互,用于编写高效、紧凑的代码。计算机通过电信号的形式接收指令,并将其解释为一系列0/1序列(bits)。为了便于人类理解和记忆,这些电信号被抽象为助记符,形成了汇编语言[^4]。例如,`MOV R0, #1` 是一条典型的ARM汇编指令,表示将值1加载到寄存器R0中。 #### 2. 学习资源推荐 - **官方文档**:ARM官方提供的参考手册是学习ARM汇编的重要资源。它详细描述了每条指令的功能和使用方法。 - **在线教程**:如《Whirlwind Tour of ARM Assembly》和《ARM assembler in Raspberry Pi》等文章提供了丰富的实例和解释,适合初学者逐步掌握。 - **书籍**:《Practical Reverse Engineering: x86, x64, ARM, Windows Kernel, Reversing Tools, and Obfuscation》是一本优秀的逆向工程书籍,其中包含了ARM汇编的相关内容[^4]。 - **集成开发环境(IDE)**:使用Keil MDK等工具可以方便地编写、调试ARM汇编程序[^5]。例如,在Keil中创建一个STM32项目,可以模拟真实的嵌入式开发环境。 #### 3. 实践案例 通过实际编写代码来加深对ARM汇编的理解是非常重要的。以下是一个简单的“Hello, World”程序示例,展示了如何在ARM架构上运行汇编代码[^3]: ```assembly @ 定义数据段 .data msg: .asciz "Hello, ARM\n" @ 定义代码段 .text .global _start _start: @ 将消息地址加载到寄存器R0 LDR R0, =msg @ 调用系统调用以打印字符串 MOV R7, #4 @ 系统调用号4 (sys_write) MOV R1, #1 @ 文件描述符1 (stdout) LDR R2, =len @ 消息长度 SWI 0 @ 触发软中断 @ 退出程序 MOV R7, #1 @ 系统调用号1 (sys_exit) SWI 0 @ 触发软中断 len = . - msg @ 计算消息长度 ``` 此代码片段展示了如何使用ARM汇编编写一个简单的程序,输出“Hello, ARM”字符串[^3]。 #### 4. 进阶学习建议 随着基础知识的掌握,可以进一步探索ARM架构的高级特性,例如异常处理、中断服务程序以及多核处理器的支持。同时,实践是学习汇编语言的关键,建议多尝试编写和调试小型程序,逐步积累经验[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值