您的位置 首页 发布

ARM指令ADR和LDR浅析

LDR指令本身是数据读取,将内存中的值载入到寄存器中,因为ARM的MOV指令不支持由内存直接向寄存器中传数。LDR指令的这个含意是比较容易理解…

LDR指令自身是数据读取,将内存中的值载入到寄存器中,由于ARM的MOV指令不支持由内存直接向寄存器中传数。LDR指令的这个意义是比较简单了解的。例如:

LDR R0, _START ;指将_START符号的内存方位的值载入到R0。
可是,ARM汇编器又为LDR赋予另一个伪指令意义:用于地址读取。这完全是两种不同的运用,但都是用LDR一共,所以很简单混杂。“用于地址读取”是指将用于一共“地址”的值写入到寄存器中,该寄存器中存储的便是地址,这十分类似于指针。LDR作为伪指令的用法是:在标号或当即数前面加上等号一共地址。例如:
LDR R0, =_START ;一共将_START标号地点的地址写入R0
LDR R0, =0x12345678 ;一共将0x12345678这个地址值写入R0
由于LDR自身既是指令又是伪指令,而比较难于了解的是伪指令LDR,所以在此先声明,本文以下只评论LDR伪指令,所称的LDR也仅仅作为伪指令运用的LDR,不要与LDR指令混杂。
当LDR作为伪指令运用时,就又引出了另一个近亲,ADR伪指令。
ADR和LDR都是用于读取地址的伪指令,都是把一个地址写入到一个寄存器中,都是类似于指针的效果,被写入的寄存器中的值将被用于寻址内存。
但ADR只能运用标号,不能运用当即数,也没有等号,它的典型用法是:
ADR R0, _START ;一共将_START标号地点的地址写入R0
但它们还有更实质的差异,ADR是读取相对地址,LDR是读取必定地址。有人会觉得这又有什么联系呢,横竖便是地址的不同一共办法呗。尽管是这样说,可是这晒干联系可大了。代码的存储方位都是在衔接的时分由衔接文件指定的,并且在运转时还可能会被到不同的方位。假如把一段代码里每个触及存储地址的当地都用相对首地址的偏移量来一共,例如_START+0x800,那么这段代码不管将来被到哪里,都能运转无误。可是假如每个地址都是写死的必定地址,例如 0x30008000,那么必须将这段代码到内存的该地址方位才干正确运转。所以,看起来相对地址比必定地址更灵敏。现实也的确如此,ADR由于更专注,所以编译出来的代码比LDR常常更有功率。
可是,好用是要有价值的,ADR的地址读取规模有限且很小,LDR则能够完成恣意地址值的读取。为什么会这样?还要从ADR和LDR之所以被称为伪指令谈起。伪指令便是由于它们并不是实践碑文的指令,而是汇编器要在汇编阶段将它们替换成可碑文的ARM指令。那么实践碑文的是什么指令呢?
LDR后边的地址规模假如未超出MOV的规模,会被汇编器替换成MOV指令,假如超出了MOV规模,则汇编器要为它再开个内存方位,叫内存池,专门存储这个值,由于内存能存储32位的值,从内存池中把这个值取出来给寄存器,就完成了恣意地址值的加载。内存池中的数在运转中不能变,写的是几便是几,所以内存池是LDR的优势,一起也是它的下风。再说一下为什么MOV会有规模约束,由于ARM指令是定长的,只能是32位,MOV指令字自身要占去几位,剩下的位数才干给有用数据运用,所以能存储在MOV指令码里的数据必定达不到32位,要想取32位数就只能用内存池。ARM指令阐明晒干有MOV具体的换算进程,不胪陈。
ADR伪指令能够在运转时读取相对方位。可是有规模约束,由于ADR要运用相对地址就要在运转中找出当时地址方位,对ADR伪指令,汇编器是经过运用加减法指令来替换的。遇到ADR,编译器会用一条ADD或SUB当时PC寄存器和一个常数来完成ADR伪指令的功用,这样就完成了运转时相对当时地址的读取。若不能用一条指令替换,则发生过错,编译失利。而这儿由于ADD和SUB又遇到了与MOV相同的规模问题,所以ADR不可能像LDR从内存池取数那样完成恣意32位地址的读取。确切的说,ADR的地址读取规模是:

当地址值是字节对齐时,其取指规模为: -255 ~ 255B;
当地址值是字对齐时,其取指规模为: -1020 ~ 1020B;

假如要完成大一点的跳转,能够运用ADRL伪指令,在汇编器编译源程序时,ADRL伪指令被替换成两条适宜的指令。若不能用两条指令完成,则发生过错,编译失利。

当地址值是字节对齐时,其取指规模为: -64K~64K;
当地址值是字对齐时,其取指规模为: -256K~256K;

以此类推,尽管ARM汇编器并没有供给能编译成三条适宜指令的ADR伪指令,可是幻想一下,假如能编译成三条,ADR读取的地址规模就会更大了。但那样功率又降低了,所以仍是不划算,ARM决断抛弃,真有那种需求,那就自己换算地址去写吧。汇编尽管很低层,还不满足低层。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/264002.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部