Проблемы с ассемблерными вставками в С++

Тема в разделе "WASM.UNIX", создана пользователем Zlyden, 14 июн 2009.

  1. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Недавно столкнулся с проблемой необходимости компилировать мои работы под Линукс. Сам я пользуюсь маздаем, поэтому для компиляции взял среду разработки Code::Blocks (со встроенными компиляторами MinGW). С исходником программы все в порядке, но вот заголовочный файл из универсальной SDK Jedi Academy вызывает у компилятора сомнения. А именно, этот отрывок:
    Код (Text):
    1. static ID_INLINE void SnapVector( float *v )
    2. {
    3.     static int i;
    4.     static float f;
    5.  
    6.     f = *v;
    7.     __asm   fld     f;
    8.     __asm   fistp   i;
    9.     *v = i;
    10.     v++;
    11.     f = *v;
    12.     __asm   fld     f;
    13.     __asm   fistp   i;
    14.     *v = i;
    15.     v++;
    16.     f = *v;
    17.     __asm   fld     f;
    18.     __asm   fistp   i;
    19.     *v = i;
    20. }
    Лог компиляции:
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h||In function `void SnapVector(float*)':|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1412|error: expected `(' before "fld"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1412|error: expected asm body before "fld"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1412|error: `fld' was not declared in this scope|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1412|error: expected `;' before "f"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1413|error: expected `(' before "fistp"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1413|error: expected asm body before "fistp"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1413|error: `fistp' was not declared in this scope|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1413|error: expected `;' before "i"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1417|error: expected `(' before "fld"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1417|error: expected asm body before "fld"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1417|error: expected `;' before "f"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1418|error: expected `(' before "fistp"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1418|error: expected asm body before "fistp"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1418|error: expected `;' before "i"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1422|error: expected `(' before "fld"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1422|error: expected asm body before "fld"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1422|error: expected `;' before "f"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1423|error: expected `(' before "fistp"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1423|error: expected asm body before "fistp"|
    C:\Program Files\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\include\jka\game\q_shared.h|1423|error: expected `;' before "i"|
    E:\Date-in-logs\main.cpp|154|warning: no newline at end of file|
    ||=== Build finished: 20 errors, 1 warnings ===|

    Подскажите пожалуйста, что мне делать с этим?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    формат асм вставок в gcc отличен от формата в msvc
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Его придется переписать.
    http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html
     
  4. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Я и сам догадался.
    Спасибо!
     
  5. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    Переделал код, теперь он выглядит так:
    Код (Text):
    1.     asm ("$f        %fldl");
    2.     asm ("$i    %fistpl");
    3.     *v = i;
    4.     v++;
    5.     f = *v;
    6.     asm ("$f        %fldl");
    7.     asm ("$i    %fistpl");
    8.     *v = i;
    9.     v++;
    10.     f = *v;
    11.     asm ("$f        %fldl");
    12.     asm ("$i    %fistpl");
    Компилятор не жалуется, но вот в правильности этого кода я не уверен
     
  6. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Может я неправ, но приведённый в первом посте код крив по определению. Первый вопрос, который смущает мой мозг: зачем static перед явно выраженными локальными переменными? Единственное объяснение которое я вижу этому static'у -- это сделать код не-thread-safe. Второй вопрос: зачем это писать на асме, если есть C? Можно ведь сделать так:
    Код (Text):
    1. static inline void SnapVector (float *v)
    2. {
    3.     v = (float[4]){(int)v[0], (int)v[1], (int)v[2], (int)v[3]};
    4. }
    Я бы вообще написал бы так:
    Код (Text):
    1. static inline void SnapVector (float *v)
    2. {
    3.     int i;
    4.     for (i = 0; i < 4; i ++)
    5.          v[i] = (int)v[i];
    6. }
    И добавил бы -funroll-loops к опциям оптимизации. Может быть ещё стоит добавить -ftracer. Ну собственно у gcc довольно подробная документация, чтобы разобраться самостоятельно со всеми этими опциями.
    Как бы я не уважал ЯП ассемблера, но если проект уже пишется на C, то зачем без острой необходимости переключаться на асм? Чтобы привязать проект к платформе x86?
     
  7. Zlyden

    Zlyden New Member

    Публикаций:
    0
    Регистрация:
    25 авг 2008
    Сообщения:
    49
    r90
    И правда логичней было бы написать так (хотя я бы использовал ++i).
    А вообще странно - в описании ясно сказано, что код универсален и расчитан под линукс. Кроме асма, он еще отказывался компилироваться из-за отсутствия описания одной из переменных, но это я исправил уже давно.