完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问几个启动代码中的问题
(1) GBLL THUMBCODE ;//== 全局的逻辑变量,用于区分是16位或32代码 [ {CONFIG} = 16 ;//== {CONFIG}为内置变量,由汇编器决定,如果为ARM,则=32,Thumb,则为16,if config==16 这里表示你的目前处于领先地16位编译方式 THUMBCODE SETL {TRUE} ;//== 如果CONFIG=16,则 THUMBCODE 为真,{TRUE}为内置变量,设置THUMBCODE 为 true CODE32 ;//== 转入32位编译模式 | ;//== ELSE THUMBCODE SETL {FALSE} ;//== THUMBCODE {FALSE}为内置变量变量,设置THUMBCODE 为 false ] ;//== ENDIF 这段程序怎么理解,如果CONFIG==16,THUMBCODE = TRUE,CODE32起作用了,下边的变异按32位编译 如果CONFIG!=16,THUMBCODE = FALSE,CODE32还起作用吗?这里CONFIG!=16,应该就是按32位编译,而CODE32不起作用了,还是按32位编译吗?什么时候按32位编译? (2) ASSERT :DEF:ENDIAN_CHANGE ;//== 判定是否已经定义了"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 ResetHandler这句,但是andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00和streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea这句话是什么作用? (3) 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 ;这3句的汇编语言是什么,作用是什么? DCD 0x0080e380 DCD 0x0f10ee01 ] [ ENTRY_BUS_WIDTH=8 DCD 0x100f11ee ;这3句的汇编语言是什么,作用又是什么? 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 (4) 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. 这为什么必须在0x20处? |
|
相关推荐
1个回答
|
|
问题(1):我也不懂,现场查了一下。google是个好东西,建议常用它。
http://bbs.driverdevelop.com/simple/index.php?t68400.html 不过这文章说得有点乱,我整理一下: 1. 系统启动时,CPU处于ARM状态,所以编译出来的启动代码的开始部分也应该为ARM指令。怎样告诉编译器,让它即使想使用THUMB指令时,也将开始部分的代码用ARM指令编译呢?这就是这段代码的作用了: GBLL THUMBCODE [ {CONFIG} = 16 THUMBCODE SETL {TRUE} CODE32 // 我可不管你想使用ARM还是THUMB,开始时必须告诉编译器:你给我编译成ARM指令 | THUMBCODE SETL {FALSE} ] 2. 好吧,开始时必须是ARM指令,我想使用THUMB指令怎么办呢? bx跳转指令会改变CPU循指令状态:ARM转为THUMB或THUMB转为ARM。显然,使用bx前后的代码状态是不同的,必须使用CODE16或CODE32告诉编译器,下面是个例子: [ THUMBCODE ;for start-up code for Thumb mode orr lr,pc,#1 bx lr CODE16 // 下面的跳转指令“bl Main ”“b .”是THUMB指令 bl Main // 显然,Main函数也给被编译为THUMB指令,不过它是由别的手段控制的,CODE16只能管不了它 b . CODE32 // 为什么这里又是ARM指令了呢?因为这行往下的代码,是前面的启动代码调用的函数,它们是bx指令执行前调用的函数 ] 问题(2): b ChangeBigEndian ;DCD 0xea000007 andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00 streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea 这3条指令的意思都是“b ChangeBigEndian”,你看到后面的注释没?下面的的代码意思是这些指令的机器码,你可以发现它们是相似的,只是因为字节序、位宽不同而有些差别。 DCD 0xea000007 DCD 0x0007ea00 DCD 0x070000ea 至于这些数据为何如此,你自己查吧,我也不懂──用不到我就不去查资料。 我猜想,下面这两条怪异的指令是根据后面的机器码反汇编出来的,可不要被它们的名字欺骗了: andeq r14,r7,r0,lsl #20 ;DCD 0x0007ea00 streq r0,[r0,-r10,ror #1] ;DCD 0x070000ea 问题(3) DCD是伪指令,表示后面这个4字节的数据放在当前位置 问题(4) b EnterPWDN ; Must be @0x20. 这为什么必须在0x20处? CPU规定的吧,从字面看是CPU进入powerdown模式 |
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2181 浏览 6 评论
1983 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4541 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 21:38 , Processed in 0.602186 second(s), Total 80, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号