Для чого нам потрібна мова складання?


27

Ми в основному пишемо програму мовою високого рівня. Тому під час навчання я натрапив на асемблерну мову. Таким чином, асемблер перетворює мову складання в машинну мову, і компілятор робить те саме з мовою високого рівня. Я знайшов, що в мові збірки є такі інструкції, як переміщення r1 r3, переміщення 5 і т. Д. І це досить важко вивчити. То чому ж була створена мова асемблера? Або це була перша, яка вийшла першою навіть перед мовою високого рівня? Чому я вивчаю асемблерів у своєму класі комп'ютерної інженерії?


13
Assembler - це читаний людиною машинний код, саме тому.
Андрій Бауер

4
Тому що важливо знати, як все працює, коли ми близько до обладнання. Коли ми пишемо збірку, ми розуміємо, як апаратне забезпечення комп'ютерів працює і функціонує на низькому рівні. Найкращий спосіб для цього - мова монтажу, оскільки мова машини є стомлювальною і не може читати, як збірка. Ви б справді вважали за краще використовувати чарівну коробку і ніколи не заглядати всередину?
Spencer Wieczorek

Відповіді:


32

"То чому ж була створена мова монтажу?"

Мова складання створена як точна стенограма для кодування на рівні машини, так що вам не доведеться рахувати 0 і 1 протягом усього дня. Він працює так само, як код машинного рівня: з інструкціями та операндами.

"Хто з них прийшов першим?"

У Вікіпедії є хороша стаття про історію мов програмування

"Чому я вивчаю асемблерів у своєму класі комп'ютерної інженерії?"

Хоча це правда, ви, мабуть, не опинитесь писати додаток для свого наступного клієнта в зборі, все ж багато чого можна отримати від навчання монтажу.

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

Мова складання наближений до процесора, як ви можете отримати програміста, тому добре розроблений алгоритм палає - збірка чудово підходить для оптимізації швидкості. Вся справа в продуктивності та ефективності. Мова складання дає вам повний контроль над ресурсами системи. Так само, як і збірний рядок, ви пишете код, щоб просунути окремі значення в регістри, мати справу з адресами пам'яті безпосередньо для отримання значень або покажчиків. (джерело: codeproject.com )


29

Для чого нам потрібна мова складання?

Ну, насправді є лише одна мова, яка нам коли-небудь знадобиться , яка називається "машинна мова" або "машинна код". Це виглядає приблизно так:

0010000100100011

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

На щастя, кожен розділ двійкового відповідає певному значенню. Він розділений на ряд розділів:

0010|0001|0010|0011

operation type  source register  other source  destination register
0010            0001             0010          0011

Ці значення відповідають:

operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3

Таким чином, ця операція додала б цифри в регістри 1 і 2 і поставила б це значення в регістр 3. Якщо ви буквально введете ці значення в процесор і скажете йому "йти", він додасть два числа для вас. Операція "віднімання" може бути 0011 або щось подібне, а не 0010 тут. Яке б значення не змусило процесор робити віднімання.

Отже, програма могла б виглядати приблизно так (не намагайтеся її зрозуміти, оскільки я створив саме цю версію машинного коду для пояснення речей):

instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000

Це смокче читати? Безумовно. Але нам це потрібно для процесора . Добре, якщо кожен машинний код відповідає певній дії, давайте просто зробимо просту "англійську" стенограму, а потім, коли ми зрозуміємо, що робить програма, перетворіть її в справжній двійковий машинний код і дамо CPU для запуску.

Тож наша оригінальна інструкція зверху могла виглядати так:

(meaning)      operation type  source register  other source  destination register
(machine code) 0010            0001             0010          0011
("English")    add             r1               r2            r3

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

Ну, це мова монтажу. Ось чому воно існує і чому воно спочатку було створене.

