【问题标题】:What is the MSVC __asm keyword for GCC?GCC 的 MSVC __asm 关键字是什么?
【发布时间】:2019-02-22 19:16:18
【问题描述】:

我在 C 程序中用 asm 编写代码,但我误读了 __asm{...} 是我需要这样做的。后来我发现 __asm 用于 MSVC 编译器,而不是 GCC。 MSVC 的 __asm 关键字在 C 中的等价物是什么?我编写的代码中有标签和循环,不知道 __asm 关键字用于 GCC 的语法是什么。

我的代码正在执行(或尝试执行)古老的乘法方法。

int p = 0;
int b = 10;
int a  = 5;
/*
while(b!= 0){
    if(b%2 != 0) p+=a;
    a+=a;
    b/=2;
}
printf("%i\n",p);
*/



__asm{
    mov p, 0
    mov edx, p
    mov ebx, a
    mov ax,b
    jmp checkend

notEven:
    add edx, ebx
    mov edx, a  


checkend:
    cmp b, 0
    je endok


    test ax, 1
    jnz notEven

    add ebx, ebx
    mov a, ebx
    mov dx, 0
    mov ax, b
    mov bx, 2
    div bx
    mov b,ax
}
printf("%i\n",p);
return 0;
}

【问题讨论】:

  • __asm 既不是 C++ 也不是 C。它是编译器特定的关键字(不是函数)。没有包含内联汇编代码的标准方法。你用的是哪个编译器?
  • __asm 是 C 和 C++ 的 MSVC 关键字,但它仅对 x86-32 项目有效。 GCC 对内联汇编有不同的语法。我相信你可以找到更多的文档here
  • 感谢您的澄清!我正在使用 GCC。
  • 我个人的建议是放弃内联汇编,而将汇编代码放在普通的汇编文件中。内联汇编很难正确处理,并且会导致各种你不想处理的奇怪问题,尤其是如果你是初学者。

标签: c gcc assembly inline-assembly


【解决方案1】:

C++ 的__asm 函数在 C 中的等价物是什么?

C 对内联汇编没有标准规定,因此这取决于您的实现。该标准将asm 关键字记录为通用扩展,但这是否可用以及它的语义可能取决于您的C 实现。

由于您已标记 GCC,因此您需要咨询 GCC's documentation on inline assembly。 GCC 确实为此使用了 asm 关键字。最简单的用法采用这种形式:

asm ( AssemblerInstructions ... );

【讨论】:

  • 应该注意的是,GCC 基本汇编在这里是不够的,除非你想违反 GCC 文档中的警告并运行未定义的行为。对于 OP 提供的代码,您必须使用 GCC 的扩展内联汇编。或者(并且更容易理解)是将汇编代码放在一个单独的汇编对象中并从 C 调用它。 (然后您需要处理调用约定,而不是担心 GCC 内联汇编的细微差别,这可能非常麻烦和挑剔。
  • 我也是 C 的新手。如何从 C 中调用程序集对象?
猜你喜欢
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多