Нужно перевести 2 строки инлайн ассемблера студии в 2 строки ассемблера gcc Точнее не 2 строки, но с этими двумя у меня проблема. Код (Text): #ifdef _MSC_VER __asm call p __asm fstp resd #else __asm__("call *%0"::"d"(p)); __asm__("fstp %0":"=m"(resd)); #endif В общем я вызываю функцию, которая возвращает double дубл кладется из x87 стека в переменную resd(локальную) Вариант MSVC работает, вариант GCC возвращает мусор. Помогите. GCC ассемблер такой сложный...
нигде внятного мануала нет, gcc ведёт себя по разному, в разных ситуациях, знают inline assembler видно только его разработчики я забил и решил пользоваться as напрямую, без gcc. если сил нет надо, изучайте исходники gcc еще можно по примерам, но общих правил я так и не понял, хотя получались чисто случайно довольно сложные конструкции.
Pokimon Я для x86 почти не писал в gcc inline асме, но, по-моему, всё в варианте для gcc у Вас верно. Возможно, за исключением отсутствия модификатора volatile, без которого компилятор может слегка разбросать по коду (местами, например, поменять) Ваши вставки. Ну и пара косметических замечаний: 1) Несколько подряд идущих вставок за исключением некоторых специфических (но очевидных) случаев лучше оформлять в одну. 2) Если у Вас уж не совсем древний gcc, то лучше переменным во вставках давать имена, а не обращаться к ним по номерам. 3) Лучше давать gcc самому выбрать, какой регистр использовать для хранения значения внешней переменной. С учётом замечаний вставка должна выглядеть примерно следующим образом: Код (Text): __asm __volatile ( "call *%[p]\n\t" "fstp %[resd]" :[resd]"=m"(resd):[p]"r"(p)); P.S. Гоню. Самое главное замечание забыл: fstp сохранит dword. А double — это восемь байт. Поэтому правильный код такой: Код (Text): __asm __volatile ( "call *%[p]\n\t" "fstpl %[resd]" :[resd]"=m"(resd):[p]"r"(p));