Стоит ли учить ассемблер? [закрыто]

97

Стоит ли изучать ASM ?

Я немного его знаю, но на самом деле я не использовал и не выучил его должным образом, потому что все, что я учусь делать на ассемблере, я могу делать в 1/10 раза с каким-либо языком, таким как C или C ++. Итак, стоит ли мне действительно изучать и использовать ASM? Принесет ли это мне пользу в профессиональном плане? Увеличит ли это мою находчивость? Короче говоря, может ли это сделать меня лучшим программистом?

Примечание: я говорю о низкоуровневой сборке, такой как FASM или NASM, а не о чем-то вроде HLA (High-Level Assembler).

УченикХакер
источник
2
Обратите внимание, что язык ассемблера привязан к процессору / контроллеру.
rmflow 08
7
Вы имеете в виду, что это не кроссплатформенный? !!
ApprenticeHacker
Нет. Например: worldofspectrum.org/Z80instructions.html
rmflow 08
2
Итак, существует другая ассемблере для каждого процессора ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker
4
Разный язык ассемблера для каждого семейства процессоров. Код 386 работает на любом более позднем процессоре x86, включая предложения Intel и AMD, но некоторые наборы функций являются собственными расширениями. Для этих дополнительных инструкций используется тот же язык, но полученный двоичный файл не будет переносимым.
spraff 08

Ответы:

109

Я узнал из книги Кипа Ирвина . Если вы игнорируете (справедливую) критику его (нерелевантных) библиотек, я могу порекомендовать это как хорошее введение в сам язык - хотя для действительно интересных вещей вам нужно выслеживать одержимых в сети.

Думаю, полезно понять, что происходит на нижних уровнях. Изучая ассемблер, вы узнаете о конвейерной обработке процессора, прогнозировании ветвлений, выравнивании кеша, SIMD, переупорядочении инструкций и так далее. Знание этого поможет вам лучше писать высокоуровневый код.

Более того, принято считать, что большую часть времени не следует пытаться оптимизировать сборку вручную, а позволить компилятору позаботиться об этом. Когда вы увидите несколько примеров извращенных вещей, которые генерируют компиляторы, вы лучше поймете, почему общепринятая мудрость верна.

Пример: LFSR работают быстро с помощью инструкции поворота с переносом, для конкретных случаев, подобных этому, так же легко написать версию на ассемблере, как и определить, достаточно ли умен компилятор, чтобы понять это. Иногда вы просто знаете то , чего не знает компилятор.

Это также помогает лучше понять проблемы безопасности - запись или выполнение, переполнение стека и т. Д.

Некоторые проблемы параллелизма становятся очевидными только тогда, когда вы знаете, что происходит на уровне каждой инструкции.

Иногда это может быть полезно при отладке, если у вас нет полного исходного кода.

Это ценность любопытства. Как вообще реализуются виртуальные функции? Вы когда-нибудь пробовали писать программы DirectX или COM на ассемблере? Как возвращаются большие структуры, предлагает ли вызывающая функция место для них или наоборот?

Кроме того, существуют специальные языки ассемблера для графического оборудования, хотя языки шейдеров вышли на высокий уровень несколько лет назад, все, что позволяет вам думать о проблеме по-другому, хорошо.

спрэф
источник
7
Хорошо написанный ответ +1. Изучение и использование - две разные вещи, изучение - хорошая идея, когда / если использовать, приходит с опытом.
old_timer 08
Чтобы привести пример, Линус Торвальдс использует дизассемблер для отладки своего кода, поэтому я думаю, что он хорошо разбирается в ассемблере x86.
Иванзиньо
55

Мне интересно, что так много людей спешат сказать, что да, вам нужно / нужно выучить сборку. Для меня вопрос в том, сколько сборок вам нужно знать? Я не думаю, что вам нужно знать ассемблер, как язык программирования, то есть я не верю, что каждый должен уметь писать программу на ассемблере, но, с другой стороны, иметь возможность читать и понимать, что это на самом деле средств (которые могут потребовать большего знания архитектуры, чем ассемблер) достаточно.

