【问题标题】:What Cpp compiler allows inline assembler code? [duplicate]什么 Cpp 编译器允许内联汇编代码? [复制]
【发布时间】:2019-08-24 13:40:34
【问题描述】:

几年前,我编写了一些重要的 Cpp 代码,这些代码通过切换到汇编语言的编码命令访问硬件寄存器。我丢失了编译器和计算机。请告诉我一个允许在 Cpp 代码中间进行内联汇编的 Cpp 编译器。英特尔处理器,Windows。谢谢。

看来我的问题不够清晰。我很抱歉。给出的答案是对代码的复习。做得好。今天给出的答案表明 C++ 编译器可能没有针对 64 位汇编器进行更新。这是一个更清晰的问题,只是部分回答了。它需要更新的响应。

我正在考虑购买一台 Intel i7 台式电脑。我将为 i/o 和设置编写 C++ 代码。内部循环将用汇编语言编写,以利用硬件寄存器乘法和除法:单独寄存器中的两个被乘数给出双寄存器乘积。我多年前的经验是,并非所有的 C++ 编译器都是一样的。市面上众多品牌的 C++ 软件中,哪一个提供了与汇编程序、__asm 的良好链接,并充分利用了 64 位机器?

我觉得这个问题还没有被问到。到目前为止,感谢您提供的出色答案。

【问题讨论】:

  • 肯定是 Gcc 和 Clang。
  • MSVC 也支持这一点。
  • 我很确定大多数编译器都会这样做。请阅读某些编译器的文档以了解如何执行此操作。大多数编译器使用asm 关键字。
  • 引用的答案解释了各种编译器的语法问题。我评论的答案直接解决了最近编译器版本的兼容性和功能。由于我的第一个问题含糊不清,请您删除重复的问题指示符。谢谢。

标签: c++ assembly


【解决方案1】:

我曾经使用 Microsoft Visual Studio 编写内联汇编,像这样:

// --- Get current frame pointer
ADDR  oriFramePtr = 0;
_asm mov DWORD PTR [oriFramePtr], ebp

很遗憾,这只适用于32位,因为当时微软的64位编译器不支持内联汇编(最近没查)。

【讨论】:

  • 64 位 Microsoft C/C++ 编译器不支持内联汇编,将来也不支持。您可以将 Intel 的 C/C++ 编译器安装到 VS 环境中,它确实支持 MS 的内联汇编,也支持 GCC 的内联汇编语法。
  • 这个答案直接回答了Patrick这个问题。我将购买计算机并使用英特尔 C/C++ 编译器。当我当时使用基于 Unix 的操作系统和 GCC 编译器时,我想。在新机器上使用 Windows,我将保留 GCC 和 Clang 作为备份。
  • 请原谅我对网站缺乏经验。帕特里克的回答很有用。 Michael Petch 的回答直接而完整地回答了我的问题。不幸的是,迈克尔写了一条评论,而不是我可以检查的答案。
【解决方案2】:

默认情况下,C++ 提供了asm 关键字用于编写程序集(由我加粗):

7.4 asm 声明 [dcl.asm]
1 asm 声明的格式为
asm-definition:
asm ( string-literal ) ;
asm 声明是有条件支持的; 其含义是实现定义的。 [注意:通常它用于通过实现将信息传递给汇编程序。 ——尾注]

GCC appears to support asm基于asm上面的文章,但是我找不到任何东西besides its support in C

MSVC does support assembly,但不是通过 asm 关键字;必须使用__asm:

__asm 关键字调用内联汇编器,可以出现在 C 或 C++ 语句合法的任何地方。

Visual C++ 对标准 C++ asm 关键字的支持仅限于编译器不会在关键字上生成错误这一事实。但是,asm 块不会生成任何有意义的代码。使用__asm 而不是asm

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2011-01-25
  • 2019-05-11
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多