Chinaunix首页 | 论坛 | 博客
  • 博客访问: 397353
  • 博文数量: 115
  • 博客积分: 2501
  • 博客等级: 少校
  • 技术积分: 1009
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-23 17:05
文章分类

全部博文(115)

文章存档

2011年(2)

2010年(86)

2009年(27)

我的朋友

分类: 嵌入式

2010-11-29 11:34:40

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] {,{,}}

指令说明:以某种排列方式在内存中填充数值。(该指令与armasm中的ALIGN类似)

power_of_2表示排列方式,其值可为481632,单位是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

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

 

阅读(3277) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~