Оформление ассемблерных вставок в Си

Тема в разделе "LANGS.C", создана пользователем slavanap, 13 июл 2011.

  1. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Добрый день!
    В связи с переходом с низкоуровневого программирования (MASM) на высокоуровневое (Visual Studio) вознили вопросы:

    1. Каким образом в VS можно добавить ассемблерный код и как грамотно взаимодействовать со структурами данных (массивами, записями) VS ?

    для начала хотелось бы реализовать что-нибудь на подобие asm-команды BSR r32, mem32
    Код (Text):
    1. __forceinline int bsr(int * value)
    2. ...
    3.     bsr  eax, value
    4.     return eax;
    5. ...
    2. Можно ли каким-нибудь образом прикрутить obj-файл MASM'a к VS ?
    3. Какой синтаксис ассемблера наиболее распространён: AT&T или MASM ? Имеет ли смысл учить AT&T, если с ним ещё не знаком?

    Буду рад услышать ваше мнение.
     
  2. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    P.S.
    4. Какой вид оформления вставок будет VS/gcc совместимым?
     
  3. ASMatic

    ASMatic New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2010
    Сообщения:
    233
    slavanap
    берем файлик масм кода, прикрепляем к прожекту, делаем asm.h где в си варианте описываем прототипы public фунок с асм файла. Пользуемся и наслаждаемся что нету тех ублюдошных вставок, которые не проканают в х64 моде.
    *ток вот с хидерами и либами масма не разобрался (мож в студии гдет есть, хз) - копировал с масма себе в прожект и не парился.

    чо там с gcc по этому поводу = хз.
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    по умолчанию gcc использует AT&T синтаксис, который первое время у человека, привыкшего к интеловскому синтаксису, вызывает жуткое недоумение... на самом деле AT&T получше вписывается в концепции вставок в си-код, но с какой-то там бородатой версии gcc можно спокойно писать код в интеловском синтаксисе, используя ключ компилятора -masm=intel (если ничего не путаю)... только вот вид асм-вставки в gcc (asm("<код>");) отличается от vs (__asm { <код> }), так что кросскомпиляцию видимо не получится сделать... а чем не устраивает сторонний ассемблер, способный генерировать обж-файлы в gcc и vs форматах? например, yasm, nasm или fasm... yasm вообще очень легко интегрируется со студией посредствам одного xml-файла... и кстати в gcc/mingw при сборки под x64 архитектуру асм-вставки перевариваются прекрасно, еще один повод забить на дураций мелкомягкий компилятор...
     
  5. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Видимо тем что он хочет чтобы код инлайнился.

    slavanap - всё украдено до тебя: http://msdn.microsoft.com/en-us/library/x8zs5twb.aspx
    Для BSR есть интринсик _BitScanReverse: http://msdn.microsoft.com/en-us/library/fbxyd7zd.aspx
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    а что мешает форс-инлайнить функцию из асм-файла? я правда не пробовал так делать, но что-то мне подсказывает, что с этим не должно быть проблем...
     
  7. klzlk

    klzlk New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2011
    Сообщения:
    449
    Rel
    Это значит что целостность системы нарушается, проекции изменяются в обход защиты и вредонос отваливается при восстановлении кодосекций ?
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.241
    что это? о чем это? какой "вредонос"? какое "восстановление кодосекций"?
     
  9. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Функции даже из другого сишного файла не инлайнятся без Link-Time Code Generation.
    С кодогенерацией времени сборки инлайнятся за счёт того, что компилятор в объектник вместе с бинарным кодом сохраняет байткод (промежуточный) для функции.
    Для функций из asm файлов (написаных вручную) байткода нету, и никакой forceinline их заинлайнить компилятору не поможет.
     
  10. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    slavanap
    По пункту №2 - в некоторых сборках студии (не экспрес, а в монструозных есть ml.exe но не .inc-файлов ни туториалов с эксамполами не прилагается). В таких зборках в проэкт можно включать даже  .asm-файлы (главное помнить что окончательнуюю зборку делает линкер), то есть обозначать в листинге на Си нужно функциюю как extern - ну и с понятиями манлинг/декорирование ознакомится (чтоб понять как линкер находит в обьекниках и статических библиотеках функиции).

    PS нехитрый макрос #define db _emit - если решился использовать __asm{}
     
  11. sn0w

    sn0w Active Member

    Публикаций:
    0
    Регистрация:
    27 фев 2010
    Сообщения:
    956
    что касается MASM сказать не могу, но например сгенеренные на FASMе формата MS COFF объектники без проблем прицепляются. там только небольшой нюанс в декорации, но это ерунда. довольно удобно использовать туже Build-Event систему.

    ну а если писать функцию то пожалуй так:

    __declspec(naked) unsigned int __stdcall _bsr(int *ptr)
    {
    __asm
    {
    xor eax, eax
    push ebx
    mov ebx, [esp+8] //так то +4 но изза push ebx +8
    mov ebx, [ebx]
    bsr eax, ebx
    pop ebx
    ret 4
    }
    }
     
  12. Psionic

    Psionic Member

    Публикаций:
    0
    Регистрация:
    25 сен 2008
    Сообщения:
    156
    Я могу - все работает, если знать декорирование, для совсем сомнительных есть ключ МАСМа /coff
     
  13. paralvic

    paralvic Пархоменко Александр Викторович

    Публикаций:
    0
    Регистрация:
    20 ноя 2010
    Сообщения:
    294
    Адрес:
    Нижний Новгород
    Лучше, конечно, не мешать. Если не хотите дольше искать ошибки и получить лишние проблемы при переходе между платформами.

    + не указали такой способ: написать .DLL на асме и добавить её.
     
  14. slavanap

    slavanap Вячеслав

    Публикаций:
    0
    Регистрация:
    10 сен 2008
    Сообщения:
    300
    Адрес:
    Смоленск, Россия
    Спасибо всем за варианты. По-моему, это ценный материал.