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

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

http://zqwt.012.blog.163.com/blog/static/12044684201031102956976/

最近在分析u-boot的源代码,看到这一行:
        .balignl 16, 0xdeadbeef
不知道为什么要这样写,0xdeadbeef,明显是个单词组,写在这里有何意义呢?查阅了众多资料的时候才晃然大悟。
下面我一步步来说明:
首先要弄明白.balignl的意思,这其实应该算是一个伪操作符,伪操作符的意思就是机器码里,
并没有一个汇编指令与其对应,是由编译器来实现其功能的。
.balign是意思是:以当前地址为开始开始,找到第一次出现的以第一个参数为整数倍的地址,并将其作为结束地址,
在这个结束地址前面存储一个字节长度的数据,存储内容正是第二个参数。如果当前地址正好是第一个参数的倍数,则没有数据被写入到内存。
.balign 8, 0xde这条指令的含义可以用下图表示:

图解:以当前地址为开始开始,找到第一次出现的以8为整数倍的地址,并将其作为结束地址,在这个结束地址前面存储一个字节长度的数据0xde。
如果当前地址正好是8的倍数,则没有数据被写入到内存。
以此类推,.balignw则表示第二个参数存入的内容长度为2字节:
    .balignw 4, 0x368d
因为现在填入的内容为2个字节,那就存在以下几种情况:
    1>当前地址没有偏移就满足了以4为倍数的地址
    2>当前地址偏移了1个字节就满足了以4为倍数的地址
    3>当前地址偏移了2个字节就满足了以4为倍数的地址
    4>当前地址编移了3个字节就满足了以4为倍数的地址
分析一下这四种情况:
    1>当没有偏移的时候,地址中间肯定没有办法填上信息
    2>当偏移1个字节的时候,地址中间空隙不够,所以填入的数值,是末定义,也就是说,填入什么值,不清楚
    3>当偏移2个字节的时候,地址中间的空隙正好填入0x368d两个字节的内容
    4>当偏移3个字节的时候,地址中间的空隙大于所要填的内容。此时填入的数值,是末定义,填入什么值,不清楚
以此类推,.balignl,这个指令用来填与一个字,即4个字节的长度
仔细分析一下就知道,对于.balignl 16, 0xdeadbeef,如果想要0xdeadbeef一定填到当前地址后面某个部分,
当前地址偏移量就必须为4字节,这样才能保证在任何情况下,偏移的地址所留的空隙刚好填入所要填的内容。

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

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

你可能感兴趣的文章
计算机网络与Internet应用
查看>>
linux性能剖析工具
查看>>
Mars说光场(3)— 光场采集
查看>>
Django 文件下载功能
查看>>
xBIM 插入复制功能
查看>>
持续集成简介(转)
查看>>
一行代码让你的TableView动起来-iOS动画
查看>>
AI技术出海 - 阿里云GPU服务器助力旷视勇夺4项世界第一
查看>>
Spring Boot中初始化资源的几种方式
查看>>
通过测试发现的Exchange 2013 CU16存在的一个小bug
查看>>
将桌面文件映射至E盘
查看>>
走红日本 阿里云如何能够赢得海外荣耀
查看>>
入侵CIA和FBI的黑客:可能是一个15岁少年
查看>>
聚焦服务器行业,看美国独立服务器优势
查看>>
高中生开发 Chrome 插件,帮助色盲患者更为清晰的看到网上图片
查看>>
玩笑到现实,大数据涉足文学研究--用数据模型分析莎翁著作
查看>>
[Servlet&JSP] HttpServletResponse的使用
查看>>
【java设计模式】之 单例(Singleton)模式
查看>>
Linux_自制系统服务启动脚本
查看>>
干货:解码OneData,传说中的阿里数据中台是如何练成的?
查看>>