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

时间:2015-03-09 15:51:00

标签: assembly arm

我最近遇到了这些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启用中断。

2 个答案:

答案 0 :(得分:4)

那不是(只是)汇编程序,它是嵌入在C代码中的内联汇编程序。据推测,这段代码有一些上下文,或者你发现它的地方,应该提出这个建议。

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

这个内置函数在一些C代码的中间发出汇编程序(你已经识别过),并告诉编译器汇编程序做了什么:具体来说,使用或损坏了哪些寄存器。

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

  1. "=r" (Cs) - 变量Cs用作输出寄存器,在汇编代码中称为%0,并被覆盖
  2. "=r" (Cp) - 变量Cp用作输出寄存器,在汇编代码中称为%1,并被覆盖
  3. "r" (Cs) - Cs用作输入寄存器,在汇编代码中称为%2
  4. 请注意,%0/1/2只是输入/输出列表中条目的位置,从零开始。

答案 1 :(得分:0)

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