Assembler мёртв ?!
Данная статья – размышление , в большей части основанное на моем мнении, знаниях и текущим представлением «Coding сцены», рассчитанная в основном на начинающих программистов. Если ты с чем то не согласен, еще раз замечу, это - только мои «размышления», и ты в праве не соглашаться с ними.
«А асм - это нолики и единички ?»
Реальный вопрос из жизни.
Язык ассемблера (в отечественных источниках также "автокод") — язык программирования низкого уровня, мнемонические команды которого (за редким исключением) соответствуют инструкциям процессора вычислительной системы.
И все таки, что же такое ассемблер сейчас, для чего он нужен, и с чем его едят?
Я, наверное, открою страшный секрет, если я скажу что: «Ассемблер не фига не сложный, самый оптимальный , и в чем то даже похожий на языки высокого уровня (Хотя, наоборот, это они похожи на него)».
Давай поговорим о той группе людей, к которой относятся те, кто уже пытался изучить ассемблер, но не под Win32, а под Ms-Dos. (Хотя может кто то и не осознавал этого =) ).
org 100h mov ah,9h mov dx,hello int 21h mov ah,8h int 21h int 20h hello db 13,10,"Hello, World!$"
Вот он. Хотя под Win32 он бы выглядел так, ИМХО, все просто:
.386 .model flat,stdcall option casemap:none ; нужные библеотеки include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data ; переменные MsgBoxCaption db "Message",0 MsgBoxText db "ВСТУПАЙТЕ И КОМПЕЛИРУЙТЕ!",0 .code start: invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK ; 'winApi функция вывода диалогового окна с сообщением' invoke ExitProcess, NULL ; 'winApi функция для заверщения программы.' end start
Так вот, многие забивали уже в начале обучения, т.к он казался им беспонтовым и жутко сложным ( как бы не уверял нас Калашников, хотя его книги, ИМХО, - полный отстой). Единственное с чем он мог бы посоперничать, так это с «паскалем», или тем же 16-ти битным «C». Сегодня же мы будем говорить о совершенно другом ассемблере и разработке программ на нем под Win32 ( Windows Xp, 7) , способном даже оказать серьезную конкуренцию таким языкам как C/C++, (Delphi, хотя многие считают что пора забыть про неё, привет «H3nOxek»у)), да и, вообще, остальным компилируемым языкам. Пример кода можно увидеть чуть выше.
Главным различием, конечно же, является платформа. Теперь под Win32 ассемблер не имеет возможности работать на прямую с процессором , все операции проходят через «оболочку» в виде ОС. Также в Win32 появились WinApi функции, грубо говоря, замена «прерываниям». В таком компиляторе как «Masm», есть даже операторы ветвления if..else, отсюда же и схожесть с языками высокого уровня, с которыми ты наверняка знаком чуть лучше.
Главное.
Вернемся к главной теме, «ассемблер сейчас».
Возьмем самые интересные для нас «достоинства» с Википедии:
1. При достаточной квалификации программиста, язык ассемблера позволяет писать самый быстрый и компактный код. Возможно, даже лучше, чем генерируемый трансляторами языков более высокого уровня.
2. Если код программы достаточно большой, данные, которыми он оперирует, не помещаются целиком в регистрах процессора, то есть частично или полностью находятся в оперативной памяти, то искусный программист, как правило, способен значительно оптимизировать программу по сравнению с высокоуровневыми трансляторами по одному или нескольким параметрам: скорость работы (за счёт оптимизации вычислений и/или более рационального обращения к ОП, перераспределения данных), объём кода (в том числе за счёт эффективного использования промежуточных результатов).
3. Существует возможность исследования других программ с отсутствующим исходным кодом с помощью дизассемблера.
Теперь «недостатки», возьмем оттуда же:
1. Как правило, меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования.
На мой взгляд это - единственный минус, хотя я бы еще добавил «Большие время разработки» и «Трудность написания, связанные с большей точностью», хотя со временем и накоплением опыта, эти минусы исчезают.
Смотря на «большинство» начинающих кодеров, можно заметить, что большинство из них учат только высокоуровневые языки, что на самом деле довольно плохо. Давайте подумаем почему:
1. Отсутствие хотя бы самых основных знаний о работе системы и исполняемых файлов в ней. Ведь для большинства, программа не больше чем код, собранный в исполняемый файл. Не все знают, что программу можно грубо поделить на 2 «состояния», физический и виртуальный. Что она имеет секции: дампа, кода, стека, PE заголовок и т.д. Взять на пример туже функцию для вывода окна с сообщением. Спросите у большинства начинающих программистов как она работает. Вряд ли вам кто то скажет, что программа заносит параметры в стек, после чего передают управление «обрабатывающей» функции, находящиеся в определенной динамической библиотеке, адрес которой находиться в том же PE заголовке.И таких примеров куда больше, причем большинство из них более серьёзные.
2. Ущербные знания в отладке. Такая вещь как реверсинг, нужна не только хакерам для взлома программ и поиска в них уязвимостей, но и для кодеров, благодаря которой в 100500 раз упрощается поиск ошибок.
Пролог.
Как не крути, ассемблер - батька. Если ты начал изучать какой то компилируемый язык, обязательно начни параллельно изучать асм, т.к он даст куда больше знаний о «внутреннем» мире ОС в отличие от языков высокого уровня, поможет в поиске ошибок при отладке, т.к абсолютно все инструменты интерпретируют код именно на ассемблере, что, кстати, дает возможность «понять» программу, не имея ее исходных кодов. Ну, и в конце скажу, что ассемблер должен знать каждый уважающий себя программист прикладного и системного ПО, ИМХО. И если тебе говорят что асм сложный, а ты сам не разу не видел его в глаза, не сцы, все норм. Пробуй.
PS. Как бы не была не актуально эта статья, смыл один – Assembler not Dead, сегодня, завтра и еще много много лет.
Written by: Fairhawk
- Fairhawk's блог
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 2024 просмотра



