加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 运营中心 > 交互 > 正文

ARM汇编中LDR伪指令和LDR指令

发布时间:2016-10-30 02:16:17 所属栏目:交互 来源:站长网
导读:副标题#e# ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/s tr 指令。 比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如: ldr r0, 0x12345678 就是把 0x12345678这个地址中的值存放到r0中 。 而mov不能实现这个功能
副标题[/!--empirenews.page--] 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指令可以装载一个32bit立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x12345678这个立即数。而且如果这个立即数可以用mov指令的形式来表达,会被编译器实际用mov来代替比 如:
ldr r1,=0x10
会变成
mov r1,#0x10

        综述所述:ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。 
       ldr伪指令和ldr指令不是一个同东西。http://www.linuxso.com/linuxrumen/16306.html
  • adr adrl ldr mov总结整理

  • 2014-11-24 17:36 发表   系统分类:嵌入式系统   自定义分类:arm
    标签:arm

   ADR这是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。

    使用的格式:ADR register,exper。

    在编译源程序时,汇编器首先计算出当前PC值(当前指令位置)到exper的距离,然后会用一条ADD或者SUB指令来替换这条伪指令,例如:ADD register,PC,#offset_to_exper。

注意,标号exper与指令必须在同一代码段。

例子:adr     r0, _start  :将指定地址赋到r0中

      .........

_start: 
        b  _start

r0的值为 标号_start 与此指令的距离差 + PC值(当前指令位置)

ADRL:

    这是一条中等范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。

    使用的格式:ADRL register,exper。

    在编译源程序时,汇编器会用两条合适的指令来替换这条伪指令。

    例如:

             ADD register,PC,offset1

             ADD register,register,offset2 

    与ADR相比,它能读取更大范围的地址。

注意,标号exper与指令必须在同一代码段。

接下来是LDR,首先要说的是有两个家伙,他们都叫LDR。

一个是LDR伪指令,一个是LDR指令,名字相同却不是一个东西。

区分的方法就是看第二个参数,如果有等号,就是伪指令。

LDR指令:

例子: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。

LDR伪指令:

例1(立即数): ldr r0, =0x12345678

这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。

例2(标号): ldr     r0, =_start  :将指定标号的值赋给r0

这里取得的是标号 _start 的绝对地址,这个绝对地址(运行地址)是在链接的时候确定的。它要占用 2 个 32bit的空间,一条是指令,另一条是文字池中存放_start 的绝对地址。


这里对比一下,adr     r0, _start,和 ldr     r0, =_start

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读