在什么情况下我想在 C/C++ 代码中使用内联汇编代码
In what cases would I want to use inline assembly code in C/C++ code
我刚刚读到汇编代码可以直接包含在 C/C++ 程序中,比如,
__asm statement
__asm {
statement-1
statement-2
...
statement-n
}
我只是想知道在什么情况下在 C/C++ 中包含汇编代码会有用。
C/C++ 中使用汇编的最重要的地方(可能只有一个有意义的地方)是在嵌入式系统开发中,它是访问某些外围设备的唯一方式,或者这样做是必需的,因为无论编译标志是什么,我们都需要这种精确的指令顺序。最后一种情况最常见于引导加载程序或关键 OS 部分,如上下文切换。
想到的例子是访问 MicroBlaze 处理器中的特殊寄存器:甚至 Xilinx recommends accessing those registers using assembly(据我所知也没有其他方法)因为没有其他方法.
将其嵌入到C中,可以这样使用:
unsigned long get_msr(void) {
unsigned long msr;
asm ("mfs %0, rmsr" : "=d" (msr)); // note: this is a gnu extention
return msr;
}
又如ARM提供的implementation for a context switch也使用了汇编(虽然在这种情况下没有嵌入到C代码中)
我刚刚读到汇编代码可以直接包含在 C/C++ 程序中,比如,
__asm statement
__asm {
statement-1
statement-2
...
statement-n
}
我只是想知道在什么情况下在 C/C++ 中包含汇编代码会有用。
C/C++ 中使用汇编的最重要的地方(可能只有一个有意义的地方)是在嵌入式系统开发中,它是访问某些外围设备的唯一方式,或者这样做是必需的,因为无论编译标志是什么,我们都需要这种精确的指令顺序。最后一种情况最常见于引导加载程序或关键 OS 部分,如上下文切换。
想到的例子是访问 MicroBlaze 处理器中的特殊寄存器:甚至 Xilinx recommends accessing those registers using assembly(据我所知也没有其他方法)因为没有其他方法.
将其嵌入到C中,可以这样使用:
unsigned long get_msr(void) {
unsigned long msr;
asm ("mfs %0, rmsr" : "=d" (msr)); // note: this is a gnu extention
return msr;
}
又如ARM提供的implementation for a context switch也使用了汇编(虽然在这种情况下没有嵌入到C代码中)