Во-первых, «двоичный» не означает, что вы думаете, что он означает (любые данные на компьютере, включая текст, уже двоичные, просто то, как мы решили отображать и обрабатывать, отличается).
Во-вторых, компиляция не является простым преобразованием в забавные символы (если бы это было так, нам не понадобились бы разные компиляторы для разных языков). Чтобы действительно иметь представление о машинном коде, вам необходимо понимать архитектуру, на которую он ориентирован. Существует много компьютерных архитектур, ваш компьютер - только одна из них. Это очень широкая тема, и для ее понимания необходимо твердое понимание архитектуры компьютера.
Я покажу пример инструкции MIPS. Если вы заинтересованы, вы можете прочитать и получить некоторые реальные знания по этому вопросу, попробуйте ссылки в конце моего поста.
MIPS является популярным вводным предметом, потому что его формат инструкции является одним из наиболее удобных для восприятия. Инструкции MIPS имеют ширину 32 бита. В MIPS есть 3 вида инструкций: «R», «I» и «J». Мы посмотрим на инструкции «Я».
Когда процессор получает инструкцию (32 бита данных), он читает ее и решает, что с ней делать. «Я» инструкции выглядят так:
|------|-----|-----|----------------|
opcode rs rt immediate
6 5 5 16 (the numbers show how wide are each part)
Значение этих:
- код операции сообщает, что это за инструкция (например: сложение, вычитание, умножение и многие другие). Все инструкции (включая типы «R» и «J») начинаются с 6-битного кода операции, и вот как процессор знает, какой он.
- rs и rt являются регистрами, своего рода хранилищем в процессоре, которое может содержать 32-битные значения. MIPS имеет 32 из них, и они идентифицируются по их номеру. Это не то же самое, что память, это внутри самого процессора.
- немедленный является числом. Это называется потому, что номер «прямо там» в инструкции, а не в регистре или памяти.
Конкретный пример добавления немедленного к числу, хранящемуся в регистре:
001000 00001 00010 0000000000000011
В этом примере я разбил инструкцию на части, как указано выше. Значение значений следующее:
- код операции :
001000
означает addi
или «добавить немедленно».
- rs :
00001
- это 1
в десятичном виде, поэтому эта часть инструкции сообщает процессору, что мы хотим использовать регистр 1 как rs .
- rd :
00010
- это 2
в десятичном виде, та же идея, что и для rs.
- немедленное :
0000000000000011
равно 3
в десятичном виде.
Инструкция addi
работает следующим образом: она принимает значение, найденное в rs , и добавляет к нему значение немедленное . После этого он помещает результат в rd . Итак, когда инструкция выполнена, rd будет содержать 3 + 2 = 5.
В двух словах, компиляторы анализируют ваш текст и генерируют инструкции для целевого процессора, который делает то же самое, что вы намеревались сделать с вашей программой. Как видите, существует огромный разрыв между текстовым представлением программы, которую пишут программисты, и работоспособным машинным кодом.
Несколько полезных ресурсов по MIPS и компьютерной архитектуре: