侵权投诉
搜索
更多>> 热门搜索:
订阅
纠错
加入自媒体

变量访问被ARM架构安排的明明白白!

2020-12-15 10:05
一口Linux
关注

2. 反汇编结果:

由上图可知,每存储1个int型全局变量需要「8个字节」,

「literal pool (文字池)占用4个字节」

literal pool的本质就是ARM汇编语言代码节中的一块用来存放常量数据而非可执行代码的内存块。

使用literal pool (文字池)的原因
当想要在一条指令中使用一个 4字节长度的常量数据(这个数据可以是内存地址,也可以是数字常量)的时候,由于ARM指令集是定长的(ARM指令4字节或Thumb指令2字节),所以就无法把这个4字节的常量数据编码在一条编译后的指令中。此时,ARM编译器(编译C源程序)/汇编器(编译汇编程序) 就会在代码节中分配一块内存,并把这个4字节的数据常量保存于此,之后,再使用一条指令把这个4 字节的数字常量加载到寄存器中参与运算。
在C源代码中,文字池的分配是由编译器在编译时自行安排的,在进行汇编程序设计时,开发者可以自己进行文字池的分配,如果开发者没有进行文字池的安排,那么汇编器就会代劳。

「bss段占用4个字节」

每访问1次全局变量,总共需要3条指令,访问3次全局变量用了「12条指令」。

14. 通过当前pc值40008018偏移32个字节,找到xx变量的链接地址40008038,然后取出其内容40008044存放在r3中,该值就是xx在bss段的地址
15. 通过将立即数0x11即#17赋值给r2
16. 将r2的内容那个写入到r3对应的指向的内存,即xx标号对应的内存中

二、结构体代码反汇编

1. 修改main.c如下: 

 2  * main.c                                                           

 3  *

 4  *  Created on: 2020-12-12

 5  *      Author: 一口Linux

 6  

 7 struct

 8 {

 9     int xx;

10     int yy;

11     int zz;

12 }peng;

13 int main(void)

14 {

15     peng.xx=0x11;

16     peng.yy=0x22;

17     peng.zz=0x33;

18 

19     while(1);

20     return 0;

21 }

<上一页  1  2  3  下一页>  
声明: 本文由入驻维科号的作者撰写,观点仅代表作者本人,不代表OFweek立场。如有侵权或其他问题,请联系举报。

发表评论

0条评论,0人参与

请输入评论内容...

请输入评论/评论长度6~500个字

您提交的评论过于频繁,请输入验证码继续

暂无评论

暂无评论

    文章纠错
    x
    *文字标题:
    *纠错内容:
    联系邮箱:
    *验 证 码:

    粤公网安备 44030502002758号