关闭

ARM汇编的几个问题

1901人阅读 评论(0) 收藏 举报

转载时请注明出处和作者联系方式

作者联系方式:会飞的鱼 <parker30_liu at hotmail dot com>

最近在调试ARM硬件版的程序时遇到一些汇编代码,需要对其中的一些代码作些修改。其中有些ARM汇编代码的问题和技巧,将其记录在此,以备之后查找。

 

问题一:thumb模式下PC指针是如何计算预取值的

和其他现代的处理器一样,ARM处理器在指令执行时是要进行指令预取的,其向前预取了两条指令。在ARM模式下,PC指针的预取值是8(一条指令4个字节)。在thumb模式下,PC指针的预取值是否就是4(一条指令2个字节)呢,答案是不一定。将thumb模式下的adr伪指令生成的机器码反汇编后,发现若当前的指令是4字节对齐的地址时,PC指针的预取值是4,若当前的指令不是4字节对齐的地址,PC指针的预取值是2

下面的汇编码是一个获取自身入口地址的函数,其中mov r0, r0相当于nop操作。若标号1的地址是4字节对齐的,则adr r0, funcentry则会用指令add r0, pc, #-8替代。若标号1的地址不是4字节对齐的,则adr r0, funcentry则会用指令add r0, pc, #-6替代。

funcentry:

    mov r0, r0

    mov r0, r0

1:   adr r0, funcentry

    bx lr



 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:227598次
    • 积分:2620
    • 等级:
    • 排名:第14024名
    • 原创:29篇
    • 转载:10篇
    • 译文:0篇
    • 评论:63条
    文章分类
    最新评论
    龙芯软件开发
    友情链接