关于u-boot中的.balignl 16,0xdeadbeef的理解
2013-10-30 11:12
375 查看
.balign解释
.balign,编译器的一个伪操作符。伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。如:.balign 8, 0xba
意思是在以当前地址开始,在地址为8的倍数的位置的前面填入一个字节内容为0xba的内容。当当前地址正好是8的倍数,则没有东西被写入到内存。
依此类推,.balignw则表示第二个参数存入的内容长度为一个字长,即2个字节;.balignl则表示第二个参数存入的内容长度为二个字长,即4个字节。
.balignw 4,0xabcd
因为现在填入的内容为16位了,那就存在以下几种情况:
当前地址没有偏移就满足了以4为倍数的地址:
地址中间肯定没有办法填上信息;
当前地址偏移了1个字节就满足了要求:
地址中间空隙不够,所以填入的数值,是未定义,也就是说,填入的什么值,不清楚;
当前地址偏移了2个字节就满足了要求:
地址中间的空隙正好填入手面的数据,所以就填上了;
当然地址编移了3个字节就满足了要求:
地址中间的空隙大于所要填的内容。
u-boot的.balignl 16,0xdeadbeef
ARM920T处理器核心,支持32位与16位两种指令长度,16位的指令叫thumb指令集,以32位指令集进行说明。既然是32位指令集,所以一条指令就占32位,即4字节,所以在调试器中,地址的显示也是4字节一跳的,所以pc的值,也是4字节一跳的,并不存在可能pc的值为0x00000007的情况,呵呵。
这个地方填16个偏移量,是因为
.globl _start //不占内存
_start: b start_code //占4字节内存
ldr pc, _undefined_instruction //占4字节内存
ldr pc, _software_interrupt //占4字节内存
ldr pc, _prefetch_abort //占4字节内存
ldr pc, _data_abort //占4字节内存
ldr pc, _not_used //占4字节内存
ldr pc, _irq //占4字节内存
ldr pc, _fiq //占4字节内存
占了4x8=32字节内存。
_undefined_instruction: .word undefined_instruction //占4字节内存
_software_interrupt: .word software_interrupt //占4字节内存
_prefetch_abort: .word prefetch_abort //占4字节内存
_data_abort: .word data_abort //占4字节内存
_not_used: .word not_used //占4字节内存
_irq: .word irq //占4字节内存
_fiq: .word fiq //占4字节内存
占了4x7=32字节内存。
所以在这个.balignl 16,0xdeadbeef指令之前,一共占了4x15=60个字节的内存,所以本代码的作者当时就简单的在15这个数上,加了个1,即16,把当前指针往后移到地址为64的位置,然后在前面插上了0xdeadbeef这个特殊的值。
我不知道这个地方是作者一个错误,歪打正着呢,还是怎么回事,其实这个偏移的值还有好多种情况。如果说最小的值的话,那么也可以写成.balignl 8,0xdeadbeef,也可以达到同样的目的。因为60不是8的倍数,但是64是8的倍数,如果写8,也正好插到64前面,也即60这个内存起始地址。如果更大一点儿的呢,那么填32也可以达到同样的效果,即.balignl 32,0xdeadbeef,道理同上。当然,不能为4,因为pc值在任何时候,都是4的倍数,如果用了这个值,0xdeadbeef永远也插不进去。
原文出处:http://haoyeren.blog.sohu.com/84511571.html
相关文章推荐
- 指定输入键盘码为数字
- DML触发器
- linux设备驱动归纳总结
- Documentation/fault-injection/notifier-error-inject.txt
- Myeclipse2013下载,安装,破解,介绍(CSDN首发)
- HOOK技术的一些简单总结
- php操作路径的经典方法
- 原码 反码 补码 移码的关系(精简总结)
- 如何做一个优秀的程序员 (转)
- 我们都是坏孩子
- 部署System Center App Controller 2012 Service Pack 1 (3)
- postrgres 时间差转秒数等操作
- RedHat linux 密码策略
- 使用VC设置环境变量值,并立即生效
- “Hello World!”的N种写法(C语言)
- 《编程之美》读书随笔之四:买书问题
- OCP-1Z0-052-V8.02-187题
- oracle 新手遇到常见问题的解决办法
- Ubuntu 安装Chrome步骤
- springmvc jar