美文网首页
伪指令LDR和ADR的分析

伪指令LDR和ADR的分析

作者: 我非鱼丶 | 来源:发表于2020-04-19 11:51 被阅读0次

    Q:为什么要进行分析?


    A:伪指令在arm汇编中占有非常重要的地位,通常可以帮助我们在进行汇编编程的时候简化编程难度,因为一条伪指令可以实现多条普通汇编指令一同实现的效果。

    Q:是什么?


    A:ADR的定义是---小范围的地址读取伪指令,ADR指令将基于PC相对偏移的地址值读取到寄存器中,在编译源程序时ADR伪指令被编译器 替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,刚产生错误。拆解开看就是:

    1.将基于PC的地址的偏移量拿出来,存入指定寄存器

    2.在真实场景下(逆向时),我们只能看到add或sub等多条指令来代替这个指令

    ADR家族的指令(包括ADR、ADRL)跳转范围是距离自己0-4k和0-64k大小的地址,因为指令长度是有限的,数据太大意味着数据在指令中占的长度会很长,指令就写不下了,因此跳转范围受到了限制,反推去看也能知道,在真实环境中被转成的add和sub指令也是受到指令长度限制的~~~~


    LDR的定义为:大范围地址读取伪指令,LDR伪指令用于加载32们的立即数或一个地址值到指定寄存器。在汇编编译源程序时,LDR伪指令被编译 器替换成一条合适的指令。若加载的常数未超出MOV或者MVN的范围,刚使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入字池,并使用一 条程序相对偏移的LDR指令从文字池读出常量。拆解开看就是:

    1.用于加载32位的立即数或一个地址值到指定寄存器

    2.优先使用MOVMVN指令代替该指令

    同样可能是跳转,这里跳转的范围巨大,0-4g,毕竟是立即数,32位寻址范围多大它就多大,完全没有指令长度限制数字大小的问题。

    相关文章

      网友评论

          本文标题:伪指令LDR和ADR的分析

          本文链接:https://www.haomeiwen.com/subject/zlrubhtx.html