您的位置:首页 > 编程语言

mini2440(5) 2440init.s代码分段分析

2012-09-10 00:05 381 查看
mini2440(3) 2440init.s代码关键字注解 中对2440init.s文件中的汇编语言伪指令等关键字做了简单的注释,也提出了一些问题,对汇编器对伪指令的处理也有了更深刻的理解:汇编语言程序中伪指令会对汇编器的行为产生影响

2440init.s文件中程序的执行流程:

1、程序入口

AREA Init,CODE,READONLY

ENTRY

;1)The code, which converts to Big-endian, should be in little endian code.

;2)The following little endian code will be compiled in Big-Endian mode.

; The code byte order should be changed as the memory bus width.

;3)The pseudo instruction,DCD can't be used here because the linker generates error.

ASSERT :DEF:ENDIAN_CHANGE

[ ENDIAN_CHANGE

ASSERT :DEF:ENTRY_BUS_WIDTH

[ ENTRY_BUS_WIDTH=32

b ChangeBigEndian ;DCD 0xea000007

]

[ ENTRY_BUS_WIDTH=16

andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00

]

[ ENTRY_BUS_WIDTH=8

streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea

]

|

b ResetHandler

]

b HandlerUndef;handler for Undefined mode

b HandlerSWI;handler for SWI interrupt

b HandlerPabort;handler for PAbort

b HandlerDabort;handler for DAbort

b .;reserved

b HandlerIRQ;handler for IRQ interrupt

b HandlerFIQ;handler for FIQ interrupt

;@0x20

b EnterPWDN; Must be @0x20.

系统上电或者复位之后,从这个程序入口开始执行:

不考虑条件汇编的情况下,执行的第一条指令是:bResetHandler

若考虑条件汇编的情况下,执行的指令则不同:

参考ADS 1.2的Assembler Guide(Page81/354),armasm的默认Endian是littleend,如果要编译成bigend,则需要为armasm指定参数为-bigend,默认情况是littleend,如果要编译为bigend,则ENDIAN_CHANGE定义为{TRUE},如果ENDIAN_CHANGE为{TRUE},则再判断变量ENTRY_BUS_WIDTH的值,如果是32位,则跳转到符号ChangeBigEndian处执行,如果是16位和8位,则再执行其它操作

问题:在option.inc中,定义:

GBLAENTRY_BUS_WIDTH

ENTRY_BUS_WIDTH SETA16

其中ENTRY_BUS_WIDTH的值定义为16位宽,为什么是16位,而不是32位呢?

2、ChangeBigEndian

ChangeBigEndian

;@0x24

[ ENTRY_BUS_WIDTH=32

DCD
0xee110f10 ;0xee110f10 => mrc p15,0,r0,c1,c0,0

DCD
0xe3800080 ;0xe3800080 => orr r0,r0,#0x80; //Big-endian

DCD
0xee010f10 ;0xee010f10 => mcr p15,0,r0,c1,c0,0

]

[ ENTRY_BUS_WIDTH=16

DCD 0x0f10ee11

DCD 0x0080e380

DCD 0x0f10ee01

]

[ ENTRY_BUS_WIDTH=8

DCD 0x100f11ee

DCD 0x800080e3

DCD 0x100f01ee

]

DCD 0xffffffff ;swinv 0xffffff is similar with NOP and run well in both endian mode.

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

DCD 0xffffffff

b ResetHandler



[ ENTRY_BUS_WIDTH=32

DCD0xee110f10;0xee110f10 => mrc p15,0,r0,c1,c0,0

DCD0xe3800080;0xe3800080 => orr r0,r0,#0x80; //Big-endian

DCD0xee010f10;0xee010f10 => mcr p15,0,r0,c1,c0,0

]

中,直接在内存空间中存放指令的二进制补码形式

mrc p15,0,r0,c1,c0,0:mrc指令:Move to ARM register from coprocessor

p15是协处理器的名称,0是特定协处理器的操作码,r0是ARM的目的处理器,c1、c0是协处理器的寄存器,0是可选的特定协处理器的操作码

mcr p15,0,r0,c1,c0,0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: