Страницы

Поиск по вопросам

суббота, 21 декабря 2019 г.

C++ и вставки ассемблера

#ассемблер #cpp

Я недавно выучил С++ на базовом уровне (стандартная библиотека+STL).
Решил немного подучить ассемблер (когда-то учил его, до конца так и не осилил).
Собственно вопрос, какие преимущества дают асм-вставки в С++ код, и как это оформить.
P.S. Всех с новым годом!    


Ответы

Ответ 1



Преимущества: Возможность оптимизации вручную Использование (опять же для оптимизации) команд процессора, недоступных через стандартные средства С++ В случае программирование ядер - низкоуровневый доступ к оборудованию через порты ввода-вывода, к процессорным прерываниям для создания слоя абстракции. и др. подобное Как оформлять - зависит от компилятора и платформы. С Новым годом!

Ответ 2



Хотя здесь спрашивали про преимущества, я считаю, что надо рассказать и про недостатки: inline-ассемблера нет в стандарте. Разные компиляторы могут по-разному его поддерживать. Некроссплатформенность. Для каждой архитектуры процессора придётся писать свой код. Причём, большинство компиляторов поддерживают только ассемблер x86 кода. Программы, компилируемые под x64 или ARM не могут использовать inline ассемблер. Насчёт оптимизации: помните правило 80\20. В среднем 20% кода выполняется 80% времени. Надо оптимизировать только эту часть кода. Очень часто у кода есть потенциал оптимизации и без использования ассемблера. Часто код можно ускорить в несколько раз, просто изменив алгоритм. Если переписать код на ассемблер, не меняя алгоритм, то его можно ускорить очень незначительно. И то, надо очень постараться, потому что компилятор не такой тупой. Чтобы написать код быстрее сгенерированного компилятором нужно быть профессионалом, если, конечно, не использовать расширенные инструкции процессора, которые этот компилятор не поддерживает. Вместо ассемблера лучше использовать хорошо оптимизирующий компилятор, например, intel C++. Также стоит стараться использовать intrinsic-функции, которые уже написаны на ассемблере и оптимизированы, и поставляются с компилятором. В Visual C++ примерами таких функций являются memcpy, memcmp, memmove.

Ответ 3



Преимущество asm-вставок для меня в том что я понимаю как это работает, а то знаете в чужом компиляторе и чёрт ногу сломит.

Ответ 4



Преимущество asm-вставок для меня в том, что я понимаю, как это работает, а то знаете, в чужом компиляторе и чёрт ногу сломит. Оформляю так: беру из VS2005 файлы: ml.exe,link.exe,lib.exe mspdb80.dll также cmd.exe. Далее пишу в блокноте текст на ассемблере, например: ;***************************** asm_CheckNechet.asm ************************************ ; Данный модуль возвращает 1 если число нечётное, в противном случае 0. ;************************************************************************************** ; Command Line (release): ; ml -c "-Fl$(IntDir)\$(InputName).lst" "-Fo$(IntDir)\$(InputName).obj" "$(InputPath)" ; Outputs: ; $(IntDir)\$(InputName).obj .686 .model flat, c .data .code asm_CheckNechet PROC pushad mov EBP, ESP ;************************************************************************************** mov ESI, DWORD PTR [EBP+36] ;загрузить указатель на входное число //int mov EDI, DWORD PTR [EBP+40] ;загрузить указатель на выходное число //float ;-------------------------------------------------------------------------------------- finit mov EAX, DWORD PTR [ESI] sar EAX, 1 ;сдвигаем вправо jc obxod1 fld1 fstp DWORD PTR [EDI] ;число чётное popad ret obxod1: fldz fstp DWORD PTR [EDI] ;число нечётное popad ret asm_CheckNechet endp end Далее с помощью заранее заготовленного батника компилю в объектник: ml -c asm_CheckNechet.asm asm_CheckNechet.obj Затем добавляю в библиотеку: lib /OUT:my.lib asm_CheckNechet.obj Ну, а дальше подключаю эту библиотеку к студии просто положив ее в соответствующую директорию. В студии такая функция объявляется так: extern "C" void asm_CheckNechet(const int*, float*);

Комментариев нет:

Отправить комментарий