Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以编写(x86)汇编语言来构建GCC和MSVC吗?_C_Gcc_Visual C++_Assembly_Nasm - Fatal编程技术网

我可以编写(x86)汇编语言来构建GCC和MSVC吗?

我可以编写(x86)汇编语言来构建GCC和MSVC吗?,c,gcc,visual-c++,assembly,nasm,C,Gcc,Visual C++,Assembly,Nasm,我有一个完全用C编写的项目。同样的C文件可以使用GCC for Linux或MSVC for Windows进行编译。出于性能原因,我需要将部分代码重新编写为x86汇编语言 是否可以将此汇编语言编写为使用GCC和MSVC工具链构建的源文件?或者,如果我为一个工具链编写一个部件源文件,是否有一个工具可以将其转换为另一个工具 或者,我是否被困在维护汇编源代码的两个副本,或者使用第三方汇编程序(如?我发现两个问题: masm和gas有不同的语法。gas可以配置为在.syntax Intel,nopr

我有一个完全用C编写的项目。同样的C文件可以使用GCC for Linux或MSVC for Windows进行编译。出于性能原因,我需要将部分代码重新编写为x86汇编语言

是否可以将此汇编语言编写为使用GCC和MSVC工具链构建的源文件?或者,如果我为一个工具链编写一个部件源文件,是否有一个工具可以将其转换为另一个工具

或者,我是否被困在维护汇编源代码的两个副本,或者使用第三方汇编程序(如?

我发现两个问题:

  • masm和gas有不同的语法。gas可以配置为在
    .syntax Intel,noprefix
    指令中使用英特尔语法,但即使如此,仍然存在微小差异(例如,不同的指令)。一种可能的方法是使用C预处理器对程序集源代码进行预处理,对两者不同的所有指令使用宏。这还具有提供统一注释语法的优点

    然而,仅仅使用像nasm这样的可移植的第三方汇编程序可能不那么麻烦

  • Linux和Windows有不同的调用约定。x86-32的一个可能解决方案是坚持一个受良好支持的调用约定,如
    stdcall
    。您可以告诉gcc在使用调用函数时使用什么调用约定。例如,这将声明
    foo
    以使用
    stdcall
    调用约定:

    extern int foo(int x, int y) __attribute__((stdcall));
    
    您可以在MSVC中使用
    \uu declspec
    执行相同的操作,从而解决此问题

    在x86-64上,类似的解决方案是可能的,但我不确定必须设置哪些属性

    当然,您也可以使用与第一个问题相同的cpp方法,根据您需要的调用约定生成稍微不同的函数序言和尾声。但是,这可能不太容易维护


你问这个问题是因为你失败了,还是因为你进行了调查,没有找到一个明确的答案?您是否意识到这两者之间调用约定的差异(如果有的话)?我们谈论的是32位还是64位汇编?是否为内联汇编?@RadLexus-我进行了调查,但尚未找到一种方法来创建与这两个工具链兼容的单一源文件。我将研究调用约定的差异。@FUZxxl目前为32位,但不久的将来可能为64位。在32位x86上,坚持默认的“cdecl”调用约定会更有意义,这在Windows上的Linux上是相同的。那么,您的建议是使用第三方汇编程序吗?其他项目(包含汇编语言并支持多个操作系统)通常就是这样解决这个问题的吗?@user200783主要是通过在给定的CPU不受支持或给定的汇编程序不可用时使用C代码来解决的。@user200783我的建议绝对是使用第三方汇编程序。然后,Ross Ridge所说的也适用,也就是说,提供了一个C语言的实现。这既用于测试,也用于将代码移植到其他体系结构时。