• adr adrl ldr mov总结整理


    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指令:
    例1: ldr r0, 0x12345678     // 就是把0x12345678这个地址中的值存放到r0中。而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。
    例2:ldr r0,r1                     //表示把r1寄存器中的值放入r0
    例3:ldr r0,[r1]                  // [r1]表示r1中值对应内存的地址,所以是把r1中的数当作一个地址,把这个地址中的值放入r0.
    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
    它们的目的是一样的,想把标签的地址给r0,区别是一个是相对地址,一个是绝对地址。目的一样,但是得到的结果不一定相同。结果是否相同,就要看这个PC的值,是否和链接地址相同了。PC值,以及链接地址,我想在下一篇博客中讨论~~
                                                                                                                                                                                                                                                                                             2015-11-3(增改)
                                                                                                                                                                                                                                                                                          ——宋桓公
  • 相关阅读:
    集合之Map和List线程安全问题
    vue直接赋值后数据不更新
    使用sysmon事件映射ATT&CK
    blackhat议题"通过RPC防火墙拦截横向渗透"
    大数据Hadoop之——新一代流式数据湖平台 Apache Hudi
    【云原生】MySQL on k8s 环境部署
    【云原生】Presto/Trino on k8s 环境部署
    【云原生】Flink on k8s 讲解与实战操作
    【云原生】Spark on k8s 讲解与实战操作
    【云原生】Elasticsearch + Kibana on k8s 讲解与实战操作
  • 原文地址:https://www.cnblogs.com/douzi2/p/4934237.html
Copyright © 2020-2023  润新知