2011-07-08 3 views
64

До сих пор стоит узнать ASM?Стоит ли изучать язык ассемблера?

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

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

+1

Обратите внимание, что язык ассемблера привязан к процессору/контроллеру. – rmflow

+1

Вы имеете в виду, что это не кросс-платформенный? !! – ApprenticeHacker

+0

Нет. Например: http://www.worldofspectrum.org/Z80instructions.html – rmflow

ответ

78

Я узнал из Kip Irvine's книга. Если вы проигнорируете (справедливую) критику своих (нерелевантных) библиотек, я могу порекомендовать ее как хорошее введение в язык самого себя, хотя для действительно интересного материала, который вы должны искать навязчивых идей в сети.

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

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

Пример: LFSR быстро запускаются с помощью команды rotate-with-carry, для конкретных случаев, таких как это, так же легко написать версию ассемблера, так как он должен выяснить, достаточно ли компилятор достаточно умен, чтобы понять это. Иногда you just know something что компилятор этого не делает.

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

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

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

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

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

+3

Хорошо написанный ответ +1. Изучение и использование - это две разные вещи, потому что это хорошая идея, когда/если ее использовать, это опыт. –

20

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

2

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

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

3

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

14

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

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

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

33

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

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

+2

Вы имеете в виду, я должен просто изучить основные ** push, pop, mov и invoke ** команды? – ApprenticeHacker

+6

Я согласен, потребность в знаниях сборки зависит от того, с какой отраслью программирования вы работаете. Web/настольные/базы данных? Забудьте ассемблер. Компьютерные игры и графика? Это может быть несколько удобно. ОС или встроенные системы реального времени? Это необходимо. И так далее. – Lundin

+1

Вы неверно представляете другие ответы - никто не говорит, что вам нужно/должно научиться сборке; просто, что это полезно или стоит, в зависимости от вопроса. Однако ваш ответ все еще имеет значение. –

2

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

+0

Возможно, вы имели в виду семейство процессоров? – Romeno

Смежные вопросы