balignl伪指令
在U-Boot源码的start.s中有着如下红色部分语句:
.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 |
下面介绍GNU ARM ASM中的balign:
.balign[wl] <power_of_2>{,<fill_value>{,<max_padding>}}
指令说明:以某种排列方式在内存中填充数值。(该指令与armasm中的ALIGN类似)。
power_of_2表示排列方式,其值可为4,8,16或32,单位是byte;
fill_value是要填充的值;
max_padding最大的填充界限,请求填充的bytes数超过该值,将被忽略。
.balignw 和.balignl是.balign命令的变化形式。.balignw使用2个字节来填充空白区。.balignl使用4字节来填充。
.balign是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。.balignl是.align的变体,.balign是意思是,在以当前地址开始,地址计数器必须是以第一个参数为整数倍的地址为尾,若当前地址不为第一个参数的整数倍,则用第二个参数来填充当前地址,直到地址为第一个参数的整数倍。
下面分析u-boot文件的反汇编代码:
u-boot: file format elf32-littlearm
Disassembly of section .text:
33f80000 <_start>: 33f80000: ea000012 b 33f80050 <start_code> 33f80004: e59ff014 ldr pc, [pc, #20] ; 33f80020 <_undefined_instruction> 33f80008: e59ff014 ldr pc, [pc, #20] ; 33f80024 <_software_interrupt> 33f8000c: e59ff014 ldr pc, [pc, #20] ; 33f80028 <_prefetch_abort> 33f80010: e59ff014 ldr pc, [pc, #20] ; 33f8002c <_data_abort> 33f80014: e59ff014 ldr pc, [pc, #20] ; 33f80030 <_not_used> 33f80018: e59ff014 ldr pc, [pc, #20] ; 33f80034 <_irq> 33f8001c: e59ff014 ldr pc, [pc, #20] ; 33f80038 <_fiq>
33f80020 <_undefined_instruction>: 33f80020: 33f80180 .word 0x33f80180
33f80024 <_software_interrupt>: 33f80024: 33f801e0 .word 0x33f801e0
33f80028 <_prefetch_abort>: 33f80028: 33f80240 .word 0x33f80240
33f8002c <_data_abort>: 33f8002c: 33f802a0 .word 0x33f802a0
33f80030 <_not_used>: 33f80030: 33f80300 .word 0x33f80300
33f80034 <_irq>: 33f80034: 33f80360 .word 0x33f80360
33f80038 <_fiq>: 33f80038: 33f803c0 .word 0x33f803c0 33f8003c: deadbeef .word 0xdeadbeef
33f80040 <_TEXT_BASE>: 33f80040: 33f80000 .word 0x33f80000 |
红色部分的PC 33f8003c不为16的整数倍,故在此地址填充了0xdeadbeef。