简单的问题。 C中的函数asm
用于在代码中进行内联汇编。但它又回归了什么?它是传统的eax
,如果没有,它会返回什么?
答案 0 :(得分:4)
__asm__
本身不会返回值。 C标准没有定义__asm__
应该如何处理返回值,因此编译器之间的行为可能不同。您声明Visual Studio示例有效,但Visual Studio使用__asm
。 __asm__
至少由GCC使用。
要在C程序中获得结果,应将返回值放在汇编代码中的eax
,然后从函数返回。来电者将收到eax
的内容作为返回值。
Visual Studio 2015 documentation:
int power2( int num, int power )
{
__asm
{
mov eax, num ; Get first argument
mov ecx, power ; Get second argument
shl eax, cl ; EAX = EAX * ( 2 to the power of CL )
}
// Return with result in EAX
}
GCC inline assembly HOWTO不包含类似的示例。这可能意味着您不能像在Visual Studio中那样使用隐式返回。但是,HOWTO表明您可以将结果存储到程序集块内的C变量中,并在程序集块结束后返回该变量的值。
字符串复制函数的示例,返回值dest
:
static inline char * strcpy(char * dest,const char *src)
{
int d0, d1, d2;
__asm__ __volatile__( "1:\tlodsb\n\t"
"stosb\n\t"
"testb %%al,%%al\n\t"
"jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2)
: "0" (src),"1" (dest)
: "memory");
return dest;
}
答案 1 :(得分:3)
不太可能;根据C99规范,在J3实现定义的行为下:
asm关键字可用于直接插入汇编语言 翻译输出(6.8)。最常见的实现是通过以下形式的声明:
asm ( character-string-literal );
因此,实现者不太可能想出一种方法,即将汇编语言插入到转换器输出中,并生成一些额外的中间链接代码,以将特定寄存器连接为返回结果。
这是一个关键字,而不是一个功能。
E.g。 GCC使用"=r"
- 类型约束语义,允许程序集中对变量具有写访问权。但是你确保结果在正确的地方结束。