微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么这个 MSVC asm 块没有 ret,或者非 void 函数有返回?

如何解决为什么这个 MSVC asm 块没有 ret,或者非 void 函数有返回?

我正在学习如何在 assembly 代码中使用内联 C++

Here一个非常简单的例子:

// Power2_inline_asm.c
// compile with: /EHsc
// processor: x86

#include <stdio.h>

int power2( int num,int power );

int main( void )
{
    printf_s( "3 times 2 to the power of 5 is %d\n",\
              power2( 3,5) );
}
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
}

既然 power2 函数返回结果,为什么 ret 代码的末尾没有 asm 指令?

还是在 asm 块之外、函数结束之前的 C++ return 关键字?

解决方法

EAX 暗示包含返回值,还有编译器生成的ret(有些代码是编译器生成的,如果没有指定__declspec(naked))。由于没有C++的return语句,从C++的角度来看行为是未定义的,未定义行为的表现就是返回EAX包含的任何内容,这就是结果。

,

您似乎不清楚 ret 指令和返回值之间的关系。 没有

ret 指令的操作数不是返回值,而是从堆栈中删除的字节数,用于调用约定,其中被调用方处理参数清理。

返回值以其他方式传递,由调用约定控制,并且必须在到达 ret 指令之前存储。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。