吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2997|回复: 22
收起左侧

[Android 原创] 如何动态调试来学习ARM汇编 2 r15(PC)寄存器

  [复制链接]
havenow 发表于 2021-3-17 18:37
本帖最后由 havenow 于 2021-3-18 22:35 编辑

看看PC寄存器(r15)在调试器中的表现形式。

下面的程序,在R0存储PC的地址,并且包含了两条随机的指令。看看究竟会发生什么。
        .text
        .globl        main
main:
        mov r0, pc
        mov r1, #2
        add r2, r1, r1
        bx lr

pc1

pc1


我们可以看到,PC里保持着下一条将被执行的指令 (mov r0, pc)的地址0xaaad43d8,现在执行mov r0, pc指令之后R0应该是0xaaad43d8吗?

pc2

pc2


看看R0中的地址。R0是0xaaad43e0。

下面有两个解释,感觉第二个更靠谱一点:
1、从这个地址我们可以看出,当我们直接读取PC时,它按照定义,PC指向下一条指令,但是当我们调试程序时,PC却指向当前PC值的下面两条指令的地址处(0xaaad43d8+8=0xaaad43e0)。这是因为,老款的ARM处理器总是获取当前已经执行的指令的后两条指令的地址。ARM保留着这个定义的原因是为了保证和早期处理器的兼容性。

2、产生这种差异的原因其实很简单,调试器显示的PC寄存器的值是经过处理的。当0xaaad43d8处的指令被执行时,PC寄存器已经指向了0xaaad43d8+0x8处的指令,这是由于CPU的流水线机制导致的。CPU取指令,解码指令和执行指令时使用的是不同的硬件部件,因此,这几个操作(实际的CPU可能更复杂,有更多的操作步骤)是可以并行执行的。因为RISC CPU的指令长度一定,所以CPU可以在解码指令之前就知道下一条指令的长度,从而在解码指令时取下一条指令,在执行指令时,对下一条指令进行解码,并取下下一条指令,这称为三级流水线。所以ARM当我们在执行0xaaad43d8处的指令时,PC已经指向0xaaad43d8+0x8处进行取指令操作了。这是硬件中真实发生的情况,而调试器为了令展示更有逻辑性,所以PC寄存器显示了当前执行指令的地址,当我们真实调试时不要受此影响。

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
qtfreet00 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Pwqi + 1 + 1 我很赞同!
zjun777 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| havenow 发表于 2021-3-19 09:15
花好s月圆 发表于 2021-3-19 06:23
这用的什么调试工具?  不是OD呀。

用的gdb,在安卓上面的远程调试
nmy124 发表于 2021-3-17 21:54
sjzdevin 发表于 2021-3-17 22:59
zc-mstudio 发表于 2021-3-17 23:10
谢谢,很好👍👍
多馀. 发表于 2021-3-17 23:20
厉害啊   有学到了 嘿嘿
烈焰乌龙茶 发表于 2021-3-17 23:30
学到了,大佬牛啊
执手摘星辰 发表于 2021-3-17 23:34
学到了,谢谢大佬
zjhcr 发表于 2021-3-18 00:47
好难啊,我还看不明白呢
yqjys123 发表于 2021-3-18 07:00
谢谢老师的分享,我要好好思考,努力学习。
雅贼 发表于 2021-3-18 08:10
受教了……感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表