[转]关于U-BOOT中.balignl 16…

本文详细解析了U-Boot中的.balignl伪指令,解释了其作用是进行字节对齐并填充特定数据,以确保满足处理器的对齐要求。通过实例分析了不同情况下的对齐方式,并探讨了填充数据如0xdeadbeef的意义,指出它可能是内存标记或者仅仅是编程幽默。
摘要由CSDN通过智能技术生成

.balignl 16, 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://www.liweifan.com/2012/01/11/assembly-embedded-system-balignl-arm/

  先将部分代码贴出,来自于uboot-2011.06目录下arch\arm\cpu\arm920t\start.S。

  1.   
  2.   
  3. #include    
  4. #include    
  5. #include    
  6.   
  7.   
  8.   
  9.   
  10. .globl _start   
  11. _start:   start_code   
  12.     ldr pc, _undefined_instruction   
  13.     ldr pc, _software_interrupt   
  14.     ldr pc, _prefetch_abort   
  15.     ldr pc, _data_abort   
  16.     ldr pc, _not_used   
  17.     ldr pc, _irq   
  18.     ldr pc, _fiq   
  19.   
  20. _undefined_instruction: .word undefined_instruction   
  21. _software_interrupt:    .word software_interrupt   
  22. _prefetch_abort:    .word prefetch_abort   
  23. _data_abort:        .word data_abort   
  24. _not_used:      .word not_used   
  25. _irq:           .word irq   
  26. _fiq:           .word fiq   
  27.   
  28.     .balignl 16,0xdeadbeef  

 

 

问题出在58行,.balignl 16,0xdeadbeef,查了以前的笔记得知这是一个伪指令,主要是字节对齐用的。对于某些处理器来说,所编写的代码不对齐并不会报错,但编译器为了优化,也可能会自动帮你对齐。但对于另外一些处理器的编译器来说,汇编代码里必须手动保持对齐,否则编译器会报错,arm处理器就是如此。本着精读的态度,上网查了一下资料,结果花掉了1下午的时间o(︶︿︶)o 。。。

balignl有几个“近亲”,具体看下面截图:


四种功能基本相同,不同之处在于填充时的字节数。.align和.balign是1个字节1个字节的填充,.balignw是2个字节2个字节的填充,而.balignl一次填充4个字节。

我们以balignl为例说明,它的完整指令格式为: .balignl {alignment} {,fill} {,max}。

第一个参数alignment为一个正整数,对齐时要以alignment的值的整数倍为结束地址

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值