【问题标题】:In what cases would I want to use inline assembly code in C/C++ code [closed]在什么情况下我想在 C/C++ 代码中使用内联汇编代码 [关闭]
【发布时间】:2020-02-02 07:23:52
【问题描述】:

我刚刚读到汇编代码可以直接包含在 C/C++ 程序中,比如,

__asm statement
__asm {
statement-1
statement-2
...
statement-n
}

我只是想知道在什么情况下在 C/C++ 中包含汇编代码会有用。

【问题讨论】:

  • 简单,几乎无处。
  • 不要误会我的意思,但你为什么要这样做?它大大降低了可读性,而好的代码就是可读性。
  • 在过去,人类可以编写比某些编译器更快、更紧凑的程序集。因此,当编译器做得不好时,人类会求助于内联汇编来完成工作。如今,汇编代码非常先进(即复杂和令人费解),编译器非常好,很少有内联汇编的理由。
  • 在 x86 平台上可以有用的是 SSE/AVX/等。内部函数,其中大部分是一对一映射到指令,但与内联汇编不同,编译器实际上可以理解,并受到优化、其寄存器分配算法等的影响。
  • 如果它没有用,我认为首先不会提供此功能。我只想知道是否还有其他原因,例如提到的@user3386109。我还有一个问题是,现在任何 C++ 编译器是否都支持此功能,如果支持,是否只是为了支持遗留系统。

标签: c++ c assembly inline-assembly


【解决方案1】:

在 C/C++ 中使用汇编的最重要的地方(并且可能只有一个有意义的地方)是在嵌入式系统开发中,它是访问某些外围设备的唯一方法或需要这样做的地方因为无论编译标志是什么,我们都需要这个确切的指令顺序。最后一种情况最常出现在引导加载程序或关键操作系统部分(如上下文切换)中。

想到的例子是访问 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 代码中)。

【讨论】:

  • 那是 GNU C 内联汇编,您可以在其中编写输入/输出约束来告诉编译器哪些寄存器是输入和输出。 OP 正在询问 MSVC 内联汇编,这太糟糕了,以至于 MSVC 放弃了它以用于 x64(MSVC 中的实现很脆弱,语法效率低下)。可以这样做是因为它们具有您使用 GNU C 内联汇编的大多数东西的内在函数,甚至像 x86 cli / sti 这样的东西来禁用/启用内核代码中的中断。
猜你喜欢
  • 1970-01-01
  • 2015-03-17
  • 1970-01-01
  • 2016-12-22
  • 2014-06-21
  • 2010-12-12
  • 2021-07-18
  • 2018-06-16
  • 2021-08-16
相关资源
最近更新 更多