【问题标题】:Understanding this part arm assembly code了解这部分手臂装配代码
【发布时间】:2014-03-14 04:36:45
【问题描述】:
.syntax unified
.thumb

.cpu cortex-m4
.arch armv7e-m
.fpu fpv4-sp-d16

/* Changes from unprivileged to privileged mode. */
.thumb_func
.section    .kernel
.global     raise_privilege
.type       raise_privilege, %function
raise_privilege:
mrs     r0, control
bic     r0, r0, #1
msr     control, r0
dsb
isb
bx      lr

这是 arm 汇编代码的一部分。我可以查看芯片手册以了解说明的含义。但我不知道如何弄清楚像.thumb_func 这样的汇编指令的行为。更重要的是,我也不知道如何使用这部分代码,它看起来不像常规函数。所以我不知道如何“调用”它。

【问题讨论】:

  • 伪操作可能与弄清楚代码的作用无关。请参阅contrl register,它不是 ARM,而是 cortex-M 特定的。拇指互联可能不太有用,unified 对于 cortex-M 也不是很有用。

标签: assembly arm gnu-assembler cortex-m


【解决方案1】:
  • . 开头的指令 是真正的汇编指令。您可以在GAS: ARM machine directives 中查找它们
  • .syntax unified 表示使用统一的 ARM/Thumb 汇编语法。 herehere 解释了这个概念。
  • .thumb_func 表示启动 ARM-Thumb 互通的 Thumb 模式功能。 herehere 解释了这个概念。
  • raise_privilege 在我看来就像 C 中的 void raise_privilege(void) 叶函数(即它不调用其他函数)。调用它:
bl raise_privilege

【讨论】:

    【解决方案2】:

    gnu 汇编器坏了,愚蠢,笨拙,选择你的词...

    在这种情况下 .thumb_func 加上一个标签是您调用该标签所需的全部内容,thumb_func 告诉汇编器以下标签是我可能想要调用或加载地址并使用 bx 的东西。

    所以在这段代码或其他代码中你可以简单地

    bl raise_priviliedge 
    

    (如果 bl 可以到达和/或链接器添加了蹦床)。或者你可以

    ldr rX,=raise_priviledge  
    blx rX 
    

    其中 rX 是一些通用寄存器(例如 r3)。

    【讨论】: