ARM指令定址问题
来源:互联网 发布:程序员转行金融 编辑:程序博客网 时间:2024/05/22 02:19
AREA BOOTCODE, CODE, READONLY
ENTRY
BootloAd
LDR r0, =0x00
LDR r1, =0x00
LDR r2, =0x00
LDR r3, =0x00
END
1)在ARM程序里,如何指定指令在ROM中存放的位置(类似单片机的ORG伪指令)
我想不管哪款ARM芯片,肯定都有上电复位地址,也就是上电后PC指向的位置。比如某款ARM芯片复位地址为0x00000000,复位后我希望执行的第一条指令是LDR R0, =0x00。那么在程序里我们怎么指定将该条指令放在ROM的0x00位置呢?
2)ENTRY伪指令的作用
ENTRY伪指令是程序的入口,一个程序只能有一个ENTRY,在生成ELF格式的IMAGE文件时,它能够告诉仿真器从哪条指令开始执行程序,但是在生成BIN文件时,它又有什么用呢??我们希望将ENTRY下面的那条指令烧录到ARM芯片的上电复位地址处,每款芯片的复位地址都可能不同,ADS如何能通过ENTRY就知道实际芯片的复位地址在哪里?
3)ARM LINKER配置时RO BASE的作用
我在ARM LINKER的配置页里将RO BASE设置为0x3000,通过用AXD装载生成的AXF文件仿真,观察发现,LDR r0, =0x00这条指令被放在存储器的0x3000位置,这似乎说明通过设置RO BASE可以设置程序在ROM中的起始位置。但我看同时生成的BIN文件,只有16个字节,那如果用烧录器烧芯片时,烧录器如何知道BIN文件的第一个字节要放在ROM的0x3000位置呢?(不通过填写烧录软件里的烧录起始地址为0x3000)
ENTRY
BootloAd
LDR r0, =0x00
LDR r1, =0x00
LDR r2, =0x00
LDR r3, =0x00
END
1)在ARM程序里,如何指定指令在ROM中存放的位置(类似单片机的ORG伪指令)
我想不管哪款ARM芯片,肯定都有上电复位地址,也就是上电后PC指向的位置。比如某款ARM芯片复位地址为0x00000000,复位后我希望执行的第一条指令是LDR R0, =0x00。那么在程序里我们怎么指定将该条指令放在ROM的0x00位置呢?
2)ENTRY伪指令的作用
ENTRY伪指令是程序的入口,一个程序只能有一个ENTRY,在生成ELF格式的IMAGE文件时,它能够告诉仿真器从哪条指令开始执行程序,但是在生成BIN文件时,它又有什么用呢??我们希望将ENTRY下面的那条指令烧录到ARM芯片的上电复位地址处,每款芯片的复位地址都可能不同,ADS如何能通过ENTRY就知道实际芯片的复位地址在哪里?
3)ARM LINKER配置时RO BASE的作用
我在ARM LINKER的配置页里将RO BASE设置为0x3000,通过用AXD装载生成的AXF文件仿真,观察发现,LDR r0, =0x00这条指令被放在存储器的0x3000位置,这似乎说明通过设置RO BASE可以设置程序在ROM中的起始位置。但我看同时生成的BIN文件,只有16个字节,那如果用烧录器烧芯片时,烧录器如何知道BIN文件的第一个字节要放在ROM的0x3000位置呢?(不通过填写烧录软件里的烧录起始地址为0x3000)
VECTORS。S是在ADS中设定的: vector.s中"section"=STARTUP为首运行。
类似的。复位后是中断向量表。第一个是复位向量,在那里
放一个跳转。(一般才几个字节大小,只能放跳转了)
跳转到 :
1。初始化的代码处。InitStAck 初始化堆栈。。。
2。C 的 _MAIN 地址,运行 MAIN()
类似的。复位后是中断向量表。第一个是复位向量,在那里
放一个跳转。(一般才几个字节大小,只能放跳转了)
跳转到 :
1。初始化的代码处。InitStAck 初始化堆栈。。。
2。C 的 _MAIN 地址,运行 MAIN()
vector.s应该是自己写的ARM汇编,不是每个项目都会有vector.s文件的吧?
另外,就算在section指定了STARTUP为首运行,怎么将该条指令和硬件的复位地址对上呢?
另外,就算在section指定了STARTUP为首运行,怎么将该条指令和硬件的复位地址对上呢?
是这样的:
CODE32
AREA StArtup,CODE,READONLY
ENTRY
;//中断向量表每个宽 4个字节。只能放一条32位的ARM指令。
Vectors ;BASE+0
LDR PC, ResetAddr ;复位的第一条。跳到标号;ResetAddr
LDR PC, UndefinedAddr ;32位的ARM指令。 BASE+1
LDR PC, SWI_Addr ;32位的ARM指令。 BASE+2
LDR PC, PrefetchAddr
LDR PC, DAtAAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
...
ResetAddr:
BL InitStAck
B _MAIN
跳转到 :
1。初始化的代码处。InitStAck 初始化堆栈。。。
2。C 的 _MAIN 地址,运行 MAIN()
CODE32
AREA StArtup,CODE,READONLY
ENTRY
;//中断向量表每个宽 4个字节。只能放一条32位的ARM指令。
Vectors ;BASE+0
LDR PC, ResetAddr ;复位的第一条。跳到标号;ResetAddr
LDR PC, UndefinedAddr ;32位的ARM指令。 BASE+1
LDR PC, SWI_Addr ;32位的ARM指令。 BASE+2
LDR PC, PrefetchAddr
LDR PC, DAtAAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
...
ResetAddr:
BL InitStAck
B _MAIN
跳转到 :
1。初始化的代码处。InitStAck 初始化堆栈。。。
2。C 的 _MAIN 地址,运行 MAIN()
假设我的工程中 vector.s是初始化文件。
其主要内容为:
CODE32
AREA StArtup,CODE,READONLY
ENTRY
;//中断向量表每个宽 4个字节。只能放一条32位的ARM指令。
Vectors ;BASE+0
LDR PC, ResetAddr ;复位的第一条。跳到标号;ResetAddr
LDR PC, UndefinedAddr ;32位的ARM指令。 BASE+1
LDR PC, SWI_Addr ;32位的ARM指令。 BASE+2
LDR PC, PrefetchAddr
LDR PC, DAtAAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
...
ResetAddr:
BL InitStAck
B _MAIN
;=======================================
所以需要在ADS中设定
object/symbol: vector.o ,"section"=STARTUP为首运行。
;=======================================
上电复位后,程序从entry处进入。
则第一条指令就是: LDR PC, ResetAddr
那么PC指针跳转到ReseAddr标号处。
你可以在这里实现初始化功能。
其主要内容为:
CODE32
AREA StArtup,CODE,READONLY
ENTRY
;//中断向量表每个宽 4个字节。只能放一条32位的ARM指令。
Vectors ;BASE+0
LDR PC, ResetAddr ;复位的第一条。跳到标号;ResetAddr
LDR PC, UndefinedAddr ;32位的ARM指令。 BASE+1
LDR PC, SWI_Addr ;32位的ARM指令。 BASE+2
LDR PC, PrefetchAddr
LDR PC, DAtAAbortAddr
DCD 0xb9205f80
LDR PC,[PC, #-0xff0]
LDR PC,FIQ_Addr
...
ResetAddr:
BL InitStAck
B _MAIN
;=======================================
所以需要在ADS中设定
object/symbol: vector.o ,"section"=STARTUP为首运行。
;=======================================
上电复位后,程序从entry处进入。
则第一条指令就是: LDR PC, ResetAddr
那么PC指针跳转到ReseAddr标号处。
你可以在这里实现初始化功能。
答6:
竟然不能重编辑。。。今晚刚看了44b0 的 bootloAder程序。
有不对的地方希望各位指正。
有不对的地方希望各位指正。
- ARM指令定址问题
- ARM指令定址问题
- ARM数据处理指令中的立即数问题
- arm指令
- ARM指令
- arm 指令
- ARM指令
- arm指令
- arm指令
- arm指令
- ARM指令
- ARM 指令
- ARM 指令
- ARM指令
- arm 指令
- ARM指令
- ARM-指令
- arm指令
- 使用Oracle Wrap工具加密你的代码
- bootloader分析
- Redtucher Start
- 逐渐挖掘Varargs
- 一些有用的正则表达式收集
- ARM指令定址问题
- MiniGUI的多图层技术
- jQuery - Selectors选择器 - checked选中
- 2007广东北电笔试题目
- s3c2410汇编启动代码与中断跳转分析
- 让c语言和c++中的“a++,++a”永远不是问题
- 网页对话框使用
- 周杰伦新女友现身
- 主题