我最近遇到了这些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
启用中断。
答案 0 :(得分:4)
那不是(只是)汇编程序,它是嵌入在C代码中的内联汇编程序。据推测,这段代码有一些上下文,或者你发现它的地方,应该提出这个建议。
例如,请参阅GCC Extended Asm文档。
这个内置函数在一些C代码的中间发出汇编程序(你已经识别过),并告诉编译器汇编程序做了什么:具体来说,使用或损坏了哪些寄存器。
最后两行表示汇编程序中使用了哪些变量,以及它们如何影响
"=r" (Cs)
- 变量Cs
用作输出寄存器,在汇编代码中称为%0
,并被覆盖"=r" (Cp)
- 变量Cp
用作输出寄存器,在汇编代码中称为%1
,并被覆盖"r" (Cs)
- Cs用作输入寄存器,在汇编代码中称为%2
请注意,%0/1/2
只是输入/输出列表中条目的位置,从零开始。
答案 1 :(得分:0)
那些看起来像汇编程序指令。从您提供的代码中,您似乎正在尝试破译编译器发出的汇编语言。那些“指令”可能告诉编译器后端发出适合目标机器的操作码。这允许前端编译器保持相对简单,但允许编译器发出(和优化)特定目标的特定指令。