C程序编译之函数调用与全局变量

ARM C与armcc汇编 专栏收录该内容
1 篇文章 0 订阅

C程序编译之函数调用与全局变量

1.     函数调用

下图为同一文件内函数调用的C程序与反汇编:

处位置为调用DelayNs函数的反汇编,[0xebffffe2]为指令的机器码值,0x00000310为该指令的存储位置(PC值),根据跳转指令的说明,当执行该指令时,PC将跳转到距离当前PC偏移的位置上,偏移量为 0x00000310+8+(0xffffffe2<<2) = 0x00000310-0x70=0x000002a0。而0x000002a0即为DelayNs函数的地址,所以同一文件内函数的调用为偏移量,这样当存储指令的地址变化了指令的机器码也是相同的。如下图所示:

 

2.     全局变量

下图为全局变量global_aDISP_TAB[]c程序与反汇编:

 

1)处为将global_a的值赋给寄存器R2的汇编指令,指令机器码[0xe59f2050]的意思为:将基址寄存器中存储的数据读入到目标寄存器,目标寄存器为R2,源寄存器为R15(PC)+8+0x50=0x00000338处的值及(2)处的数据为0x81000000。而0x81000000global_a变量的存储位置。

编译器在编译时,将为全局变量创建一个在程序中的位置,位置定义可以使用DCD来占据程序空间,该位置存储着全局变量的实际存储地址。当该变量存储地址变化时,编译器只需修改程序空间中DCD的数据即可。

以上所说的内容都是在程序的CODE代码段,而全局变量的初始值在程序的DATA段中,编译器一般将程序的全局变量的数据段放在代码段的后面,如下图所示:

 

红框的数据即为global_a全局变量的初始值,程序开始运行时,全局变量的初始值在程序中,所以需要把全局变量的数据搬移到变量实际的存储地址。

所以必须有一段程序在没用到全局变量之前执行该功能,该程序一般是在跳转到Main函数之前完成的。而集成开发工具,在编译连接指令时帮助用户完成了数据段的搬移,用户感觉不到。

这样程序代码段中包含全局变量的正确的位置,而全局变量的初始值也已经搬移到正确的位置,所以程序执行无误。

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

gaoling179

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值