是否__asm {}; 返回eax的值?

Del*_*ara 4 c inline-assembly

简单的问题。asmC语言中的函数用于在代码中进行内联汇编。但是它返回什么呢?它是常规的eax吗?如果不是,返回的是什么?

vll*_*vll 5

__asm__本身不返回值。C标准没有定义__asm__应如何处理返回值,因此编译器之间的行为可能有所不同。您说Visual Studio示例有效,但是Visual Studio使用__asm__asm__至少由GCC使用。

视觉工作室

为了在C程序中获得结果,您应该eax在汇编代码中放置返回值到,然后从函数中返回。调用者将收到的内容eax作为返回值。

Visual Studio 2015文档

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)