代码的加载地址与运行地址
来源:互联网 发布:the eye infinite 知乎 编辑:程序博客网 时间:2024/05/17 01:49
下面内容是技术讨论群里的读者的提问:
问:
程序下载到NOR中,在ADS中加载地址却是0x30000000,是SDRAM的地址,难道是调试器自动搬运的?
答:
一个地址是加载 地址一个是运行地址不一样的
你下载到Nor里,是加载地址,ADS里ROBase设置的是运行地址
你下载到Nor里,是加载地址,ADS里ROBase设置的是运行地址
问:
奥
加载地址是从0开始的吧
加载地址是从0开始的吧
答:
Yes
问:
是谁将其复制到RAM中的啊?
ARM核吗?
ARM核吗?
答:
你所谓的复制是什么意思?
你的代码不复制,没有人会帮忙的
你的代码不复制,没有人会帮忙的
问:
NOR里的代码可以直接运行的啊
答:
是啊
ARM上电就从0开始执行
所以直接运行啊
ARM上电就从0开始执行
所以直接运行啊
问:
那那个0x30000000起什么作用?
我要是写成0.。。
我要是写成0.。。
答:
那是运行地址,意思是说,代码将来要运行在以这个地址为基地的空间里
所以,运行地址和加载地址可以不一样
所以,运行地址和加载地址不一样的地方,只能用相对跳转
所以,运行地址和加载地址不一样的地方,只能用相对跳转
问:
我可不可以这样理解,不超过NOR的容量的代码,那个运行地址意义不大.
答:
你对运行地址和加载地址的概念理解的不深刻
问:
问:
是的
答:
我们的C和汇编要编译成二进制对吧
编译器会把C代码和汇编在链接的时候要给定每一条指令,变量,函数的地址
编译器会把C代码和汇编在链接的时候要给定每一条指令,变量,函数的地址
问:
是的
答:
那这个地址是固定的
这个地址的基址就是运行地址
也就是说,代码在运行的时候,都是在运行地址空间里运行的
但是,通常在嵌入式设备里
这个地址的基址就是运行地址
也就是说,代码在运行的时候,都是在运行地址空间里运行的
但是,通常在嵌入式设备里
内存是需要先初始化的,没有初始化不能使用,代码也就不能运行在里面,而我们编译的二进制文件又是烧写到了Nor之类的ROM里
这样,所以我们要将代码从NOR里搬运到SDRAM里
保证正常运行
所以我们只能将代码的运行地址设置为SDRAM里的一个地址
这样,所以我们要将代码从NOR里搬运到SDRAM里
保证正常运行
所以我们只能将代码的运行地址设置为SDRAM里的一个地址
而烧写的时候的地址,是加载地址
问:
运行地址是作为参数给编译器是这样吧?
答:
只要你保证在NOR里,没有绝对地址跳转就可能运行
但是并不是所有的代码都使用相对跳转的
所以,这也必须要求你的代码搬运到SDRAM里
上面 你说的很对
但是并不是所有的代码都使用相对跳转的
所以,这也必须要求你的代码搬运到SDRAM里
上面 你说的很对
问:
嗯,谢谢
答:
因为编译器要知道地址后,在你的运行地址基础上编址
你可以将运行地址设置为0x30000000
然后将其在ADS里右键反汇编,看看其指令的地址就知道了
你可以将运行地址设置为0x30000000
然后将其在ADS里右键反汇编,看看其指令的地址就知道了
问:
好的
答:
然后你再将运行地址设置为0x0
再反汇编,对比一下,你就理解了
这个理解了,你也就理解了,什么是PIC代码了
你自己去调查一下吧
再反汇编,对比一下,你就理解了
这个理解了,你也就理解了,什么是PIC代码了
你自己去调查一下吧
- 代码的加载地址与运行地址
- 代码的加载地址与运行地址
- 加载地址与运行地址
- 《C编译原理》程序的加载地址与运行地址
- 加载地址、运行地址
- 运行地址和加载地址
- 运行地址和加载地址
- 运行地址和加载地址
- 运行地址和加载地址
- 运行地址和加载地址
- 运行地址和加载地址
- 运行地址和加载地址
- 运行地址和加载地址
- 运行地址和加载地址
- 运行地址和加载地址
- 加载地址和运行地址
- 运行地址和加载地址
- 运行地址和加载地址
- tomcat解压缩版如何启动
- JavaScript中Float类型保留两位小数
- 【转】“黑客与画家‘——计算机科学、画家与黑客
- 文艺小码农的Android行~~
- Html之图片
- 代码的加载地址与运行地址
- Css调试代码
- 嵌入式开发群QQ群
- Linux stat函数讲解
- 进入LINUX后显示-bash-3.2的解决办法
- 阻止远程访问SQLSERVER2000(可以用做Windows防火墙设置)
- Huffman(哈夫曼)树编码与解码程序(全)
- Fiddler
- Android--入门---10---(progressDialog)