博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.balignl 16,0xdeadbeef浅析
阅读量:2458 次
发布时间:2019-05-11

本文共 1037 字,大约阅读时间需要 3 分钟。

   最近在分析
u-boot的源代码,看到这一行:

        .balignl 16, 0xdeadbeef

    不知道为什么要这样写,0xdeadbeef,明显是个单词组,写在这里有何意义呢?查阅了众多资料的时候才晃然大悟。

    下面我一步步来说明:

    首先要弄明白.balignl的意思,这其实应该算是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是由编译器来实现其功能的。

    .balign是意思是:以当前地址为开始开始,找到第一次出现的以第一个参数为整数倍的地址,并将其作为结束地址,在这个结束地址前面存储一个字节长度的数据,存储内容正是第二个参数。如果当前地址正好是第一个参数的倍数,则没有数据被写入到内存。

.balign 8, 0xde这条指令的含义可以用下图表示:

 

.balignl 16,0xdeadbeef浅析 - U-BOOT - 少即是多,慢即是快!

  

    图解:以当前地址为开始开始,找到第一次出现的以8为整数倍的地址,并将其作为结束地址,在这个结束地址前面存储一个字节长度的数据0xde。如果当前地址正好是8的倍数,则没有数据被写入到内存。

    以此类推,.balignw则表示第二个参数存入的内容长度为2字节:

    .balignw 4, 0x368d

    因为现在填入的内容为2个字节,那就存在以下几种情况:

l          当前地址没有偏移就满足了以4为倍数的地址

l          当前地址偏移了1个字节就满足了以4为倍数的地址

l          当前地址偏移了2个字节就满足了以4为倍数的地址

l          当前地址编移了3个字节就满足了以4为倍数的地址

    分析一下这四种情况:

l          当没有偏移的时候,地址中间肯定没有办法填上信息

l          当偏移1个字节的时候,地址中间空隙不够,所以填入的数值,是末定义,也就是说,填入什么值,不清楚

l          当偏移2个字节的时候,地址中间的空隙正好填入0x368d两个字节的内容

l          当偏移3个字节的时候,地址中间的空隙大于所要填的内容。此时填入的数值,是末定义,填入什么值,不清楚

    以此类推,.balignl,这个指令用来填与一个字,即4个字节的长度

仔细分析一下就知道,对于.balignl 16, 0xdeadbeef如果想要0xdeadbeef一定填到当前地址后面某个部分,当前地址偏移量就必须为4字节,这样才能保证在任何情况下,偏移的地址所留的空隙刚好填入所要填的内容。

 

注意:0xdeadbeef是什么意思?

    类似这样的值很多,像0xabababab,它们的作用就是为内存做标记,插在那里,就表示从这个位置往后的一段有特殊作用的内存,而这个位置往前,禁止访问。

转载地址:http://yashb.baihongyu.com/

你可能感兴趣的文章
pythonic_使用Pythonic在Python中以图形方式编程
查看>>
python black_格式化Python,但您喜欢使用Black
查看>>
使用Python在GitHub Pages上运行博客
查看>>
如何使用Python和Apache Spark分析日志数据
查看>>
raspberry pi_PiFlash入门:在Linux上启动Raspberry Pi
查看>>
使用Pygame模块使用Python构建游戏框架
查看>>
如何使用PostgreSQL简化Python代码
查看>>
软件博览会上的致辞_本地制造商博览会上有4个著名的开源项目
查看>>
pygame游戏角色旋转_使用Pygame移动游戏角色
查看>>
为什么Python和Pygame是入门程序员的最佳选择
查看>>
上海微钉科技面试题_钉住面试的7个技巧
查看>>
库蒂尼奥_尼奥基入门
查看>>
强化学习入门论文_强化学习入门
查看>>
kubernetes入门_Kubernetes入门
查看>>
aalto 交互_向芬兰的Aalto Fablab付款
查看>>
迈向更大包容性
查看>>
linux 邮件开源工具_5个适用于Linux的开源个人理财工具
查看>>
机器学习入门python_使用Python进行机器学习入门
查看>>
kde调整分辨率_7个很酷的KDE调整将改变您的生活
查看>>
卫星重访周期_通过开放式冒险重访巨大的洞穴
查看>>