【发布时间】: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