ARM 简单分析 C函数反汇编代码的运行

前言

  • R13:SP堆栈指针寄存器
    功能:指向堆栈的栈顶
    详解:
    1)异常模式发生时,程序把通用寄存器压入堆,SP一直指向栈顶的位置。返回时再出栈,保证程序状态的完整性。大部分情况下,只要程序在执行,堆栈就会被建立,而SP指向堆栈的栈顶位置。
    2)有MSP 和PSP(两者只需一个,不能同时使用,默认MSP)。
    MSP :主堆栈指针,系统用。PSP : 进程堆栈指针,个人堆栈指针。

  • R14:LR连接寄存器
    功能:保存断点地址
    详解:
    1)用来保存子程序的返回地址
    当调用子程序时,R14保存子程序的返回地址。子程序返回时,把R14的值复制到程序计数器PC,实现子程序的返回
    2)当异常发生时,用R14保存异常返回的地址。
    R14中保存的值等于异常发生时程序计数器PC的值减4(因为cortex-m3采用3级指令流水线)。因此在异常模式下,可以根据R14的值返回到异常发生前的相应位置,继续执行。

  • R15:PC程序计数寄存器
    功能:指向下一条要执行的指令地址。
    详解:
    在程序开始执行前,将程序的第一条指令地址送入PC,CPU按照PC的指示从内存读取第一条指令(取指)。当执行指令时,PC总是指向下一条指令地址。当程序转移时,转移指令执行的最终结果就是要改变PC的值,此PC值就是转去的目标地址。处理器总是按照PC指向取指、译码、执行,以此实现了程序转移


一、代码

  • 原 C 语言函数代码:

在这里插入图片描述

  • 对应的 main 函数和 add_val 函数的汇编代码:

在这里插入图片描述
在这里插入图片描述


二、执行流程

1.

在这里插入图片描述


2.

在这里插入图片描述


3.

在这里插入图片描述


4.

在这里插入图片描述


5.在这里插入图片描述


6.

在这里插入图片描述


7.

在这里插入图片描述


8.

在这里插入图片描述


9.

最后 add_val 函数执行结束,将会把当初保存的 LR 寄存器的值,取出来保存到 PC 寄存器。
所以,程序的下一条指令的位置,就是 main() 函数中调用 add_val()函数的下一条语句的位置。

hanshu


10.

我们可以看到,main() 函数的 push 和 pop 指令, 是一一对应的。

使用 pop 指令将栈顶元素取出,保存到 PC 寄存器中。

之后,CPU 的下一条指令地址,就是在 PC 寄存器中保存的指令地址。

在这里插入图片描述

同理, add_val函数中的 push 和 pop 指令, 也是一一对应的。

在这里插入图片描述


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值