Зачем нам нужен язык ассемблера?

27

В основном мы пишем программы на языке высокого уровня. Так что во время учебы я наткнулся на ассемблер. Таким образом, ассемблер преобразует язык ассемблера в машинный язык, а компилятор делает то же самое с языком высокого уровня. Я обнаружил, что на ассемблере есть инструкции, такие как move r1 r3, move 5 и т. Д. И это довольно сложно для изучения. Так почему же был создан язык ассемблера или он был первым даже до языка высокого уровня? Почему я изучаю ассемблеры в моем классе компьютерной техники?

Нитин Хосе
источник
13
Ассемблер - это читаемый человеком машинный код, вот почему.
Андрей Бауэр
4
Потому что важно знать, как все работает, когда мы приближаемся к оборудованию. Когда мы пишем сборку, мы понимаем, как аппаратное обеспечение компьютера работает и функционирует на низком уровне. Лучшим способом для этого является язык ассемблера, так как машинный язык утомителен и не читаем как сборка. Вы бы действительно предпочли использовать волшебную коробку и никогда не заглядывать внутрь?
Спенсер Вечорек

Ответы:

32

"Так почему же создан язык ассемблера?"

Язык ассемблера был создан как точное сокращение для машинного кодирования, так что вам не нужно считать 0 и 1 весь день. Он работает так же, как код машинного уровня: с инструкциями и операндами.

"Какой пришел первым?"

В Википедии есть хорошая статья об истории языков программирования

«Почему я изучаю ассемблеры в моем классе компьютерной инженерии?»

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

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

Язык ассемблера настолько близок к процессору, насколько это возможно для программиста, поэтому хорошо продуман хорошо разработанный алгоритм - сборка отлично подходит для оптимизации скорости. Все дело в производительности и эффективности. Язык ассемблера дает вам полный контроль над ресурсами системы. Подобно сборочной линии, вы пишете код для вставки отдельных значений в регистры, непосредственно обращаетесь с адресами памяти для получения значений или указателей. (источник: codeproject.com )

TylerAndFriends
источник
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. Если вы буквально поместите эти значения в ЦП и скажете «go», он добавит вам два числа. Операция «вычитать» могла бы быть 0011 или чем-то, вместо 0010 здесь. Какое бы значение не заставляло процессор делать вычитание.

Таким образом, программа может выглядеть так (не пытайтесь понять это, так как я создал эту конкретную версию машинного кода, чтобы объяснить вещи):

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

Это отстой, чтобы читать? Определенно. Но нам это нужно для процессора . Хорошо, если каждый машинный код соответствует определенному действию, давайте просто создадим простую «английскую» стенографию, а затем, как только мы поймем, что делает программа, преобразуем ее в настоящий двоичный машинный код и передаем его для запуска ЦПУ.

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

(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. Так что вы действительно хотите отладить это?!?!?! NO . Скорее, вы просите, чтобы ваш компилятор любезно предоставил вам вывод в форме, которую вы можете легко понять, которая является версией на ассемблере, точно соответствующей этому машинному коду. Затем вы можете выяснить, что ваш компилятор делает что-то глупое, и попытаться это исправить.

(Дополнительное примечание по совету @ Raphael: вы могли бы на самом деле создавать процессоры, которые работают с вещами, отличными от двоичных кодов, такими как троичные (основание 3) или десятичные коды, или даже ASCII. Однако для практических целей мы действительно придерживались двоичного кода.)

Крис Купер
источник
2
В принципе, ничто не мешает нам создавать процессоры, которые работают непосредственно с языком ассемблера. ASCII - просто неэффективная кодировка для этой цели, вот и все.
Рафаэль
Спасибо за добавление. Я согласен, но пропустил это для понимания цели сборки. Я добавлю заметку.
Крис Купер
15

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

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

Почему я изучаю ассемблеры в моем классе компьютерной техники?

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

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

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

Гай Кодер
источник
14

Позвольте мне добавить еще один практический аспект. Это (вероятно) не историческая причина, а причина для вас сегодня.

Сборка (по сравнению с языками высокого уровня) голая . Он ничего не скрывает (это делается в программном обеспечении) и прост в том смысле, что у него относительно небольшой фиксированный набор операций.

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

Анекдот: мой коллега научился читать Java Bytecode именно для этой цели.

Рафаэль
источник
4

Здесь есть ответы:

Все эти ответы указывают на:

  • Оптимизация скорости / памяти
  • Понимание того, как работает машина
  • Так программисты Noob становятся экспертами
  • Если вы знаете ассемблер, вы знаете, как писать компиляторы для вашего языка высокого уровня
  • так далее
compski
источник
1
Вы разделяете все эти взгляды? Какой у тебя опыт? (В частности, пункт «Итак, программисты Noob становятся экспертами» кажется мне устаревшим на несколько десятилетий.)
Рафаэль
вау вау ты не должен быть настолько обидчивым в этом вопросе. Я просто связываю ответы на его повторяющийся вопрос. И «Так программисты Noob становятся экспертами» получили наибольшее количество голосов здесь . Иди спорь с ним не я =)
compski
1
Я не обидчив, я пытаюсь помочь вам сделать ваш ответ правильным (в настоящее время это не так, поскольку вы ссылаетесь только на несколько ресурсов, ни один из которых не полностью отвечает на вопрос). Включение ваших собственных мыслей в сравнительное сравнение - это первый шаг к этому. (Обратите внимание, что, связывая мнение исключающим образом, вы присваиваете ему значение; другими словами, вы должны быть в состоянии спорить, почему вы цените мнение, достаточное для (повторного) опубликования ответа.)
Рафаэль
Что ж, мой опыт заключается в том, что я действительно ненавижу изучать языки ассемблера после того, как привык к некоторым языкам программирования высокого уровня. И я знаю, что те, кто являются хорошими программистами или знают C ++ / C заранее, могут довольно хорошо программировать на ASM. Я не думаю, что мое мнение было настолько
ценно
Ваша первая ссылка не работает.
Hola Soy Edu Feliz Navidad
1

