• ldr和adr的区别


    这几天看汇编,ldr和adr之间的区别老是给搞混,看了很多资料越看越晕,于是写了个测试程序反编译了一下一下子都清楚了,见下面:

    源码:

       adr r0, _start
       nop
       ldr r0, _start
       nop
       ldr r0, =_start
       nop

     _start:
       nop
       mov ip, lr

    反汇编之后的:

    8068: e28f0010 add r0, pc, #16
    806c: e1a00000 nop ; (mov r0, r0)
    8070: e59f0008 ldr r0, [pc, #8] ; 8080 <_start>
    8074: e1a00000 nop ; (mov r0, r0)
    8078: e59f0008 ldr r0, [pc, #8] ; 8088 <_start+0x8>
    807c: e1a00000 nop ; (mov r0, r0)

    00008080 <_start>:
    8080: e1a00000 nop ; (mov r0, r0)
    8084: e1a0c00e mov ip, lr
    8088: 00008080 .word 0x00008080

    通过反汇编之后的代码很容易就理解了:

    adr r0, _start;相对取址,r0中保存的是pc+16的地址:8088,这个是随着不同的链接而变;ps:这个是pc指针;

    ldr r0,_start和ldr r0,=_start;都是取值,前者取得start标号00008080处的值:e1a00000,相当于把这条指令给放进去了,执行下一条指令, (注释:e1a00000是反汇编之后的机器读取的指令),后者取得start标号本身的值:00008080,它存储在8088地址地方;

    因为adr r0, _start;r0中存在的是pc+16的pc指针地址,所以会随着pc不同而变化,故称之为相对取址;

    ldr r0,_start和ldr r0,=_start;r0中存在的都是[pc+8]的值,不会改变,故称之为绝对取值;

  • 相关阅读:
    iOS6和iOS7代码的适配(5)——popOver
    es5创建对象与继承
    js学习日记-new Object和Object.create到底干了啥
    js滚动及可视区域的相关的操作
    css匹配规则及性能
    normalize.css源码分析
    css的水平居中和垂直居中总结
    js快速排序算法
    数据结构flash演示
    二叉树遍历
  • 原文地址:https://www.cnblogs.com/snail-micheal/p/4462730.html
Copyright © 2020-2023  润新知