Я точно не могу писать сборку (то есть писать какой-либо нетривиальный фрагмент кода на сборке), но я могу ее прочитать, и это вместе со знанием реальной аппаратной архитектуры и используемых соглашений о вызовах достаточно для анализа производительности, и определить, какой фрагмент кода C ++ был источником этой сборки.

Давид Родригес - дрибеас
источник
4
Вы имеете в виду, что мне нужно просто выучить основные команды push, pop, mov и invoke ?
ApprenticeHacker
10
Я согласен, необходимость знания сборки во многом зависит от того, с какой веткой программирования вы работаете. Интернет / рабочий стол / база данных? Забудьте об ассемблере. Компьютерные игры и графика? Это могло быть несколько удобно. Разработка ОС или встроенные системы реального времени? Это обязательно. И так далее.
Lundin
1
Вы искажаете другие ответы - никто не говорит, что вам нужно / нужно изучать сборку; просто то, что это полезно или стоит, согласно вопросу. Ваш ответ все еще актуален.
Люк Дантон
1
@burningprodigy: Я считаю, что вы должны иметь некоторые базовые знания о том, как находятся инструкции в используемом ассемблере (то есть, каков порядок аргументов и т.п.), а также некоторые очень базовые представления о нескольких командах, о том, какая нагрузка или магазин. Затем, если вам нужно взглянуть на какую-то часть сборки, вы можете использовать ссылку, чтобы понять каждую из инструкций, и при этом вы начнете изучать основы, которые вам нужны.
Дэвид Родригес - dribeas 08
1
Согласен. В частности, только знание сборки в лучшем случае мало что даст вам при оценке эффективности современных процессоров. Если это цель, то гораздо полезнее немного базовых знаний сборки с изрядной долей основ компьютерной архитектуры. В большинстве случаев мне нужна сборка для просмотра дампов оптимизированных программ или для развлечения (например, для обеспечения безопасности, для написания мини-ядра и т. Д.). Но я не могу вспомнить, когда в последний раз менял какое-то дизайнерское решение из-за знания сборки.
Voo
28

Да, основная причина изучения сборки для разработчиков C и C ++ заключается в том, что она помогает понять, что происходит под капотом кода C и C ++. Дело не в том, что вы на самом деле будете писать код на ассемблере, но вы сможете взглянуть на дизассемблирование кода, чтобы оценить его эффективность, и вы поймете, как различные функции C и C ++ работают намного лучше.

острый зуб
источник
24

Стоит выучить много разных языков, из множества разных парадигм. Изучение Java, C ++, C # и Python не считается, поскольку все они являются экземплярами одной и той же парадигмы.

Поскольку сборка находится в корне (ну, близко к корню) всех языков, я, например, говорю, что стоит изучить сборку.

Опять же, стоит изучить функциональный язык программирования, логическое программирование, языки сценариев, языки на основе математики. У вас так много времени, поэтому вам нужно выбирать.

Дэвид Хаммен
источник
И тогда, когда вы , наконец , узнали их всех , и думаете , что у вас есть представление о том , что происходит, вы обнаружите , J .
Micha Wiedenmann
4

Знание ASM также полезно при отладке, поскольку иногда все, что у вас есть, - это «дамп ошибки ASM».

айн
источник
2

Есть ли у вас какая-либо польза от этого в том, чем вы планируете заниматься? это поможет вам в том, что вы сейчас делаете или планируете делать? это два вопроса, которые вы должны задать себе, и ответ на них - это ответ на ваш вопрос.

В более общем смысле, да, я бы сказал, на мой взгляд, стоит изучить asm (что-то вроде x86 или arm), насколько хорошо он вам подходит, зависит от того, что вы программируете и как вы его отлаживаете.

Некролис
источник
2

Зависит от того, какого уровня программирования вы хотите достичь. Если вам нужно работать с отладчиками, то ДА. Если вам нужно знать, как работают компиляторы, ДА. Любой ассемблер / отладчик зависит от процессора, поэтому работы много, просто проверьте семейство x86, насколько оно велико и старо.

GJ.
источник
Может быть, вы имели в виду семейство CPU?
Ромено