ARM mrrc 指令

时间:2021-07-12 13:08:17

标签: arm

有一堆A7内核的ARM汇编代码,不是我自己写的,但需要理解。我确定为某个经常被调用的函数的一部分中包含指令 mrrc 15, 0, r2, r1, cr14。从 ARMv7-A 和 ARMv7-R 的 ARM 架构参考手册中,我了解到它将 64 位值从协处理器 cr14 中的寄存器 p15 移动到核心寄存器 r2r1,其中 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 对吗?

我的假设是该函数只是获取计数值,然后可以将其用于为其他函数计时或在等待循环中使用。我在代码中发现了函数被调用两次的其他部分,然后用 subssbcs 将两个 64 位值相减。这个假设有意义吗?

0 个答案:

没有答案