Проблемы с переводом инлайн ассемблеров.

Тема в разделе "WASM.BEGINNERS", создана пользователем Pokimon, 24 июл 2010.

  1. Pokimon

    Pokimon New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2010
    Сообщения:
    1
    Нужно перевести 2 строки инлайн ассемблера студии в 2 строки ассемблера gcc
    Точнее не 2 строки, но с этими двумя у меня проблема.

    Код (Text):
    1. #ifdef _MSC_VER
    2.     __asm call p
    3.     __asm fstp resd
    4. #else
    5.     __asm__("call *%0"::"d"(p));
    6.     __asm__("fstp %0":"=m"(resd));
    7. #endif
    В общем я вызываю функцию, которая возвращает double
    дубл кладется из x87 стека в переменную resd(локальную)

    Вариант MSVC работает, вариант GCC возвращает мусор.
    Помогите. GCC ассемблер такой сложный...
     
  2. black_hole

    black_hole New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2006
    Сообщения:
    44
    нигде внятного мануала нет, gcc ведёт себя по разному, в разных ситуациях, знают inline assembler видно только его разработчики :dntknw: я забил и решил пользоваться as напрямую, без gcc.
    если сил нет надо, изучайте исходники gcc :) еще можно по примерам, но общих правил я так и не понял, хотя получались чисто случайно довольно сложные конструкции.
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Pokimon
    Я для x86 почти не писал в gcc inline асме, но, по-моему, всё в варианте для gcc у Вас верно. Возможно, за исключением отсутствия модификатора volatile, без которого компилятор может слегка разбросать по коду (местами, например, поменять) Ваши вставки.
    Ну и пара косметических замечаний:
    1) Несколько подряд идущих вставок за исключением некоторых специфических (но очевидных) случаев лучше оформлять в одну.
    2) Если у Вас уж не совсем древний gcc, то лучше переменным во вставках давать имена, а не обращаться к ним по номерам.
    3) Лучше давать gcc самому выбрать, какой регистр использовать для хранения значения внешней переменной.

    С учётом замечаний вставка должна выглядеть примерно следующим образом:
    Код (Text):
    1. __asm __volatile (
    2.                        "call *%[p]\n\t"
    3.                        "fstp %[resd]"
    4.                        :[resd]"=m"(resd):[p]"r"(p));
    P.S. Гоню. Самое главное замечание забыл:
    fstp сохранит dword. А double — это восемь байт. Поэтому правильный код такой:
    Код (Text):
    1. __asm __volatile (
    2.                        "call *%[p]\n\t"
    3.                        "fstpl %[resd]"
    4.                        :[resd]"=m"(resd):[p]"r"(p));
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Только ради этого стоит отказаться от инлайн асссеблера гцц. ужос