【发布时间】:2021-07-19 09:28:10
【问题描述】:
我正在学习如何在 C++ 代码中使用内联 assembly。
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 关键字?
【问题讨论】:
-
C 编译器会自动添加
ret指令以及在此之前需要的任何其他指令。不要自己添加ret,因为这很可能会破坏代码。 -
@fuz 编译器应该从哪里取值返回?
-
显然您正在学习如何在 32 位 x86 MSVC 中使用内联汇编。 x64 MSVC 不支持
__asm语句,这与其他编译器支持内联汇编的方式不同。我的意思是你可能正在学习一些用途有限的东西。 -
__asm是一个编译器扩展,用于特定的编译器和一组特定的平台。您可能对标准 C++asm关键字感兴趣,尽管它的尖锐警告使它与__asm没有太大区别。 -
返回值取自
eax。甚至有一个很好的评论这么说。
标签: c++ assembly visual-c++ inline-assembly