Щоб зрозуміти, навіщо він нам потрібен зараз, прочитайте вищевказані відповіді, але ключовим для розуміння цього є: Мови високого рівня не мають єдиного представлення - це машинний код. Напр. В C, або Python, або що завгодно:

z = x + y

Це звучить так само, як наше доповнення зверху, якщо припустити, що xце в регістрі 1, yв регістрі 2, і zповинно бути в реєстрі 3. Але що з цим рядком?

z = x * 2 + (y / 6) * p + q - r

Спробуйте представити цей рядок у 16 ​​бітах двійкових і скажіть процесору "йти". Ви не можете. У машинному коді немає жодної інструкції з експлуатації для виконання додавання, віднімання та будь-чого іншого з 4 або 5 змінними одночасно. Тож спочатку його потрібно перетворити на послідовність машинного коду. Це те, що ти робиш, коли "компілюєш" чи "інтерпретуєш" мову високого рівня.

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

1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010

Просто для того, щоб виконати цей один рядок Python. Тож ти справді хочеш це налагодити?!?!?! НІ . Швидше ви просите свого компілятора люб’язно дати вам вихід у формі, яку ви насправді легко зрозумієте, що є мовою збірки, що відповідає саме цьому машинному коду. Тоді ви можете зрозуміти, чи робить ваш компілятор щось тупо, і спробувати це виправити.

(Додаткова примітка до порад @ Рафаеля: Ви насправді можете побудувати процесори, які працюють з іншими речами, крім двійкових кодів, як, наприклад, потрійний (основа 3) або десятковий код, або навіть ASCII. Для практичних цілей ми дійсно дотримувались двійкового.)


2
В принципі, ніщо не заважає нам створювати процесори, які працюють безпосередньо з мовою складання. ASCII - це просто неефективне кодування для цієї мети, ось і все.
Рафаель

Дякую за доповнення Я погоджуюся, але пропустив це для розуміння мети складання. Я додам записку.
Кріс Купер

15

То чому ж була створена асемблерна мова? чи це був той, хто став першим навіть перед мовою високого рівня?

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

Чому я вивчаю асемблерів у своєму класі комп'ютерної інженерії?

Якщо вам потрібно запрограмувати драйвери пристроїв або написати компілятори, то розуміння того, як працює процесор, є неоціненним, якщо цього не потрібно. Найкращий спосіб зрозуміти це - написати якийсь код у зборі.

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

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


14

Дозвольте додати ще один менш практичний аспект. Це (мабуть) не історична причина, а причина для вас сьогодні.

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

Це може бути корисно для точного аналізу алгоритму. Семантика і контрольний потік настільки прості, що підрахунок всіх операцій (або очікуваного числа) можна здійснити, анотувавши графік потоку управління з підрахунками переходів (ймовірностей). Кнут робить це в своїх книгах TAoCP дуже ефектно, демонструючи деякі найжорсткіші аналізи алгоритмів.

Анекдот: мій колега навчився читати Java Bytecode саме для цієї мети.


4

Тут є відповіді:

Усі ці відповіді вказують на:

  • Оптимізація швидкості / пам'яті
  • Розуміння того, як працює машина
  • Тож програмісти Noob стають експертами
  • Якщо ви знаєте складання, ви знаєте, як писати компілятори для своєї мови High Lvl
  • тощо

1
Чи поділяєте ви всі ці погляди? Який ваш досвід? (Зокрема, пункт "Так програмісти Noob стають експертами" здається мені застарілим на кілька десятиліть.)
Рафаель

Уааааа, вам не доведеться бути настільки чутливими з цього приводу. Я просто пов'язую відповіді на його повторне запитання. І «Так Noob Програмісти стали експертами» був визнаний самим високим тут . Ідіть сперечайтеся з ним не я =)
compski

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

Ну і мій досвід - я дуже ненавиджу і боюся з вивченням мов асемблерів після того, як я просто звик до деяких мов програмування високого рівня. І я знаю, що ті, хто є хорошими програмістами або заздалегідь знають C ++ / C, можуть досить добре програмувати в ASM. Я не вважав, що моя думка була оцінена достатньо, щоб бути опублікованою у моїй відповіді, ось чому ...
compski