Комментарии
36 комментария(ев)Дата: ЧТ, 09/12/2010 - 09:06
да и в языках высокого уровня можно вставки на ассемблере использовать, а так же не стоит забыть что существуют не только x86 процессоры а так же например различные микроконтроллеры а для их программирования часто могут использоваться модификации ассемблера (например язык IL)
Дата: ЧТ, 09/12/2010 - 09:21
Не поверишь! Только что закончил делать одну лабу по асму, а на столе лежит книжка по нему =)
Интересная заметка. Я когда на первом курсе начал изучать асм, то мне действительно он был интересен. Но, извини, я бы никогда не подумал, что мне придется (или я смогу) на нем писать такие же функциональные программы, как на языках высокого уровня. Я его учил больше для всеобщего развития и мой удел в нем, это обычные студенческие лабораторки.
Мне, наверное, как и тебе, хочется знать абсолютно все. Но я понимаю, что это не возможно, и что языки высокого уровня мне пригодятся куда больше, чем знания асма.
Хотя может я в чем то не прав. Как знать.
Дата: ЧТ, 09/12/2010 - 09:52
Хорошая заметка.
Я тоже считаю, что Assembler не мёртв. Его в любом случае стоит знать хоть немного для общего развития.
Сразу вспомнилось:
Дата: ЧТ, 09/12/2010 - 12:22
Asm конечно не мертв.
Но и писать на нем такие программы, которые возможно написать на языках высокого уровня тоже нельзя. Не потому что асм не способен, просто временнЫе затраты слишком велики.
Знать конечно его надо, но жить на нем нет.
Если бы он мог удовлетворять все наши потребности, то новых языков не появлялось бы.
Кстати вставка if, else это уже по сути не асм, для таких ветвлений там есть другие способы, а if, else это уже доделка современного асма.
Программы, и среды их разработки эволюционируют и естественный отбор делает свое дело. Не думаю что и те языки что мы сегодня используем выживут, через n-лет наши дети будут писать программы таким способом какой мы сейчас даже представить не можем.
И конечно же рано или поздно появиться программа исполняющая мечту каждого программиста - программа с помощью которой можно запрогаммировать процесс создания программы))
P.S. а вообще по асму нет хороших учебников под windows, большая часть материала идет под MS-DOS, что имхо актуально только для тех кто что то сам пояет, спаивает и перепаивает.
Может кто возьмется за создание хорошего макнула по асму под win xp хотя бы, с толковыми примерами (полезными)?
Дата: ЧТ, 09/12/2010 - 16:02
Ох, как это давно было... в Delphi я любил использовать ассемблерные вставки, но не видел особой нужды в этом, все было просто ради интереса, любопытства и юношеского задора (все поковырять, посмотреть, опробовать). И я не считаю, что нужно изучать ассм чтобы знать внутреннюю работу компьютера или ОС, но если ты хочешь более подробно и более точно знать все действия своей программы, то тут без знаний ассма не обойтись...
Дата: ЧТ, 09/12/2010 - 16:12
Asm рано умирать ещё, но не смотря на это круг его использования сужается до программ, которые обязаны работать быстро (программы для слабых машин например). Писать на нем все подряд явно не стоит. Ведь конечному пользователю совсем не важно, на каком языке писалась программа, понимает ли программист как она работает до конца. Главное что в ней есть необходимые функции и скорость работы устраивает. Вдруг у человека многоядерный процессор или видюха с CUDA . Как там ASM дружит с новыми трендами и технологиями, кстати? Но изучить его все равно стоит хотя бы для общего развития.
В целом статья хорошая. Написано понятно и без кучи лишних терминов.
Дата: ЧТ, 09/12/2010 - 16:26
Я все не пойму, как сообщение в Блоге может являться статьей? Разъясните мне это момент? Я что-то путаю?
Дата: ЧТ, 09/12/2010 - 16:27
Согласен, статья норм. Единственное, что смутило, почему пролог находится в конце?
Дата: ЧТ, 09/12/2010 - 16:30
ASM FOREVER !!!
Однозначно
Дата: ЧТ, 09/12/2010 - 16:40
Это просто привычка говорить "Статья"
Я так понимаю там должен быть Эпилог
Дата: ЧТ, 09/12/2010 - 19:29
Рад что кому то понравилось, но к сожалению много начинающих "кодеров", забивают на асм, и все время уделяют языкам высокого уровня, имхо
Все зависит от программиста. Думаю многим не запретит религия, юзать макросы, что серьезно облегчает процесс разработки.
]]>http://wasm.ru/publist.php?list=1#series_1]]>
Зы. Сори за ошибки в тексте, в падлу исправлять было, писал под настроением
Дата: ЧТ, 09/12/2010 - 20:10
Asm not Dead!
Изучаю потихоньку, правда по книге Калашникова) Далеко не продвинулся(
Дата: ЧТ, 09/12/2010 - 20:48
О_о
Забей. Все что рассказывает Калашников задротство. Кури ]]>http://wasm.ru/publist.php?list=1#series_1]]>
ЗЫ. Я кстати как то тоже сесть хотел за написания цикла статей по асму, забил, подумал слишком боянисто получится, да и времени не так много, учеба.
Дата: ЧТ, 09/12/2010 - 21:39
Обычная студенческая ошибка - отождествлять понимание устройства процессора с языком ассемблера.
Как язык разработки асм мертв уже давно. Считайте, что это как латынь для медиков - мертвый язык, на котором никто не говорит, но все кто хоть как-то соотносит себя с врачом обязан знать.
Для тех, кто считает что асм самый-самый-самый напомню, что не так давно один американец финского происхождения переписал на Си реализацию одной функции. И его реализация оказалась быстрее, чем всеми используемый вручную оптимизированный ассемблерный вариант.
Язык тут не при чем, просто тот товарищ очень хорошо знает, как устроен процессор и как работает компилятор.
Дата: ЧТ, 09/12/2010 - 21:49
У Криса Касперки (кажется у него) есть несколько книг по оптимизации.
И он в них говорит, что оптимизированный вариант программы написанный хоть на Basiс, будет работать быстрей чем на асме. Так что...
Дата: ЧТ, 09/12/2010 - 22:37
Википедию никто не отменял, хотя все, что написано в ней не является де-юре, все же везде используются термины "пост" или "запись".
Дата: ЧТ, 09/12/2010 - 23:10
Ссылку в студию. Тебе самому не смешно ? Асм куда "ниже" чем Си. Как факт есть то, что функции Си, можно спокойно перенести на асм. А вот наоборот, не все. Это смешно, ИМХО.
Тоже самое, линк. Ржака
PS.
Дата: ПТ, 10/12/2010 - 02:51
Смотря что писать. Программу для работы платежного терминала хер банановый напишешь на асме хотя бы за год будь ты даже мега кодером, и юзай хоть макросы, хоть с бубном пляши.
Повторяю - асм знать надо, но писать на нем проги, если ты не пайщик ине крекер, бред сивой кобылы. Сейчас уже не так актуальна проблема места на жестком диске и оперативка. оптимизированный код можно и на языках высокого уровня делать, если руки прямые.
А за ссылки спасибо, но о них я знал. Уроки там и впрямь хорошие.
Оптимизация оптимизации рознь.
Дата: ПТ, 10/12/2010 - 04:08
Я думаю, что имеется в виду то, что Линус Торвальдс переписал реализацию алгоритма SHA1 на С со вставками ассемблера и его реализация на его компьютере работала быстрее оптимизированного вручную асмовской реализации. ]]>Подробности]]>.
Дата: СБ, 11/12/2010 - 03:08
имхо! а за ссыль по асму спс) давно хотел почитать про него и хотябы основы знать...да никак толковых и понятных статей не находил)
а какже программинг микрух?? конееееечно, щаз масса прог, которые пишут на С, но все равно в этом деле знать асм нужно, иначе потом можно оч долго искать косяк....
мне асм какраз для этого был и нужен) хотелось научится программить микрухи)
кстате может ктонить сделает статейку в след журнал? с описанием койнить проги "мигалки"... дада таких статей масса, но блин...в них нифига не понятно...
Дата: СБ, 11/12/2010 - 03:09
Что за мигалка?
Дата: Пнд, 13/12/2010 - 10:31
Светофор, наверное
Дата: Втр, 14/12/2010 - 05:08
fedr для микропроцессоров можно кодить не только на асме.
Дата: Пнд, 20/12/2010 - 08:32
верно, еще можно просто рисовать...
Дата: Втр, 21/12/2010 - 05:01
С бейсиком погорячился но сути не меняет
]]>http://www.insidepro.com/kk/001/001r.shtml]]>
Дата: ЧТ, 23/12/2010 - 15:20
низкоуровневые языки все таки знать иногда полезно, вспоминается история времен университета когда препод рассказывал как один дипломник когда защищал диплом внезапно обнаружил что в программке на микроконтроллере, код которой на LAD занимал несколько десятков страниц есть какая то ошибка (темой диплома была система синхронизации звонков в универе по часам с какими то там еще добавками), так он не растерявшись переведя контроллер в режим программирования с внешней клавиатуры потыкав кнопочки исправил программу вводом команд на IL... а системка в универе так и осталась потом
p.s.: занимаюсь сейчас поиском работы и вследствие этого просматриваю разные вакансии, и вот мне попадалась одна интересная вакансия (правда она совсем в другом городе так что мне точно не подходит) так там требовалось знание фбд, ркс, il и много чего еще (программирование промышленных систем автоматизации)
p.p.s: что бы вас совсем напугать кратко поясню что такое РКС (LAD, релейно контакторные схемы), язык представляет из себя набот из переключателей имеющих два состояния (замкнутое и разомкнутое) и имеющих возможность менять свое состояние в зависимости от внешних воздействий, так вот это по сути программирование чуть ли не на уровне булевой алгебры ))
Дата: Втр, 28/12/2010 - 07:19
...посмотрите в сторону языка FBD блоков
Дата: Втр, 28/12/2010 - 17:18
ну так я как раз о том и говорю что иногда бывает даже проще что-то сделать на РКС чем на ФБД, да и не все разработчики контроллеров в своих средах поддерживают ФБД плюс возможность кодирования напрямую с блока ввода контроллера, там обычно именно РКС или СИ (список инструкций, IL). производители иногда о программистах не заботятся, помню страшный промышленный датчик у меня в дипломе с собственным протоколом на основе rs-485 с кривой документацией по протоколу который только отдаленно напоминал modbus
Дата: СР, 29/12/2010 - 04:49
все серъезные SCADA системы для ПЛК (Trace Mode, GENESIS32 ....) и то же ПО от Siemens, Овен и т.д. поддерживает FBD и си ...даже на несчастную атмегу втиснули, достаточно вспомнить контроллеры сегнетикс ...по поводу Modbus, он хоть и стандартизирован, но только до трех уровней, а далее как разработчик захотел под свое оборудование, так его и реализовал, у всех регистры разные, это говорю вам как разработчик систем автоматизации
Дата: Пнд, 03/01/2011 - 03:57
Ну например для сименсов например для контроллера logo в среде мне больше нравится реализация ркс... фбд там как то глючит, хотя у mitsubishi alpha фбд еще более глючное ))) но все же ассемблер знать очень полезно как я считаю )
Дата: ВС, 20/03/2011 - 08:10
Про асамблер могу сказать что он круче любого языка высокого уровня а в комплексе если уметь кодить на нескольких языках и соединять это все в рабочие конструкции то без асама вообще не обойтись. Избаловались все большими ресурсами компов. Если ты можеш создать рабочий алгоритм в формулах то и на любом языке его напишешь. Везде нужна практика и рабочие заготовки они-то и облегчат жизнь программиста.
Дата: СБ, 26/03/2011 - 22:46
Максимум, что надо знать это, как работает процессор, архитектуру компьютера, устройство памяти и её принципы адресации. На этом всё. Сидеть пол дня писать 5-10 тысяч строк не имеет ни какого смысла, если только потешить своё самолюбие. Я такой умный знаю пол тысячи инструкций процессора.
Ну кто мне сможет назвать, то чего не сделаешь на си. И не важно, что я программирую, будь то контролер, винда, пингвим, да хоть i-pad. Да хоть самолёт запрограммируй. Нужен доступ к регистрам!? Пожалуйста. Делай всё что хочешь. Да и с оптимизацией всё в полном порядке. И если ты не собрался не чего ломать, он на фиг не нужен. С той скоростью с которой изменяются технологии далеко не уедешь на асме.
Дата: ПТ, 11/11/2011 - 01:36
обратись к отладочным регистрам процессора.
ввод/вывод в порт.
еще?
Дата: ВС, 13/11/2011 - 23:50
по поводу работы с портом, большинство систем не дадут напрямую с ним работать, в той же винде для этого есть апи с которыми на си работать вполне комфортно
Дата: Пнд, 14/11/2011 - 00:04
ms-dos?
А драйверок для той же винды ты как напишешь?
Дата: ПТ, 11/11/2011 - 06:51
Дайте и я вставлю свои 5 копеек =)
Время. А время - деньги. Если кушать хочешь, то ты не напишешь на асме быстрее чем на ЯВУ. А то что ты напишешь возможно будет работать медленнее и возможно будет больше по объему. А так в принципе все правильно =)
А вот тут я абсолютно не согласен. Компиляторы довольно хорошо распределяют переменные по регистрам. Есть ключевое слово register, хотя многим компиляторам начхать, на его существование.
Хм... А что тебе мешает использовать библиотеки для "индустриальных языкамов программирования"?
Единственное, что нет заголовочных файлов. Но на крайний случай тебе вряд ли потребуются все ф-ии библиотеки, так что можно и перевести. Ну, или написать автоматическую переводилку.
Эм... А что это за "состояния"?
Это механизм вызова ф-ии. А не как она работает.
А еще есть механизмы передачи параметров, когда аргументы передаются в регистрах общего назначения. fastcall называется.
Адреса находятся в таблице адресов. которая выглядит примерно вот так:
В коде вызов выглядит вот так:
т.е. вызов jmp'a
А сами адреса в jmp'ы вписывает динамический линкер ОС
Чувак, отладчик нужен, чтобы узнать выполняется тот или иной условный переход и состояние переменных. А для этого используется трассировка и брекпоинты. В принципе этого достаточно для отладки приложения. И я не вижу смысла лезть в ассемблерный листинг для этого.