在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。
转载于:https://www.cnblogs.com/zdl110110/articles/1898649.html
相关资源:JAVA上百实例源码以及开源项目