这些 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 代码中间发出汇编程序(您已经确定),并告诉编译器汇编程序做了什么:具体来说,哪些寄存器被使用或损坏。
最后两行表示汇编器中使用了哪些变量,以及它们如何受到影响
"=r" (Cs)
- 变量Cs
用作输出寄存器,在汇编代码中称为%0
,并被覆盖
"=r" (Cp)
——变量Cp
作为输出寄存器,在汇编代码中调用%1
,被覆盖
"r" (Cs)
- Cs作为输入寄存器,在汇编代码中调用%2
注意 %0/1/2
只是条目在 input/output 列表中的位置,从零开始。
我最近看到了这些 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 代码中间发出汇编程序(您已经确定),并告诉编译器汇编程序做了什么:具体来说,哪些寄存器被使用或损坏。
最后两行表示汇编器中使用了哪些变量,以及它们如何受到影响
"=r" (Cs)
- 变量Cs
用作输出寄存器,在汇编代码中称为%0
,并被覆盖"=r" (Cp)
——变量Cp
作为输出寄存器,在汇编代码中调用%1
,被覆盖"r" (Cs)
- Cs作为输入寄存器,在汇编代码中调用%2
注意 %0/1/2
只是条目在 input/output 列表中的位置,从零开始。