.balignl 16, 0xdeadbeef
首先要弄明白.balignl的意思,这其实应该算是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是由编译器来实现其功能的。
.balign是意思是:以当前地址为开始开始,找到第一次出现的以第一个参数为整数倍的地址,并将其作为结束地址,
在这个结束地址前面存储一个字节长度的数据,存储内容正是第二个参数。如果当前地址正好是第一个参数的倍数,则没有数据被写入到内存。
.balign 8, 0xde这条指令的含义可以用下图表示:
图解:以当前地址为开始开始,找到第一次出现的以8为整数倍的地址,并将其作为结束地址,在这个结束地址前面存储一个字节长度的数据0xde。
如果当前地址正好是8的倍数,则没有数据被写入到内存。
以此类推,.balignw则表示第二个参数存入的内容长度为2字节:
因为现在填入的内容为2个字节,那就存在以下几种情况:
分析一下这四种情况:
以此类推,.balignl,这个指令用来填与一个字,即4个字节的长度
仔细分析一下就知道,对于.balignl 16, 0xdeadbeef,如果想要0xdeadbeef一定填到当前地址后面某个部分,当前地址偏移量就必须为4字节,这样才能保证在任何情况下,偏移的地址所留的空隙刚好填入所要填的内容。
注意:0xdeadbeef是什么意思?
类似这样的值很多,像0xabababab,它们的作用就是为内存做标记,插在那里,就表示从这个位置往后的一段有特殊作用的内存,而这个位置往前,禁止访问。
看了上面转载的博文,算是有豁然开朗了,下面再转一篇博文,是对这条命令进行的验证,算是对上面自己理解的一个实践。
转自:http://www.liweifan.com/2012/01/11/assembly-embedded-system-balignl-arm/
-
-
- #include
- #include
- #include
-
-
-
-
- .globl
_start - _start:
b start_code -
ldr pc, _undefined_instruction -
ldr pc, _software_interrupt -
ldr pc, _prefetch_abort -
ldr pc, _data_abort -
ldr pc, _not_used -
ldr pc, _irq -
ldr pc, _fiq -
- _undefined_instruction:
.word undefined_instruction - _software_interrupt:
.word software_interrupt - _prefetch_abort:
.word prefetch_abort - _data_abort:
.word data_abort - _not_used:
.word not_used - _irq:
.word irq - _fiq:
.word fiq -
-
.balignl 16,0xdeadbeef
问题出在58行,.balignl
balignl有几个“近亲”,具体看下面截图:
四种功能基本相同,不同之处在于填充时的字节数。.align和.balign是1个字节1个字节的填充,.balignw是2个字节2个字节的填充,而.balignl一次填充4个字节。
我们以balignl为例说明,它的完整指令格式为: .balignl {alignment} {,fill} {,max}。
第一个参数alignment为一个正整数,对齐时要以alignment的值的整数倍为结束地址