zoukankan      html  css  js  c++  java
  • 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]的值,不会改变,故称之为绝对取值;

  • 相关阅读:
    C/C++多文件之间的变量定义
    PKU POJ 2186 Popular Cows 强连通分量
    重载函数
    ZOJ 2763 Prison Break
    201357 训练赛总结
    hdu 4467 Graph 构造
    201356 训练赛总结
    201353 NEERC 2012, Eastern subregional contest
    2013512 CF 183 总结
    一道动态规划
  • 原文地址:https://www.cnblogs.com/snail-micheal/p/4462730.html
Copyright © 2011-2022 走看看