В основном мы пишем программы на языке высокого уровня. Так что во время учебы я наткнулся на ассемблер. Таким образом, ассемблер преобразует язык ассемблера в машинный язык, а компилятор делает то же самое с языком высокого уровня. Я обнаружил, что на ассемблере есть инструкции, такие как move r1 r3, move 5 и т. Д. И это довольно сложно для изучения. Так почему же был создан язык ассемблера или он был первым даже до языка высокого уровня? Почему я изучаю ассемблеры в моем классе компьютерной техники?
programming-languages
education
history
Нитин Хосе
источник
источник
Ответы:
"Так почему же создан язык ассемблера?"
Язык ассемблера был создан как точное сокращение для машинного кодирования, так что вам не нужно считать 0 и 1 весь день. Он работает так же, как код машинного уровня: с инструкциями и операндами.
"Какой пришел первым?"
В Википедии есть хорошая статья об истории языков программирования
«Почему я изучаю ассемблеры в моем классе компьютерной инженерии?»
источник
Ну, на самом деле нам нужен только один язык , который называется «машинный язык» или «машинный код». Это выглядит так:
Это единственный язык, на котором ваш компьютер может говорить напрямую. Это язык, на котором говорит процессор (и технически разные типы процессоров говорят на разных версиях). Это также отстой смотреть и пытаться понять.
К счастью, каждый раздел двоичного кода соответствует определенному значению. Он разделен на несколько разделов:
Эти значения соответствуют:
Таким образом, эта операция добавит числа в регистры 1 и 2 и поместит это значение в регистр 3. Если вы буквально поместите эти значения в ЦП и скажете «go», он добавит вам два числа. Операция «вычитать» могла бы быть 0011 или чем-то, вместо 0010 здесь. Какое бы значение не заставляло процессор делать вычитание.
Таким образом, программа может выглядеть так (не пытайтесь понять это, так как я создал эту конкретную версию машинного кода, чтобы объяснить вещи):
Это отстой, чтобы читать? Определенно. Но нам это нужно для процессора . Хорошо, если каждый машинный код соответствует определенному действию, давайте просто создадим простую «английскую» стенографию, а затем, как только мы поймем, что делает программа, преобразуем ее в настоящий двоичный машинный код и передаем его для запуска ЦПУ.
Таким образом, наша оригинальная инструкция сверху может выглядеть так:
Обратите внимание, что эта английская версия имеет точное сопоставление с машинным кодом . Поэтому, когда мы пишем строку этого «английского», мы на самом деле просто пишем более дружественный и более понятный машинный код.
Ну, это язык ассемблера. Вот почему он существует, и почему он был изначально создан.
Чтобы понять, зачем нам это нужно сейчас, прочитайте приведенные выше ответы, но ключ к пониманию заключается в следующем: языки высокого уровня не имеют единственного представления - это машинный код. Например, в C, или Python, или как угодно:
Это звучит так же, как наше добавление сверху, предполагая, что оно
x
находится в регистре 1,y
в регистре 2 иz
должно в итоге оказаться в регистре 3. Но как насчет этой строки?Попробуйте представить эту строку в 16-битном двоичном коде и сказать процессору "идти". Ты не можешь В машинном коде нет ни одной инструкции по выполнению сложения, вычитания и прочего с 4 или 5 переменными одновременно. Так что сначала его нужно преобразовать в последовательность машинного кода. Это то, что вы делаете, когда вы «компилируете» или «интерпретируете» язык высокого уровня.
Ну, у нас есть программы для этого, так зачем нам нужна сборка сейчас? Хорошо, скажем, ваша программа работает медленнее, чем вы ожидаете, и вы хотите знать, почему. Если посмотреть на «вывод» этой строки на машинном языке, это может выглядеть так:
Просто, чтобы закончить одну строчку Python. Так что вы действительно хотите отладить это?!?!?! NO . Скорее, вы просите, чтобы ваш компилятор любезно предоставил вам вывод в форме, которую вы можете легко понять, которая является версией на ассемблере, точно соответствующей этому машинному коду. Затем вы можете выяснить, что ваш компилятор делает что-то глупое, и попытаться это исправить.
(Дополнительное примечание по совету @ Raphael: вы могли бы на самом деле создавать процессоры, которые работают с вещами, отличными от двоичных кодов, такими как троичные (основание 3) или десятичные коды, или даже ASCII. Однако для практических целей мы действительно придерживались двоичного кода.)
источник
Да, ассемблер был одним из первых языков программирования, который использовал текст в качестве ввода, в отличие от пайки проводов, с использованием монтажных плат и / или переключающих переключателей. Каждый язык ассемблера был создан только для одного процессора или семейства процессоров, поскольку инструкции отображались непосредственно в кодах операций, выполняемых процессором.
Если вам нужно программировать драйверы устройств или писать компиляторы, то понимание того, как работает процессор, неоценимо, если не требуется. Лучший способ понять это - написать код на ассемблере.
Если вы посмотрите на то, как компилятор пишет код, то часто можно увидеть варианты соглашений о вызовах, которые без знания сборки, вероятно, невозможно понять.
Если вам нужно устранить ошибку и единственный вход, который у вас есть, это дамп ядра , то вам определенно нужно знать ассемблер, чтобы понять вывод, который является кодом ассемблера, и, если повезет, дополнен операторами более высокого уровня языка высокого уровня.
источник
Позвольте мне добавить еще один практический аспект. Это (вероятно) не историческая причина, а причина для вас сегодня.
Сборка (по сравнению с языками высокого уровня) голая . Он ничего не скрывает (это делается в программном обеспечении) и прост в том смысле, что у него относительно небольшой фиксированный набор операций.
Это может быть полезно для точного анализа алгоритма. Семантика и поток управления настолько просты, что подсчет всех операций (или ожидаемого числа) можно выполнить путем аннотирования графика потока управления с помощью счетчиков переходов (вероятностей). Кнут делает это в своих книгах TAoCP с большим эффектом, демонстрируя некоторые из самых строгих алгоритмов анализа, которые есть.
Анекдот: мой коллега научился читать Java Bytecode именно для этой цели.
источник
Здесь есть ответы:
Когда нам нужен язык ассемблера? на программистов.SE
Зачем нужен ассемблер, если у нас есть языки высокого уровня, предлагающие сложные инструменты? на Stackoverflow
Зачем изучать ассемблер? Гэри Л. Берт
Все эти ответы указывают на:
источник
Сборка = машинный код
Некоторые люди продолжают размышлять о том, как язык ассемблера отличается от числовых кодов, которые понимает процессор.
Это (хотя и правда) совершенно не соответствует сути.
Что касается перевода, то ассемблер и числовой (двоичный, шестнадцатеричный и т. Д.) - это одно и то же.
Грок это или уронить
Если вы грок сборки, вы знаете, как работает настоящий компьютер.
Сборка гроккинга включает в себя:
multiscalar
значитЕсли вы пойдете сборкой, у вас будет почти полная картина того, как работает процессор, подключенный к вашей клавиатуре.
Вы должны использовать эти знания, как мозговой хирург использует свой скальпель.
Не нужно никаких вонючих абстракций.
Если вы не пойдете сборкой (и, следовательно, процессором на операционном столе), вы никогда не освободитесь от цепей абстракций машины с ОЗУ (или не дай бог машине Тьюринга ужас ).
Сборка L33t Hax0r 5k1llz
также помогает вам понять, как 133thax0r удается победить схемы защиты. (Q: почему ASLR не работает ? Потому что
mov rax,fs:[28h]
ломает его ).0,1%
Важен не знание сборки, а знание машины, над которой вы работаете.
Если вы хотите знать машину, вы должны понимать ее, а это значит говорить на языке машины.
Если нет, то вы застряли в абстракции.
Это наука, и это хорошо, но это не полная картина.
Это как учиться говорить на коса.
Если вы не стремитесь к уровню гуру, лучше придерживайтесь того, что вы знаете, эти клики усложнят вашу жизнь .
Потому что это весело.
источник
На сегодняшний день я сначала изучил RPG II с использованием IBM System 32, а затем изучил APL на 370. Я был все о размере и скорости. Моя мантра была меньше и быстрее. Сборка - самый компактный и быстрый язык. Я бы сделал тестовые программы как на C, так и на Assembly. Если для программ на С требуется 100 КБ, эквивалентная программа сборки часто будет меньше 5 КБ. При изучении выходных данных компилятора C я обнаружил, что код, который проверял бы и перепроверял параметры, делал условные проверки на возможные ошибки, которые были довольно редкими, экзотическими и совершенно ненужными, и все это занимало время, но наибольшее раздувание памяти проходило абсолютно все в и из стека.
В современной среде программирования написание кода обеспечивает дополнительный уровень безопасности и защиты. Возможность считывать информацию непосредственно с аппаратного обеспечения, которое недоступно для языков высокого уровня, позволяет шифровать с помощью Assembly таким образом, чтобы программа могла использоваться только на этом конкретном компьютере. Например, шифрование пользовательского ключа с использованием MAC-адреса сетевого интерфейса, а затем парковка этого ключа в определенном незарегистрированном секторе жесткого диска, затем маркировка сектора как плохого, чтобы другие файлы не могли его перезаписать. Конечно, вы теряете сектор, но что это? 2048 или 4096 байтов из миллиардов или триллионов?
источник