ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
705374
Ксения (13.10.2016 05:12 - 05:25, просмотров: 25692)
На писишном (x86-x64) ассемблере кто-нибудь еще программирует? http://blogs.kpi.kharkov.ua/v2/asm/dostoinstva-i-nedostatok-asm-a/
Знаю, что по части микроконтроллеров еще остались любители программить на ассемблере (особенно среди AVR-щиков), а как по части персонального компьютера? Понимаю, что в области микроконтроллеров за ассемблер хватаются из-за недостатка памяти, а то еще и скорости. Понятно, что писать программу целиком на ассемблере для ПК нынче найдется мало желающих, тем не менее, в связи с появлением быстрой арифметики (SSE- и AVX-инструкции) актуальность ассемблера возросла. Хотя, видимо, ненадолго, т.к. C-компиляторы уже успели обзавестись макросами на этот случай. Впрочем, программирование с использованием этих макросов мало чем отличатся от программирования на ассемблере :). Может показаться, что я неудачно выбрала для этого выступления аудиторию, и электронщикам это совершенно не нужно. Однако явственно наблюдается тенденция, что электронщиков все больше и больше загружают программистской работой - так уж изменяется со временем структура требований заказчиков. Т.е. нынешнему заказчику уже мало спаянной железяки :), ему подавай программно-аппаратный комплекс, который бы выполнял заданную работу. Причем доля ПО в этом комплексе со временем нарастает. Интерфейсов это тоже касается. Скажем, раньше кидаешь байт за байтом в UART-регистр - вот и все дело. А нынче, чтобы запрограммировать передачу данных по USB, надо основательно попотеть. А уж если заказчик требует связи по сети или WiFi, то и вовсе морока. Впрочем, электронщики - хитрые люди :), они очень скоро наловчилась использовать готовые модули (типа CMSIS), не вникая в их содержимое, а то и предпочитают поставить Linux, чтобы иметь уже готовый функционал, тем самым, сводя работу по программированию к минимуму. Тем не менее, есть и такая тенденция, когда электронные устройства накрепко связываются с персональным компьютером, причем основная часть расчетной работы (цифровой обработки сигнала) ложится на персоналку. При этом она же служит монитором (экран+клавиатура) для управления комплексом, т.к. при достижении определенного уровня сложности управлять установкой с помощью одних лишь кнопок становится неудобно. В некоторых случаях персоналку удается заменить смартфоном, но суть дела от этого не меняется, т.к. в наше время способности смартфона уже превзошли возможности старых персоналок. Тем не менее, вопрос производительности продолжает оставаться актуальным из-за того, что аппетиты/требования заказчиков постоянно растут. Я написала эту пространную вводную часть в надежде, что использование ассемблера может для кого-то оказаться актуальным. Пусть не для того, чтобы писать на нем программы, а хотя бы для того, чтобы писать на нем времязатратные функции типа умножения матриц, аппроксимации полиномами (в том числе и преобразование Фурье) и т.п. В этом случае на ассемблере пишутся лишь отдельные функции, тогда как саму программу можно писать почти на любом языке программирования. Что касается меня, то ассемблер "IBM PC" - моя давняя любовь :). И хотя я сравнительно давно ничего на нем не писала (не было нужды), то сейчас с большим удовольствием снова "взяла в руки шашки" и обнаружила, что навыки я еще не потеряла. А поводом мне послужила покупка нового процессора (пусть и не самого последнего поколения) под задачу ускорения вычислений с плавающей точкой. Т.е. речь идет о ранее упомянутых мною вскользь инструкций AVX и AVX2 (на SSE и SSE2 когда-то уже писала). Операционка под это дело обязательно должна быть 64-битная, т.к. 32-битная такую задачу абортирует. Причем, для исполнения AVX- и AVX2-инструкций совершенно не требуется переходить в 64-битный мод, а мешает их выполнению только то, что в среде 32-битных ОС (например, Windows XP) коды этих инструкций являются привилегированными командами, при исполнении которых в пользовательском режиме возникает исключение (прерывание такое на недопустимые операции). Тогда как на 64-разрядной ОС такое прерывание, видимо, тоже возникает, но она его затем маскирует, отмечая, что данная задача/поток использует длинные (256-битные) регистры ymm0-ymm7, содержимое которых ОС обязана спасать при переключении задач/потоков в режиме разделения времени. Вот и пришлось мне под это дело поставить Win10. Проблема возникла с компилятором ассемблера. Мой старый компилятор tasm32 (из состава Borland Builder), ясное дело, новых процессорных инструкций не понимал. Впрочем, я прежде компилировала на нем код SSE и SSE2, используя кем-то написанный инклюд (p4macros.asi), где SSE/SSE2-команды были описаны в виде макросов. А написан был тот инклюд еще во времена царствия Pentium-4, когда новых AVX/AVX2-инструкций еще и в помине не было. Испытала FASM, NASN, YASN... На мой взгляд, совершенно отвратные компиляторы. Ключей у них нет таких, чтобы заказать такой объектник, какой я хотела (omf, а не coff). Да и правила оформления кода не такие, к каким я раньше привыкла на MASM'е. Так вот главной причиной, побудившей меня написать этот пост, явилась моя удачная находка компилятора. Это ml.exe из утилит Microsoft Visual C от 2013 года (VC2013). В предыдущей версии VC2010 тоже такой есть, но чуть похуже. А еще раньше (VC2008) AVX-инструкций этот компилятор не поддерживал. Правда тот, что был взят из VC2010, был последним из тех, что запускался на WinXP, тогда как остальные требуют Win7 или выше. Впрочем, я ему маленько поковыряла заголовок, после чего он стал и на XP тоже работать. Существует и еще более новая версия - из VC2015, но он, на мной взгляд, хуже - способностей у него не прибавилось, а вместо этого тянет целую кучу служебных dll из C-компилятора (предыдущий тянул только одну - msvcr120.dll). Но и он тоже в дело годится, если предварительно проинсталлировать "Redistributable Package 2015" (vc_redist.x86.exe). Короче говоря, этот компилятор с ассемблера так хорош, что я даже визжала от удовольствия :). Даже странно, что интернете его до сих пор никто не выложил отдельно от Студии. Т.е. мне пришлось всю эту MS Visual Stidio себе на комп устанавливать, чтобы выудить оттуда этот файл. Причем длина у него совершенно мизерная по нынешним временам - всего 400К с небольшим. Таких на старую магнитную флоппи-дискету можно было бы 3 штуки записать :). Кого эта информация заинтересовала - охотно поделюсь. Как компилятором, так и кодом (вычисление скалярного произведения двух векторов всеми возможными способами – это наиболее востребованная функция в вычислительных задачах линейной алгебры).