【问题标题】:The -masm=intel flag is not working for running assembly language in gcc compiler with Intel syntax-masm=intel 标志不适用于在具有 Intel 语法的 gcc 编译器中运行汇编语言
【发布时间】:2019-01-15 12:12:45
【问题描述】:

我试图在我的 C 程序中使用内联汇编程序 __asm 与 Intel 语法而不是 AT&T 语法。我正在使用gcc -S -masm=intel test.c 进行编译 但它给出了错误。下面是我的 test.c 文件。

#include <stdio.h>
//using namespace std;
int AsmCode(int num,int power) {
    __asm {
        mov eax, num;
        mov ecx, power;
        shl eax, cl;
    };
}
int main()
{
    printf("eax value is %d\n",AsmCode(2,3));

    //getchar();
    return 0;



}

预期结果是 eax 值为 16,但出现了未知类型名称“mov”、未知类型名称“shl”等错误。

编辑: 我已将代码更新为:

int AsmCode(int num,int power) {
    __asm__ (
        "movl eax, num;"
        "mov ecx, power;"
        "shl eax, cl;"
    );
}
int main()
{
    printf("eax value is %d\n",AsmCode(2,3));
    return 0;
}

并使用gcc -S -masm=intel test.c 编译此代码。这导致 NO OUTPUT,而它应该产生输出为eax value is 16

使用gcc test.c 编译时会产生错误:

Error: too many memory references for 'mov'
Error: too many memory references for 'shl'

请帮忙..

【问题讨论】:

  • 请复制粘贴错误消息,而不是解释它们。
  • 总是阅读第一条错误信息

标签: c++ c c++11


【解决方案1】:

最重要的错误是第一个:

main.cpp:4:11: error: expected '(' before '{' token
     __asm {
           ^
           (

您对 GCC 使用了错误的语法。您已使用 Microsoft Visual Studio 语法。所以,你的 GCC 并不知道你正在尝试给它汇编指令。

应该是__asm__ ( "..." ),而不是__asm { ... }

像这样:

int AsmCode(int num,int power) {
    __asm__ (
        "mov eax, num;"
        "mov ecx, power;"
        "shl eax, cl;"
    );
}

阅读更多here

请注意,您应该单独询问 ASM 的其他问题。

【讨论】:

  • 您不能只在 GCC 语法中使用 numpower 等而不将它们声明为输入。你可能想指定clobbers。
  • 肯定还有其他问题。如果他们无法弄清楚这一点,我会让 OP 提出 ASM 问题。
  • 好的。将不工作的代码作为示例(没有表明它不应该工作)提供给已经苦苦挣扎的 OP 似乎令人困惑。
  • @DanM。也许吧,但我只是热衷于回答被问到的 C++ 问题,特别是因为我不了解 ASM。
  • @DanM。我知道我们不能直接使用 GCC 语法中的变量名而不声明它们,因为它们使用 AT&T 语法。但是masm= intel 应该使它们与 GCC 编译器兼容,就像它们与 Visual Studio 编译器一样
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 2017-07-24
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 2014-12-06
  • 2021-05-20
相关资源
最近更新 更多