Учебный курс. Часть 0. Зачем учить ассемблер
Автор: xrnd | Рубрика: Учебный курс | 27-01-2010 | Распечатать запись
В настоящее время существует множество языков программирования. Созданы самые разные языки, удобные для решения любых задач. Большинство этих языков является языками высокого уровня.
Ассемблер — это практически самый древний язык программирования. До него было лишь программирование в машинных кодах 😉
Итак, какие же преимущества дает знание ассемблера:
- Глубокое понимание работы компьютера и операционной системы.
- Максимальная гибкость при работе с аппаратными ресурсами.
- Оптимизация программ по скорости выполнения.
- Оптимизация программ по размеру кода.
- Дизассемблирование и отладка.
Глубокое понимание работы компьютера и операционной системы.
Даже если вы пишете программу на языке высокого уровня, знание ассемблера поможет понять, как будет выполнятся программа, как хранятся переменные, как вызываются функции. А это позволит избежать многих очень неприятных ошибок. Есть такие люди, которые знают программирование только на уровне языка. То есть знают что надо написать, чтобы получить какой-то результат. А как оно работает, для них остается тайной, покрытой мраком. Человек, владеющий ассемблером, будет лучше программировать и на других языках.
Максимальная гибкость при работе с аппаратными ресурсами.
Используя ассемблер, можно делать с компьютером все что угодно! А языки высокого уровня ограничены компилятором и используемыми библиотеками. Такие современные языки, как Java и C# вобще не позволяют работать с аппаратными ресурсами и операционной системой напрямую.
Оптимизация программ по скорости выполнения.
Современные компиляторы довольно неплохо оптимизируют код, поэтому писать на ассемблере все подряд, конечно, не имеет смысла. Однако, если вы пишите прогу для шифрования или архивации больших файлов, то применение ассемблера позволит в несколько раз увеличить скорость выполнения программы. Причем достаточно реализовать на ассемблере небольшой критически важный участок программы, который производит вычисления или сложные преобразования, а интерфейс может быть написан на языке высокого уровня.
Оптимизация программ по размеру кода.
Программа на ассемблере, как правило, значительно меньше аналогичной программы на другом языке программирования. Для современных персональных компьютеров и серверов с терабайтными дисками и гигабайтами памяти это, конечно, врядли играет большую роль. Но для микроконтроллеров, где всего несколько килобайт памяти, маленький размер программы очень важен. Чем меньше программа, тем меньше памяти требуется и тем проще и дешевле будет используемая микросхема.
Дизассемблирование и отладка.
Знание ассемблера позволяет расковырять любую программу дизассемблером и изучить механизм её работы! Только представьте — можно залезть внутрь любой программы и посмотреть как она работает. Иногда бывает, что попадается интересная программа и не понятно, что там внутри, как она написана. Зная ассемблер, можно заглянуть внутрь любой программы и удовлетворить свое любопытство, даже не имея исходников.
Ассемблер очень может помочь при отладке. Иногда случаются ошибки и в компиляторах — очень злая тема. Вроде бы корректно написанный код выполняется вовсе не так, как предполагалось. Чтобы обнаружить такую ошибку надо посмотреть, во что скомпилился код, а разобраться в этом без ассемблера невозможно.
26-06-2011 15:26
«Оптимизация программ по размеру кода.» — по-моему, современные компиляторы достаточно оптимизируют код. Всё зависит от рук программиста.
02-07-2011 01:57
Для большинства случаев достаточно оптимизируют, но иногда асм лучше. Например, я недавно писал загрузчик для обновления прошивки в микроконтроллерах AVR. Влез в 512 байт 🙂 Похожий загрузчик на Си занимал 1-2 КБ. Когда всего 8КБ памяти — это существенная экономия.
Хотя для нормальных компьютеров с терабайтными дисками такая оптимизация уже давно не актуальна…
05-07-2011 01:18
Не спорю, микроконтроллеры — это такая штука, где каждый кварк на счету, но я имел ввиду прикладные программы. Этим летом планирую обнову — 6-ядерный проц и соответствующее остальное железо. Вы захотите корпеть над программой в 2 раза больше времени, чтобы на моём компьютере программа проработала быстрее на сотню-другую тактов? 🙂 Блин, чувствую, что меня сейчас примут за холиварщика, но нет, я люблю асм 🙂
Кстати, хорошо, что ответили. Спасибо за уроки, но всё-же это как-то неактуально — программировать под дос. Другое дело сейчас — никсы, микроконтроллеры, вин64. Не весь сайт облазил, но думаю, что этого нехватает сейчас 🙂 Спасибо за внимание.
24-03-2012 20:32
Да, даже на «древнем» пентиум 3 1000 с 40 ГБ HDD тоже не имеет смысла тратить больше времени на уменьшение размера программы на 1-2 КИЛОБАЙТА.
К тому же, сейчас можно вполне спокойно поставить большой HDD на любой комп, в случае чего. Ну или воспользоваться внешним USB HDD.
Преподам в универе этого не объяснишь 🙁
28-06-2011 12:12
нее Ассемблер — самый крутой в мире ЯП!
28-06-2011 12:13
И ещё этот сайт УНИКАЛЕН я обрыл весь интернет ничего подобного по языку ассемблер я не нашёл!
28-06-2011 12:14
ГОРОМАДНОЕ спасибо создателям сайта!!
08-09-2011 11:32
1.Всем привет.Всё же не много не понятно зачем нужен ассемблер возможно ли на нём писать серьёзные программы.На чём к примеру написан Виндоус,ОФис, НА чём пишуться серьёзные игры,графически красивые приложения.
2.И ещё получается что с++ компилируется программой компилятором на язык ассемблера а уже потом в машиный код или с С++ сразу компилируется в машинный код?
17-09-2011 17:35
1. Есть много разных языков. Серьёзные игры и красивые приложения на ассемблере писать можно, но уж слишком трудоёмко. Проще будет писать такие программы на C++, Delphi, Java, C#.
2. Обычно С++ компилируется сразу в машинный код. Хотя вроде есть компиляторы каких-то языков, которые генерируют только исходник на ассемблере.
23-09-2011 17:12
Если просто асемблер служебный язык .
Необходим для отладки для написание низкоуровневых вещей.
Для обычных программ можно найти уже готовые решения , узнать причину почему , что та не работает и как исправить.
Но знания асемблера , в любом случаи необходимы любому , человеку который собирается заниматься программирование серьёзна , если не глубокие то хотя бы поверхностно.
Хотя бы для того чтобы иметь представления как работает жилеза и какие процессы там происходят.
P.S Могу сказать по своему опыту , хотя асемблер пока знаю не очень , но даже этих знаний хватает , чтобы значительно лучше понимать процессы которые происходят.
Если раньше ошибки при компиляции и выполнение программы повергали в ступор , то теперь тьфу тьфу,
кое как удается разрулевать , вот и думай нужен нет.
19-09-2011 12:06
Ну если всё делается на С и компилируется сразу в машинный код.Тогда встаёт вопрос зачем учить ассемблер.И почему виндоус написан на си со вставками ассемблера?
19-09-2011 15:47
Вдруг ты захочешь компилятор написать или драйвер 🙂 Полезно знать несколько языков.
Виндоус написан на Си, потому что его писать начали ещё в конце 80-х.
Я для написания ОС выбрал бы С++. Ну и без ассемблера конечно не обойтись.
19-09-2011 19:18
Что то вы путаете.Получается для ассемблера тоже написан компилятор и для си написан компилятор который транслирует команды этих языков в машинный код.
Тогда как понять ваши слова учить ассемблер что бы писать компилятор.Если компиляторы пишут кто то о ком мы не знаем и вообще не понимаем механизм этого.
20-09-2011 07:02
учи BASIC 🙂
13-02-2012 17:34
полностью согласен с RoverWWorm 🙂
07-04-2012 08:03
Чтобы стать высококвалифицированным специалистом знание ассемблера обязательно. Но понять его могут только единицы. Чтобы не задавать вопрос “Зачем учить ассемблер?” выучи его и тогда поймешь зачем? Почему? Когда? Для кого?
13-06-2012 08:09
Ну и комментарии. Ассемблер — очень мощный язык, но слишком привязан к железу, что одновременно и плюс, и минус. Вообще можно практически все реальзовать на любом языке, только результат может быть не очень (Можно и ОС написать на бэйсике). Ниша ассемблера — микроконтроллеры и критические по времени или размеру участки кода, а также драйверы и участки ядра. Хотя в большинстве случаев можно вполне обойтись и Си. Кто-то тут писал про С++ — не очень пригодный язык для ОС, слишком много наворотов, за которые придется расплачиваться.
Естественно знания асма не помешают и во всяком случае помогут разобраться как оно там все работает внутри на самом деле.
30-06-2012 11:29
хорошо бы еще и электронику знать тогда цены не будеть вам
18-10-2012 17:59
Нее, вы не понимаете. кто против Асма. Я тоже был против. Типа зачем писать целый месяц то что можно за 5 минут на ЯВУ написать. Так то оно так, но.. и дело тут не в оптимизации. Если сравнить затраченное на разработку время на асме время и полученный результат, то асм в этом смысле проигрывает существенно. Я думаю чтобы написать на асме даже ооооочень простое многопоточное приложение для win32/64 уйдет пару недель ежедневного труда в поте лица. У асма специализация — микроконтроллеры и точка. Это даже не обсуждается особо. Но дело как я говорил не в этом. Задали мне в универе задание.. написать на асме программу для расчета некоторой формулы в которой используются все арифметические операции. Я думал, ааа раз плюнуть щас в гугл залезу как с другими языками минут за 10 сделаю… щаззз… методом тыка и по аналогии не получается.. без знания глубинных процессов вы даже не сможете 3.14 умножить на 2.08 и получить результат на экране. У меня 5 дней ушло и я не продвинулся ни на мм))) Как так подумал я.. чо за хрень.. и посложнее задания делал а тут какой то гребанный асм мне не дается. Начал теорию читать что само по себе редкость:) Думал щас быстренько прочитаю и сделаю минут за 40.. щаззз))) Не знаю лично мне АСМ бросил вызов! Я все таки добью эту формулу, сам! Я одно могу сказать кто освоит асм хотя бы на базовом уровне.. хорошо освоит.. чтобы не тыкаться по сайтам а представлять себе каждую строчку чего она делает. Тому остальные языки как орехи будут. Ибо после асма работа со всякими библиотеками функций ЯВУ кажется таким ламерством)))))
18-10-2012 18:03
Кстати вот формула, если кто подсобит скажу огромное спасибо. Смотреть не буду до последнего сам сделаю)))
( (A * x^3 + B * x^2 + c/x + d/x) ) / x
ввод параметров с клаиатуры,
выод результата на экран.
DOS
TASM или DEBUG.
Или код для расчета другой формулы дайте плиз,
я его оттрасирую и разберусь чо к чему
(только код работающий, неработающего у меня у самого куча)
😉
18-10-2012 18:15
С [T86] полностью согласен. Кто не знает асма тот тупая печатающая обезъянка, которая копипастит чужой код из инета )))) Асм дал мне понять что я как раз тупая
печатающая обезъянка))) Расскажу историю.. Я занимался IT около 5 лет, типо хобби и все такое.. про винду все знал про железо.. начал заниматься шлюзами, сетевыми экранами, сетевым сервисами.. и встал! Я понял что не понимаю что такое IP-адрес, UDP/TCP порт.. что такое протоколы, как работают сетевые приложения.. ка работает DNS и почта.. я все это умел настраивать но тупо.. не вникая в суть… На изучение стека TCP/IP и модели OSI/ISO у меня ушло несколько месяцев геморроя. и никто не помогал. Вот надо оно мне было? Сейчас с высоты своего опыта я могу ТОЧНО сказать ДА НАДО! Инженер.. аналитик.. исследователь именно тем и отличается от низшего технического персонала что он ВСЕ знает. ОТ и ДО.. ОН обязан это знать. И программист обязан знать АСМ! Даже если вы пишете приложения для ёфона, вы должна знать асм для DOS))) Иначе вы не можете называть себя программистом! Можете не использовать напрямую знания но знать должны! imho
08-11-2013 03:00
Ассемблер вечный он будет актуален всегда и это факт.
Спасибо создателям за сайт.
24-10-2014 01:18
Глупо тратить время на изучение технологии, которую вы не будете использовать в работе или собственных проектах. Если вы собираетесь (вам нужно) программить контроллеры, ОС, embedded, дрова — знания нужны. Он, как и Си теперь, жёстко занял свою нишу и большинству программистов уже вряд ли понадобится. Всё зависит от ваших целей в дальнейшей работе. А учить ради собственной крутизны — это странно.
05-08-2018 18:06
Вы рассуждаете как потребитель. А для человека с креативным складом ума — лишних знаний не бывает.
03-01-2015 22:32
Прелесть ассемблера в том что, функции аналогичные функциям высоко-уровневых языках можно писать с нуля например:
macro GOTO metka
jmp metka
endm
03-04-2015 15:57
Программирую AVR микроконтроллеры на C++.
Столкнулся с стандартной проблемой: ускорить работу одной функции.
Решил попробовать ассемблер.
В сети информации много, но представлена неэффективно и непонятно для начинающих.
Анализ интернета показал, что Ваш сайт как ГЛОТОК СВЕЖЕГО ВОЗДУХА.
Прекрасно структурированный материал.
БЛАГОДАРЮ за проделанную ОГРОМНУЮ РАБОТУ!!!!
УДАЧИ!!!
15-06-2015 16:30
Кстати, у ассемблера есть недостатки. Под под каждый тип процессора идет свой ассемблер. Портировать под другой процессор программу не получится.Нужно будет писать код заново. Да и крупные программы писать очень сложно.Проще на языка высокого уровня. Графический интерфейс писать на нем же. Спасибо автору за статью. Хотя хотелось бы услышать еще и про TASM.
17-09-2015 10:51
Почитал, вспомнилась притча. Если перевести ее в русло обсуждения, то выйдет следующее: «Если я туп, ленив или бездарь и не могу писать на асме, то буду везде заявлять он его ненужности». Мне кажется таких программеров надо гнать поганой метлой. Хотя так и есть, таких никогда не возьмут в серьезные фирмы и их удел мелкие отечественные лавки, где они «розы среди навоза». Вот поэтому в зарубежных компаниях, которые занимаются созданием серьезного глобального программного обеспечения так мало соотечественников. Запустит Билдер или другую хрень, натолкает кнопок, с3,14здит чей то код с интернета, рассует по обработчикам и пальцы гнет, какой он крутой программист, а по факту он ДЕШЕВЫЙ БЫДЛОКОДЕР!!!!
05-08-2018 17:59
Рябятки, я пишу на асме и ковыряю чужой код уже 25 лет. Начинал ещё на ZX-Spectrum-48, это компьютер с 48 кб памяти и процессором Z80 3,5 МГц. Учебников тогда не было, интернета тоже, до всего доходил сам. Было тяжело. Зато потом легко осваивал любой ассемблер от x86 до arm7. ЯВУ стали казаться примитивом для детей.
Моё мнение: знать АСМ необходимо. Компиляторы ЯВУ эффективны для несложных типовых задач, если же пишется что-то нетиповое, и программист не слишком опытный — тушите свет, компиляторы выдают ламерский код, сжирающий гигабайты ОЗУ и гигагерцы скорости. Просто потому, что компилятор и человек друг друга не поняли. Дураков много, а защиту от каждого дурака в компилятор не встроишь.
Человеческая глупость бесконечна, и оптимизация кода перед ней бессильна.
30 лет назад были прекрасные игры, размером в сотню килобайт. Современные «программисты» от таких размеров впадают в ступор, ибо не понимают как такое вообще возможно. Учите АСМ — поймёте.
03-10-2018 20:20
Спасибо редакции за предоставленный материал. Учу программирование на ассемблере и мне это нравиться!
12-12-2018 17:51
Думаю самая актуальное назначение знания ASM’а, на данный момент, это декомпиляция и отладка, чужих и даже своих приложений, так как когда тебе кидают дамп древней, как говно мамонта, версии программы, от которой нет не исходников, ни pdb файлов, надо разбираться в чем траблы.
09-05-2019 12:51
Изучения Ассемблера очень нужная вещь.
Представь такой пример, ты супер «программист» и хочешь собрать робота.
Для роботы его нужны программы управления движение оценки окружения и положения самого робота в пространстве, чтоб он видел окружение и мог взаимодействовать с окружающим миром. Ты модный программист написал все на модном пайтоне и на выходе получил робота укурка, движения и реакция на воздействия которого похожи на то что у него неплохой такой бед-трип.
При обращение к железу на прямую для сокращения задержек лучше Ассемблера только байткод или электромеханика.
10-11-2019 11:27
Хороший сайт!