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

位置无关与位置相关

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值