有一堆A7内核的ARM汇编代码,不是我自己写的,但需要理解。我确定为某个经常被调用的函数的一部分中包含指令 mrrc 15, 0, r2, r1, cr14
。从 ARMv7-A 和 ARMv7-R 的 ARM 架构参考手册中,我了解到它将 64 位值从协处理器 cr14
中的寄存器 p15
移动到核心寄存器 r2
和r1
,其中 r2
包含低 32 位,r1
包含高 32 位。此外,我发现 cr14
是只读物理计数寄存器,其中包含系统计数器的物理计数值,并且具有未知的重置值。
我找到的那个函数的完整代码是:(评论是我加的)
push {r2, r3, r4, lr}
mov r2, #0
mov r3, #0
mov r1, #0
str r1, [sp]
str r1, [sp, #4]
isb sy ; flush pipeline in processor
mrrc 15, 0, r2, r1, cr14 ; r2 = CNT_LO, r1 = CNT_HI
mov r3, r1 ; r3 = CNT_HI
ldr r0, [sp] ; r0 = 0
orr r0, r0, r3 ; r0 = CNT_HI
mov r4, #0 ; r4 = 0
mov r1, r4 ; r1 = 0
orr r4, r4, r2 ; r4 = CNT_LO
orr r0, r0, r1 ; r0 = CNT_HI
str r0, [sp, #4] ; [sp+4] = CNT_HI
str r4, [sp] ; [sp] = CNT_LO
ldrd r0, [sp] ; r0 = CNT_LO, r1 = CNT_HI
pop {r2, r3, r4, pc}
据我所知,我添加了注释的大部分代码几乎没有用,因为它只是将 r2
移动到 r0
对吗?
我的假设是该函数只是获取计数值,然后可以将其用于为其他函数计时或在等待循环中使用。我在代码中发现了函数被调用两次的其他部分,然后用 subs
和 sbcs
将两个 64 位值相减。这个假设有意义吗?