Зачем нам нужен язык ассемблера?
Ну, на самом деле нам нужен только один язык , который называется «машинный язык» или «машинный код». Это выглядит так:
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. Однако для практических целей мы действительно придерживались двоичного кода.)