您现在的位置: 主页 > 嵌入式开发入门到精通 > 单片机技术进阶 > S3C2440的汇编中常用的位置无关和位置相关指令 -
本文所属标签:
为本文创立个标签吧:

S3C2440的汇编中常用的位置无关和位置相关指令 -

来源: 网络用户发布,如有版权联系网管删除 2018-09-07 

[导读]看了一段时间的S3C2440的bootloader后,感觉在bootloder程序中经常会用到B,BL指令。他们是位置无关的代码,指令中所跳转的目标地址用基于当前PC的偏移量来表示,与链接时分配给地址标号的绝对地址值无关,因而代码可

看了一段时间的S3C2440的bootloader后,感觉

本文引用地址: http://www.21ic.com/app/mcu/201807/784097.htm

在bootloder程序中经常会用到B,BL指令。他们是位置无关的代码,指令中所跳转的目标地址用基于当前PC的偏移量来表示,与链接时分配给地址标号的绝对地址值无关,因而代码可以在任何位置进行跳转,实现位置无关性。

在bootloder也用到了位置无关的指令LDR(只对PC操作时才位置无关),例如LDRPC,=Main(程序跳转到SDRAM处执行);

S3c2440从NandFlash启动时,会将nandflash的前4KB的数据复制到s3c2440中的一个stepstoning中,而stepstoning在NandFlash启动时被映射到0地址处,所以s3c2440就能执行NandFlash的前4KB的程序了。在这4KB中执行的对应B和BL指令处的代码都会跳转到相对PC偏移量的地址。当然跳转的位置在这4KB内。

LDRPC,=Main,是绝对跳转。直接将Main标号所代表的地址直接复制给PC,那么程序就会跳到Main函数的入口地址处执行。Main标号的是基于链接器的值,换句话说就是基于ro-base或者所用的链接脚本文件(或者可以说是相对于ro-base的值,而相对跳转是相对于入口地址的值)。

使用绝对地址只能引用被重定位到特定位置的代码段中的符号,通过在位置无关代码中引入绝对地址,可以让程序跳转到指定位置。例如,假设Bootloader的阶段1将其自身代码拷贝到链接时所指定的SDRAM地址空间后,当要跳转到阶段2的C程序入口时,可以使用指令“LDRPC,=main”跳转到程序在SDRAM中的main函数入口地址开始执行。这是因为程序在编译链接时给main函数分派绝对地址,系统通过将main函数的绝对地址直接赋给PC实现程序跳转。如果使用相对跳转指令“Bmain”,那么只会跳转到启动ROM内部的main函数入口。




              查看评论 回复



嵌入式交流网主页 > 嵌入式开发入门到精通 > 单片机技术进阶 > S3C2440的汇编中常用的位置无关和位置相关指令 -
 

"S3C2440的汇编中常用的位置无关和位置相关指令 -"的相关文章

网站地图

围观()