如何在VS中使用asm中的float变量

时间:2011-05-10 12:45:39

标签: c++ visual-c++ assembly inline-assembly

我需要使用内联asm编写一个常见任务:我使用的代码是Follows。

Vector3 Matrix3x3::objectToInertial(const Vector3 &v) 
{
    return Vector3(
        m11 * v.x + m12 * v.y + m13 * v.z,
        m21 * v.x + m22 * v.y + m23 * v.z,
        m31 * v.x + m32 * v.y + m33 * v.z
        );
}

如何使用asm: m11 * v.x + m12 * v.y制作此等式?

2 个答案:

答案 0 :(得分:2)

如果您真的想通过内联汇编程序计算m11 * v.x + m12 * v.y,请尝试此操作(我假设您要将结果存储在变量结果中):

__asm
{
   fld m11
   fmul v.x
   fld m12
   fmul v.y
   faddp st(1), st
   fstp result
}

如果您想了解有关汇编中浮点运算的更多信息,可以查看Art of Assembly Language - Chapter 14 - 您也可以将该书下载为pdf。

答案 1 :(得分:1)

#if *MICROSOFT_COMPILER_DETECTION*
#define APP_FORCEINLINE __forceinline
#else
#if *GCC_COMPILER_DETECTION*
#define APP_FORCEINLINE inline
#else
#define APP_FORCEINLINE /* */
#endif
#endif

APP_FORCEINLINE
Vector3 Matrix3x3::objectToInertial(const Vector3 &v) {
return Vector3(
    m11 * v.x + m12 * v.y + m13 * v.z,
    m21 * v.x + m22 * v.y + m23 * v.z,
    m31 * v.x + m32 * v.y + m33 * v.z
    );

请记住,内联只是编译器的建议,尽管它是强大的。

今天的优化编译器可能会受益于使用与此处使用的Matrix3x3类不同的数据结构。 XNAMATH.X(来自Microsoft XNA)旨在实现跨平台,并在可用于所请求的CPU时利用内置的数学运算内在函数。