Чи варто вивчати мову асемблерів? [зачинено]


92

Чи все ж варто вивчати АСМ ?

Я трохи про це знаю, але я насправді не користувався цим або не навчився його належним чином, тому що все, що я навчуся робити в асемблері, я можу робити в 10/10 раз з якоюсь мовою, такою як C або C ++. Тож, чи справді я повинен вчитися та використовувати ASM? Це допоможе мені в професійному плані? Це збільшить мою винахідливість? Коротше кажучи, чи зробить це мене кращим програмістом?

Примітка: Я говорю про низькорівневі збірки, такі як FASM або NASM, а не про щось на зразок HLA (High-Level Assembler).


2
Зверніть увагу, що мова збірки прив'язана до процесора / контролера.
rmflow

7
Ви маєте на увазі, що це не крос-платформа? !!
ApprenticeHacker


2
Гаразд, тому для кожного процесора існує інша мова збірки ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker

3
Інша мова збірки для кожної родини процесорів. Код 386 працює на будь-якому пізнішому процесорі x86, включаючи пропозиції Intel і AMD, але деякі набори функцій є розширеннями власності. Мова є однаковим для цих додаткових інструкцій , але в результаті бінарна НЕ буде стерпним.
розповзання

Відповіді:


107

Я дізнався з книги Кіпа Ірвіна . Якщо ви проігноруєте (справедливу) критику його (нерелевантних) бібліотек, я можу рекомендувати це як гарне введення до самої мови - хоча для справді цікавих речей вам доведеться полювати на нав'язливих в мережі.

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

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

Приклад: LFSR швидко працюють з інструкцією обертання з перенесенням, для таких конкретних випадків так само просто написати версію асемблера, як і виявити, чи достатньо розумний компілятор, щоб це зрозуміти. Іноді ви просто знаєте щось , чого компілятор не знає.

Це також покращує ваше розуміння проблем безпеки - напишіть або виконайте, перевиконання стека тощо.

Деякі проблеми паралельності стають очевидними лише тоді, коли ви усвідомлюєте, що відбувається на рівні кожної інструкції.

Іноді це може бути корисно при налагодженні, якщо у вас немає повного вихідного коду.

Там цінність. Як взагалі реалізуються віртуальні функції? Ви коли-небудь пробували писати програми DirectX або COM на асемблері? Як повертаються великі структури, чи пропонує функція виклику місце для них чи навпаки?

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


7
Добре написана відповідь +1. Навчання та використання - це дві різні речі, навчання - це гарна ідея, коли / якщо використовувати, це приходить із досвідом.
old_timer

Для прикладу, Лінус Торвальдс використовує дисемблер для налагодження свого коду, тому я думаю, що він добре знає збірку x86.
Ivanzinho

52

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

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


4
Ви маєте на увазі, що я повинен просто вивчити основні команди push, pop, mov та invoke ?
ApprenticeHacker

10
Погоджуся, необхідність знати збірку багато в чому залежить від того, з якою галуззю програмування ви працюєте. Інтернет / робочий стіл / база даних? Забудьте про асемблер. Комп’ютерні ігри та графіка? Це може бути дещо зручно. Розробка ОС чи вбудовані системи в режимі реального часу? Це обов’язково. І так далі.
Лундін,

1
Ви неправильно подаєте інші відповіді - ніхто не говорить, що вам потрібно / слід навчитися складанню; просто, що це корисно або варто, відповідно до питання. Ваша відповідь все ще актуальна.
Luc Danton,

1
@burningprodigy: Я вважаю, що ви повинні мати якісь базові знання про те, як є інструкції в асемблері, який ви використовуєте (тобто який порядок аргументів тощо), і якесь базове розуміння кількох команд, яке навантаження або магазин є. Тоді, якщо вам потрібно розглянути якийсь елемент збірки, ви можете використати посилання, щоб зрозуміти кожну з інструкцій, і, роблячи це, ви почнете вивчати основи, які вам потрібні.
Девід Родрігес - dribeas

1
Я згоден. Особливо лише знання збірки допоможе вам у кращому випадку оцінити ефективність сучасних процесорів. Якщо це мета, трохи корисніші базові знання збірки з неабиякою часткою основ комп'ютерних архітектур є набагато кориснішими. Найчастіше мені потрібна асамблея - це перегляд дампів оптимізованих програм або для розваги (наприклад, безпека, написання міні-ядра, ..). Але я не пам’ятаю, коли востаннє я змінював якесь дизайнерське рішення через знання збірки.
Voo

27

Так - основна причина вивчити збірку для розробників C і C ++ полягає в тому, що вона допомагає зрозуміти, що відбувається під кришкою коду C і C ++. Це не те, що ви фактично будете писати код у збірці, але ви зможете розглянути розбирання коду, щоб оцінити його ефективність, і ви зрозумієте, як різні функції C та C ++ працюють набагато краще.


23

Варто вивчити безліч різних мов, з безлічі різних парадигм. Вивчення Java, C ++, C # та Python не враховується, оскільки всі вони є екземплярами однієї парадигми.

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

Знову ж таки, варто вивчити функціональну мову програмування, логічне програмування, мови сценаріїв, математичні мови. У вас є лише стільки часу, тому вам доведеться вибирати.


І тоді, коли ви нарешті вивчили їх усі і думаєте, що бачите, що відбувається, ви виявляєте Дж .
Micha Wiedenmann,

4

Знання ASM також корисно під час налагодження, оскільки іноді все, що у вас є, - "ASM дамп помилки".


2

Чи маєте ви від цього користь у тому, що плануєте робити? це допоможе вам якимось чином у тому, що ви зараз робите або плануєте робити? це два запитання, які ви повинні задати собі, відповідь на них - це відповідь на ваше запитання.

У більш загальному сенсі, так, я б сказав, на мою думку, варто вивчити asm (щось на зразок x86 або arm), наскільки добре воно вам служить, залежить від того, що ви програмуєте, і від способу налагодження.


2

Залежно від того, якого рівня програмування ви хочете досягти. Якщо вам потрібно працювати з налагоджувачами, тоді ТАК. Якщо вам потрібно знати, як працюють компілятори, тоді ТАК. Будь-який асемблер / налагоджувач залежить від процесора, тому роботи багато, просто перевірте сім’ю x86, наскільки вона велика і стара.


Можливо, ви мали на увазі сім’ю процесора?
Ромено
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.