是__asm {};返回eax的值?

时间:2016-04-22 20:21:04

标签: c inline-assembly

简单的问题。 C中的函数asm用于在代码中进行内联汇编。但它又回归了什么?它是传统的eax,如果没有,它会返回什么?

2 个答案:

答案 0 :(得分:4)

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

Visual Studio

要在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

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" - 类型约束语义,允许程序集中对变量具有写访问权。但是你确保结果在正确的地方结束。