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. (转).balignl 16,0xdeadbeef浅析

    原文地址:http://zqwt.012.blog.163.com/blog/static/12044684201031102956976/ 最近在分析u-boot的源代码,看到这一行: .balig ...

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

    .globl _start  //不占内存_start: b       start_code //占4字节内存 ldr pc, _undefined_instruction //占4字节内存 ldr ...

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

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

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

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

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

    在 Uboot 的 Start.S 中存在以下源码: .globl _start _start: b start_code ldr pc, _undefined_instruction ldr pc, ...

  6. uboot(二): Uboot-arm-start.s分析

    声明:该贴是通过参考其他人的帖子整理出来,从中我加深了对uboot的理解,我知道对其他人一定也是有很大的帮助,不敢私藏,如果里面的注释有什么错误请给我回复,我再加以修改.有些部分可能还没解释清楚,如果 ...

  7. uboot 移植遇到的问题及解决方法(转)

    http://blog.sina.com.cn/s/blog_988ec60801017iy3.html 一  在commond  env_nand.c: In function 'saveenv': ...

  8. (转载)U-boot启动完全分析

    1.1 U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 Ø 硬件设备初始化 Ø 加载U-Boot第二阶段代码到RAM空间 Ø 设置好栈 Ø ...

  9. u-boot移植总结(一)start.S分析

    本次移植u-boot-2010.09是基于S3C2440的FL440板子,板子自带NANDFLASH而没有NORFLASH,所以在U-BOOT启动的过程中必须实现从NANDFLASH到SDRAM的重定 ...

随机推荐

  1. 关于vsftpd的refusing to run with writable root inside chroot()问题

    今天在上班帮测试的同事搭建ftp服务器时出现的一个问题 服务搭建完成后连接时报这个错误: refusing to run with writable root inside chroot() 查了资料 ...

  2. Linux对包管理阐述

    Centos/Redhat/Fedora的软件包,都是rpm后缀的文件.包管理器rpm(Redhat packages manager)  linux的哲学思想是简单命令解决复杂任务,因此每个软件的功 ...

  3. TP3.2之引入第三方类库文件和普通.php文件

    1.引入第三方类库 .class.php文件 1.1 类库有写namespace命名空间 namespace Org\Util; class Auth { } 保存到ThinkPHP/Library/ ...

  4. ArchLinux下LXDE的安装与设置心得

    安装 首先安装基本的桌面环境: $ sudo pacman -S lxde 奇怪的是默认并没有安装面板lxpanel,而且源里也没有,只好从AUR安装之: $ yaourt -S lxpanel-sv ...

  5. HDUOJ-----4510 小Q系列故事——为什么时光不能倒流

    小Q系列故事——为什么时光不能倒流 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)T ...

  6. Clipboard.GetImage() Clipboard获取粘贴板内容为null的解决办法

    将线程启动模式设置为 sta 单线程 简介 STA:   Single-Thread   Apartment,   中文叫单线程套间.就是在COM库初始化的时候创建一个内存结构,然后让它和调用CoIn ...

  7. Linux 分区注意事项

    必须分区: 1)/(根分区) 2)/swap(交换分区,当内存不超过4G时,建议swap大小为内存2倍,若超过4G,建议交换分区跟内存一样大) 推荐分区 /boot(启动分区,单独分区,最新200M)

  8. Unix环境高级编程(十八)高级进程间通信

    本章主要介绍了基于STREAM的管道和UNIX域套接字,这些IPC可以在进程间传送打开文件描述符.服务进程可以使用它们的打开文件描述符与指定的名字相关联,客户进程可以使用这些名字与服务器进程通信. 1 ...

  9. 安装R语言的包的方法

    安装R语言的包的方法: 1. 在线安装 在R的控制台,输入类似install.packages("TSA")  # 安装 TSA install.packages("TS ...

  10. selenium grid2 使用远程机器的浏览器

    下载 selenium-server-standalone-3.4.0.jar包 在selenium-server-standalone-3.4.0.jar包目录下面执行cmd 命令 java -ja ...