您的位置 首页 方案

ARM汇编ADR,LDR等伪指令

arm中LDR伪指令与LDR加载指令LDR伪指令的形式是LDRRn,=expr。下面举一个例子来说明它的用法。COUNTEQU0x40003100……LDRR1

armLDR伪指令与LDR加载指令LDR伪指令的方式是“LDR Rn,=expr”。下面举一个比方来阐明它的用法。 COUNT EQU 0x40003100 …… LDR R1,=COUNT MOV R0,#0 STR R0,[R1] COUNT是咱们界说的一个变量,地址为0x40003100.这中界说办法在汇编语言中是很常见的,假如运用过单片机的话,应该都了解这种用法。 LDR R1,=COUNT是将COUNT这个变量的地址,也便是0x40003100放到R1中。 MOV R0,#0是将当即数0放到R0中。最终一句STR R0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实践便是将0放到地址为0x40003100的存储单元中去。可 见这三条指令是为了完结对变量COUNT赋值。用三条指令来完结对一个变量的赋值,看起来有点不太舒畅。这或许跟arm的选用RISC有关。 下面还有一个比方 ;将COUNT的值赋给R0 LDR R1,=COUNT LDR R0,[R1] LDR R1,=COUNT这条伪指令,是怎样完结将COUNT的地址赋给R1,有爱好的能够看它编译后的成果。这条指令实践上会编译成一条LDR指令和一条 DCD伪指令。

  请问ARM指令LDR和arm伪指令LDR有什么差异伪指令LDR{cond} register, ={expr|label-expr} expr为32为常量。编译器依据expr的取值状况来处理这条伪指令:1、当expr表明的地址没有超越mov或mvn指令中地址的取值规模时,编译器用适宜的mov指令或mvn指令替代该LDR伪指令。

  2、当expr表明的地址超越了mov或mvn指令中地址的取值规模时,编译器将该常数放在缓冲区中,一起用一条根据PC的LDR指令读取该常数。

  ……

  经过上面两种能够得出伪指令LDR和arm指令LDR的差异,详细运用时,能够不必考虑二者的差异,由编译器决议的,看源码时,你只需搞清楚它的功用就行。

  第一个便是把0xf830这个值放到r2中去,第二个和第三个的含义也是相同的。最终一条指令应该是过错的。

  由 于arm是risc精简指令集,指令都是32位的,在编码中操作码,方针和源寄存器是要占掉32位一部分,所以一条指令里边不或许存一个32位的当即数, 所以arm供给了一条伪指令来完结一条指令load一个32位的当即数。办法是在这条指令邻近放要load的值,再利用当时的pc+偏移load这个数, 留意ldr的本来的含义是将内存的某个值load到寄存器里边。

  比方:ldr r0, =0x5000010经过arm的assembler的翻译实践上便是:ldr r0,[pc+#0x4] ;指令是4byte 32位,便是将内存中下一个word放到r0中,0x5000010 这个当地放的是数值,这儿0x4是在它当即数的规模,详细的看看文档ads的pdf目录下有一个AssemblerGuide 。

arm指令中mov和ldr的差异arm是RISC结构,数据从内存到CPU(寄存器)之间的移动只能经过L/S指令来完结,也便是ldr/str指令。

  比方想把数据从内存中某处读取到寄存器中,只能运用ldr比方:ldr r0,0x12345678便是把0x12345678这个地址中的值存放到r0中。

  而mov不精干这个活,mov只能在寄存器之间移动数据,或许把当即数移动到寄存器中,这个和x86这种CISC架构的芯片差异最大的当地。

———————————————————————————————————————————————————-

  x86中没有ldr这种指令,由于x86的mov指令能够将数据从内存中移动到寄存器中。

  别的还有一个便是ldr伪指令,尽管ldr伪指令和arm的ldr指令很像,可是效果不太相同。ldr伪指令能够在当即数前加上=,以表明把一个地址写到某寄存器中,比方:ldr r0, =0x12345678这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较类似的。只不过mov指令约束了当即数的长度为8位,也便是不能超越512。而ldr伪指令没有这个约束。假如运用ldr伪指令时,后边跟的当即数没有超越8位,那么在实践汇编的时分该ldr伪指令是被转换为mov指令的。

  ldr伪指令和ldr指令不是一个同东西。

  LDR R1,=COUNT

MOV R0,#0

STR R0,[R1]

COUNT是咱们界说的一个变量,地址为0x40003100。这中界说办法在汇编语言中是很常见的,假如运用过单片机的话,应该都了解这种用法。

  LDR R1,=COUNT是将COUNT这个变量的地址,也便是0x40003100放到R1中。

  MOV R0,#0是将当即数0放到R0中。最终一句STR R0,[R1]是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实践便是将0放到地址为0x40003100的存储单元中去。可 见这三条指令是为了完结对变量COUNT赋值。用三条指令来完结对一个变量的赋值,看起来有点不太舒畅。这或许跟arm的选用RISC有关。

  arm伪指令之地址读取:ADR ADRL,小规模的地址读取ADR伪指令将根据PC相对偏移的地址值或根据寄存器相对偏移的地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条适宜的指令。一般,编译器用一条ADD指令或SUB指令来完成该ADR伪指令的功用,若不能用一条指令完成,则发生过错,编译失利。

  ADR伪指令格局:ADR{cond} register,expr地址表达式expr的取值规模:当地址值是字节对齐时,其取指规模为: +255 ~ 255B;当地址值是字对齐时,其取指规模为: -1020 ~ 1020B;2、ADRL伪指令——中等规模的地址读取ADRL伪指令将根据PC相对偏移的地址值或根据寄存器相对偏移的地址值读取到寄存器中,比ADR伪指令能够读取更大规模的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条适宜的指令。若不能用两条指令完成,则发生过错,编译失利。

  ADRL伪指令格局:ADRL{cond} register, expr地址表达式expr的取值规模:当地址值是字节对齐时,其取指规模为: -64K~64K;当地址值是字对齐时,其取指规模为: -256K~256K;3、LDR伪指令——大规模的地址读取LDR 伪指令用于加载32位的当即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译器替换成一条适宜的指令。若加载的常数未超出MOV或 MVN的规模,则运用MOV或MVN指令替代该LDR伪指令,不然汇编器将常量放入文字池,并运用一条程序相对偏移的LDR指令从文字池读出常量。

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部