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,它们的作用就是为内存做标记,插在那里,就表示从这个位置往后的一段有特殊作用的内存,而这个位置往前,禁止访问。

.balignl 16,0xdeadbeef浅析相关推荐

  1. start.s中的.balignl 16,0xdeadbeef

    转载:http://blog.csdn.net/l_thread/article/details/6020036 开始看start.s中的代码,又一句.balignl 16,0xdeadbeef,不知 ...

  2. UBOOT问题收集(1)--balignl 16, 0xdeadbeef

    .balignl 16,0xdeadbeef 是uboot起始文件下的start.S文件57行. 因为好奇这个代码的含义,所以百度了下: =============================== ...

  3. 关于u-boot中的.balignl 16,0xdeadbeef的理解

    最近在分析u-boot的源代码,看到这一行: .balignl 16,0xdeadbeef 不理解了,不知道为什么要这样写,0xdeadbeef,明显是个单词组,写在这里有何意义呢?然后在查阅了众多资 ...

  4. deadbeef_于关u-boot中的.balignl 16,0xdeadbeef的理解(原创,请勿转载)

    最近在分析u-boot的源代码,看到这一行: .balignl 16,0xdeadbeef 不理解了,不知道为什么要这样写,0xdeadbeef,明显是个单词组,写在这里有何意义呢?然后在查阅了众多资 ...

  5. arm汇编:.balignl伪指令理解

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

  6. 第1阶段——关于u-boot目标文件start.o中.globl 和.balignl理解(3)

    汇编程序中以.开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,称为伪操作. .globl _start 作用:声明一个_start全局符号(Symbol), 这个_sta ...

  7. Uboot1.1.16源代码完全注释笔记

    第一章 Uboot1.1.16中的汇编部分 老版本的Uboot1.1.16是从start.S (uboot1.1.16_256m-for36---v1.01\cpu\s3c64xx)开始执行的. 1. ...

  8. 关于 Uboot 中有趣的 0xdeadbeef 填充

    在 Uboot 的 Start.S 中存在以下源码: .globl _start_start: b start_codeldr pc, _undefined_instructionldr pc, _s ...

  9. uboot代码详细分析.pdf

    目录 u-boot-1.1.6 之cpu/arm920t/start.s 分析 ............................................................ ...

最新文章

  1. raid5 增加一块硬盘_Raid5热备盘上线同时另一块硬盘离线如何恢复数据
  2. Java中的断言(assert)
  3. 以太坊Ethereum存储和数据结构 图示
  4. 【收藏】使用Docker搭建MySQL服务
  5. 【转摘留用】页面静态化..
  6. 微软出手,蚕食JetBrains系市场?
  7. 开源FastGithub
  8. loss function
  9. python安装第三方库-常见错误解决
  10. 大型专利公司岗位设置
  11. linux中安装samba的方法以及注意事项
  12. 上一家单位离职的原因_员工离职再入职,专项附加扣除该如何变更?
  13. plt.title() 把标题置于图像下方
  14. linux学习作业-第八周
  15. sweetalert
  16. 走楼梯2<每日一题>
  17. 做一个思考者系列之--编程这件事(手稿版)
  18. 关于特殊后缀名如vue vm less等文件在DW中高亮显示并且代码提示的解决方案
  19. git添加diff tool和merge tool
  20. Pinterest简介

热门文章

  1. 计算机启动和linux启动
  2. 系统I/O小程序-文件拷贝
  3. 1356. 根据数字二进制下 1 的数目排序 golang
  4. Mac SecureCRT解决中文乱码
  5. linux 安装qt 4.6软件,QT学习之一:Linux下安装QT之版本qt-4.6.3
  6. c++实现任意类型数组类的封装
  7. C++小型公司管理系统
  8. linux网络编程:使用多进程实现socket同时收发数据
  9. Java面试题,java工程师求职简历
  10. 字符串驻留机制截图?#注意回顾字符串的深浅拷贝小数据池那节