arm 汇编伪指令与位置相关代码

21 篇文章 0 订阅
14 篇文章 1 订阅

     arm汇编指令位置无关码

      位置相关和位置无关主要体现在程序运行时的地址和编译时指定的代码段的地址是否为同一地址

      编译环境:ADS1.2

      开发板:GEC210(s5pv210soc)

      程序运行方式:使用uboot的tftp下载bin文件到内存(0x30008000),然后运行

          汇编代码如下:

          ldr r3,=delay                     1
          ldr r3,delay                       2
          adr r3,delay                      3

         。。。。。

delay

        mov r2,#0xff00000

       .......

         end


       在ADS中设置入口地址为0x30008000(ARM linker选项中的RO base)


      在AXD中查看到反汇编代码如下

30008000    [0xe59f3040]   ldr      r3,0x30008048 ; = #0x30008038
30008004    [0xe59f302c]   ldr      r3,delay ; = #delay
30008008    [0xe28f3028]   add      r3,pc,#0x28 ; #0x30008038

。。。。

30008048    [0x30008038]   dcd      0x30008038  8..0
。。。。

      第一列30008000为地址,第二列的中括号中的数字表示相应的机器码,后面的为对应的arm指令。

     

     其中我们看到第一条指令,原指令写为ldr r3,=delay

     反汇编的指令变为ldr      r3,0x30008048

     相应的机器码为0xe59f3040

     我们看机器码的低12bits,其值为0x040。

     计算pc+0x40 = 0x30008000 + 8 + 0x40  = 0x30008048

     得到新的地址0x30008048,看看0x30008048地址的内容0x30008038

     0x30008038为delay标号的地址,从内存单元读取该值

     所以看的出ldr r3,=delay 是位置相关的指令(没看懂的接着往下看


    看看另外两条指令

    原指令ldr r3,delay

    反汇编指令ldr      r3,delay

    机器指令0xe59f302c

    保留机器指令的最低12bits为0x02c

    计算PC+0x02c = 0x30008004+8+0x02c = 0x30008038

    0x30008038为delay标号的地址,这个地址是与pc的值相加算出来的

    而前面那条指令的这个值是保存在某个单元,然后用指令读出来的。

    这个值(0x30008038)是算出来的与pc相关,是根据pc的值算出来的,而第一条指令的那个地址是读出来的,是个确定值,与pc无关。


    第三条指令  adr r3,delay

    反汇编 add      r3,pc,#0x28

    直接看的出r3的值与pc加上某个数得到的。


    以上指令可以看出来,与pc相关的值那么就是位置无关指令,与pc无关的代码就是位置有关的指令。


     未完,继续

      两种情况

      1.我把编译出来的bin文件下载到0x30008000这个位置,3条指令都能正确获取数据

       2.我把bin文件下载到 0x30001000(或者其他可用内存地址),那么第一条指令不能获取正确数据,2,3条可以获取正确数据。

      此时pc的值应该为0x30001000+8 = 0x30001008;

      第一条指令计算的地址为0x30001048,这个地址有一个数据0x30008038,指令想再间接访问0x30008038读取一个值出来时,明显会出错,实际也不是对应delay标号的地址,delay的地址应该为0x30001038

     后面的两条指令都可以计算得到值为0x30001038,就是delay实际的地址了。


      以上对位置相关和位置无关进行一个简单说明。如果还是不能理解可以使用ads或者keil之类的调试工具尝试。

     简单来说,位置无关就是不管你编译的时候指定的代码段起始地址在哪,而我随便下载到哪个内存空间,程序都能正常运行

    而位置有关代码,就是程序编译是指定代码段的位置,程序必须下载到指定位置才能正常运行的代码。


     备注:pc的值等于当前正在执行指令的地址+8





   














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大智兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值