这些 ARM 汇编指令有什么作用?

What do these ARM assembly instructions do?

我最近看到了这些 ASM 指令,并试图弄清楚它们的作用。我浏览了几本 ARM 汇编书籍(例如 THIS),并且能够弄清楚几条指令的作用。

例如,MRS (Move to Register from Status) 将状态从 PSR (Program Status Register) 寄存器复制到 %0(我认为是寄存器 0)。

我无法理解 : "=r" (Cs) 和其他类似指令的作用。

UINT32 Cp;
if((Cp & 0x1) == 0)
{
   UINT32 Cs;
   __asm
   (
     " MRS %0, PSR\n"
     "BIC %1, %2, #0x80\n"
     "cpsie i"
           : "=r" (Cs), "=r" (Cp)
           : "r" (Cs)
   );
}

有人可以解释一下吗?

编辑 1:这是在 GlobalLock 释放函数中。 cpsie i 启用中断。

那些看起来像汇编指令。从您提供的代码来看,您似乎正在尝试破译编译器发出的汇编语言。那些 "instructions" 可能会告诉编译器后端发出适合目标机器的操作码。这允许前端编译器保持相对简单,但允许编译器为特定目标发出(和优化)特定指令。

那不是(只是)汇编器,它是嵌入到 C 代码中的内联汇编器。大概有一些关于这段代码的上下文,或者你找到它的地方,这应该暗示这一点。

例如,请参阅 GCC Extended Asm 文档。

此内置函数在某些 C 代码中间发出汇编程序(您已经确定),并告诉编译器汇编程序做了什么:具体来说,哪些寄存器被使用或损坏。

最后两行表示汇编器中使用了哪些变量,以及它们如何受到影响

  1. "=r" (Cs) - 变量Cs用作输出寄存器,在汇编代码中称为%0,并被覆盖
  2. "=r" (Cp)——变量Cp作为输出寄存器,在汇编代码中调用%1,被覆盖
  3. "r" (Cs) - Cs作为输入寄存器,在汇编代码中调用%2

注意 %0/1/2 只是条目在 input/output 列表中的位置,从零开始。