Как работать с переменными типа float при asm в VS - PullRequest
0 голосов
/ 10 мая 2011

Мне нужно написать общую задачу с помощью встроенного asm: код, который я использовал, выглядит следующим образом.

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 ]

2 голосов
/ 10 мая 2011

Если вы действительно хотите вычислить m11 * v.x + m12 * v.y встроенным ассемблером, попробуйте это (я предполагаю, что вы хотите сохранить результат в переменном результате):

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

Если вы хотите узнать больше об арифметике с плавающей запятой в сборке, вы можете взглянуть на Язык искусства ассемблера - Глава 14 - вы можете скачать книгу также в формате PDF, как это может показаться.

1 голос
/ 10 мая 2011
#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) разработан для кроссплатформенности и использования встроенных встроенных функций для математических операций, когда они доступны для запрошенного вами процессора.

...