Сборка = машинный код
Некоторые люди продолжают размышлять о том, как язык ассемблера отличается от числовых кодов, которые понимает процессор.
Это (хотя и правда) совершенно не соответствует сути.
Что касается перевода, то ассемблер и числовой (двоичный, шестнадцатеричный и т. Д.) - это одно и то же.

Грок это или уронить
Если вы грок сборки, вы знаете, как работает настоящий компьютер.
Сборка гроккинга включает в себя:

  • Изучение инструкций и что они значат (дух).
  • Понимание того, что делают инструкции, что они не делают, и всех их побочных эффектов .
  • Изучение того, как процессор обрабатывает инструкции
    • Как работает трубопровод.
    • Что multiscalarзначит
    • Что такое ядро ​​процессора?
    • Как работает кеш.
    • Понимание того, как считать цикл
    • изучая учения Агнера Тумана
  • Понимание того, как компиляторы генерируют код и как они иногда терпят неудачу.
  • Оптимизация четко определенных и очень специфических проблем.

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

Не нужно никаких вонючих абстракций.
Если вы не пойдете сборкой (и, следовательно, процессором на операционном столе), вы никогда не освободитесь от цепей абстракций машины с ОЗУ (или не дай бог машине Тьюринга ужас ).

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

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

Если нет, то вы застряли в абстракции.
Это наука, и это хорошо, но это не полная картина.

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

Потому что это весело.

Йохан - восстановить Монику
источник
1
Наиболее частое использование слова grok в статье, с которой я когда-либо сталкивался
rekciltnuc
-1

На сегодняшний день я сначала изучил RPG II с использованием IBM System 32, а затем изучил APL на 370. Я был все о размере и скорости. Моя мантра была меньше и быстрее. Сборка - самый компактный и быстрый язык. Я бы сделал тестовые программы как на C, так и на Assembly. Если для программ на С требуется 100 КБ, эквивалентная программа сборки часто будет меньше 5 КБ. При изучении выходных данных компилятора C я обнаружил, что код, который проверял бы и перепроверял параметры, делал условные проверки на возможные ошибки, которые были довольно редкими, экзотическими и совершенно ненужными, и все это занимало время, но наибольшее раздувание памяти проходило абсолютно все в и из стека.

В современной среде программирования написание кода обеспечивает дополнительный уровень безопасности и защиты. Возможность считывать информацию непосредственно с аппаратного обеспечения, которое недоступно для языков высокого уровня, позволяет шифровать с помощью Assembly таким образом, чтобы программа могла использоваться только на этом конкретном компьютере. Например, шифрование пользовательского ключа с использованием MAC-адреса сетевого интерфейса, а затем парковка этого ключа в определенном незарегистрированном секторе жесткого диска, затем маркировка сектора как плохого, чтобы другие файлы не могли его перезаписать. Конечно, вы теряете сектор, но что это? 2048 или 4096 байтов из миллиардов или триллионов?

Brian3163
источник
1
Что вообще означает «недоступный для языков высокого уровня»?
Дэвид Ричерби