简单的问题。asmC语言中的函数用于在代码中进行内联汇编。但是它返回什么呢?它是常规的eax吗?如果不是,返回的是什么?
__asm__本身不返回值。C标准没有定义__asm__应如何处理返回值,因此编译器之间的行为可能有所不同。您说Visual Studio示例有效,但是Visual Studio使用__asm。__asm__至少由GCC使用。
为了在C程序中获得结果,您应该eax在汇编代码中放置返回值到,然后从函数中返回。调用者将收到的内容eax作为返回值。
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
}
Run Code Online (Sandbox Code Playgroud)
GCC内联汇编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;
}
Run Code Online (Sandbox Code Playgroud)