Ваше перше посилання розірвано.
Hola Soy Edu Feliz Navidad

1

Асамблея = машинний код
Деякі люди продовжують думати про те, чим мова збірки відрізняється від числових кодів, які розуміє процесор.
Це (хоча це правда) повністю пропускає суть.
Що стосується перекладу, то мова мовлення та числовий (двійковий, шістнадцятковий) - це одне і те ж.

Виправити його або відкинути.
Якщо ви робите збірку, ви знаєте, як працює власне комп'ютер.
монтаж збірки передбачає:

  • Вивчення інструкцій і що вони означають (да).
  • Розуміння того, що роблять інструкції, чого вони не роблять, та всіх їх побічних ефектів .
  • Дізнатися, як процесор обробляє інструкції
    • Як працює трубопровід.
    • Що multiscalarозначає
    • Що таке ядро ​​процесора.
    • Як працює кеш-пам'ять.
    • Розуміння, як циклічно рахувати
    • засвоєння вчення Агнера Туману
  • Розуміння того, як компілятори генерують код і як вони часом не вдається.
  • Оптимізація чітко визначених і дуже конкретних проблем.

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

Не потрібно ніяких смердючих абстракцій,
якщо ви не захочете збірку (і, таким чином, процесор на операційному столі), ви ніколи не будете позбавлені зчеплення абстракцій машини оперативної пам’яті (або не дай бог машині Тьюрінга жах ).

Асамблея L33t Hax0r 5k1llz
також допомагає зрозуміти, як 133thax0r вдається перемогти схеми захисту. (Питання: чому ASLR не працює ? Тому що mov rax,fs:[28h]порушує його ).

На 0,1%
важливі не знання монтажу, а знання машини, над якою працюєте.
Якщо ви хочете знати машину, ви повинні її зрозуміти, а це означає говорити мовою машини.

Якщо ви цього не зробите, то ви застрягли в абстракції.
Це наука, і це добре, але це ніколи не є повна картина.

Це як навчитися говорити Xhosa
Якщо ви не прагнете до рівня гуру, краще дотримуйтесь того, що знаєте, ці клацання ускладнять ваше життя .

Тому що це весело.


1
Найчастіше вживання слова grok у статті, з якою я коли-небудь стикався
rekciltnuc

-1

На сьогоднішній день я спершу навчився RPG II за допомогою системи IBM 32, а пізніше вивчив APL на 370. Мені було все щодо розміру та швидкості. Моя мантра була меншою і швидшою. Збірка - най компактна та найшвидша мова там. Я би робив тестові програми і в C, і в зборах. У випадках, коли для програм C потрібні 100 Кб, еквівалентна програма складання часто буде менше 5 Кб. Вивчаючи вихід компілятора С, я виявив би код, який би перевіряв і повторно перевіряв параметри, робив умовні перевірки на можливі помилки, які були досить часто рідкісними та екзотичними і зовсім непотрібними, і все це вимагало часу, але найбільша кількість пам'яті проходила абсолютно все до і зі стека.

У сьогоднішньому середовищі програмування письмовий код забезпечує додатковий рівень безпеки та захисту. Можливість читати інформацію безпосередньо з обладнання, недоступного для мов високого рівня, дозволяє шифрувати за допомогою зборки таким чином, що програма може використовуватися лише на цій конкретній машині. Наприклад, зашифруйте ключ користувача за допомогою MAC-адреси мережевого інтерфейсу, а потім паркуйте цей ключ на певному незареєстрованому секторі жорсткого диска, а потім позначте сектор як поганий, щоб інші файли не змогли його перезаписати. Звичайно, ви втрачаєте сектор, але що це? 2048 або 4096 байт з мільярдів чи трильйонів?


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