К счастью, гораздо более сложные функции сборки работают нормально [...]
Это также встроенные функции сборки? Потому что GCC использует совершенно другой синтаксис для встроенного ассемблера. Вы можете сделать синтаксис более знакомым, см. wikipedia .
1 int Convert(double value)
2 {
3 int result;
4 __asm__ __volatile__ (
5 "fist %0\n\t"
6 : "=m" (result)
7 : "t" (value)
8 );
9 return result;
10 }
Вот как бы я это сделал. =m
указывает, что мы хотим, чтобы операнд памяти сохранял результат (нам не нужен регистр, поскольку fist
не работает с ними). t
указывает, что значение передается на вершину стека, что также обеспечивает правильную очистку для нас.
EDIT:
Еще одна попытка, если допустить, что gcc с xcode допускает тот же тип встроенного ассемблера, что и msvc, это:
int Convert(double value)
{
int result;
_asm
{
fld value
push eax
fistp dword ptr [esp]
pop eax
mov [result], eax
}
return result;
}
Это также должно закрыть предупреждения о пропущенных возвращаемых значениях, которые вы, вероятно, получаете. Возможно, просто более строго разрешено возвращать значения из блоков ассемблера, записывая eax, чем msvc.