S3C2440的汇编中常用的位置无关和位置相关指令
扫描二维码
随时随地手机看文章
看了一段时间的S3C2440的bootloader后,感觉
在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函数入口。