加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – __asm {};返回eax的值?

发布时间:2020-12-16 10:02:32 所属栏目:百科 来源:网络整理
导读:简单的问题. C中的函数asm用于在代码中进行内联汇编.但它又回归了什么?它是传统的eax,如果没有,它会返回什么? 解决方法 __asm__本身不返回值. C标准没有定义__asm__应该如何处理返回值,因此编译器之间的行为可能不同.您声明Visual Studio示例有效,但Visual
简单的问题. C中的函数asm用于在代码中进行内联汇编.但它又回归了什么?它是传统的eax,如果没有,它会返回什么?

解决方法

__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

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:tlodsbnt"
                       "stosbnt"
                       "testb %%al,%%alnt"
                       "jne 1b"
                     : "=&S" (d0),"=&D" (d1),"=&a" (d2)
                     : "0" (src),"1" (dest) 
                     : "memory");
return dest;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读