Код сборки vs машинный код vs объектный код?

в чем разница между объектным кодом, машинным кодом и кодом сборки?

можете ли вы привести визуальный пример их разницы?

8 ответов


код является двоичным (1 и 0) кодом,который может выполняться непосредственно процессором. Если вы откроете файл машинного кода в текстовом редакторе, вы увидите мусор, включая непечатаемые символы (нет, не те непечатаемые символы ;) ).

объектный код - это часть машинного кода, который еще не был связан в полной программе. Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовое изделие. Он также может содержать заполнители или смещения не нашли в машинный код завершения программы. The линкер будет использовать эти заполнители и смещений, чтобы соединить все вместе.

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

построение полной программы включает в себя написание исходный код для программа в сборке или на языке более высокого уровня, таком как C++. Исходный код собирается (для кода сборки) или компилируется (для языков более высокого уровня) в объектный код, а отдельные модули соединяются вместе, чтобы стать машинным кодом для окончательной программы. В случае очень простых программ шаг связывания может не потребоваться. В других случаях, например, с IDE (интегрированной средой разработки) компоновщик и компилятор могут вызываться вместе. В других случаях сделать сценарий или решение файл может использоваться, чтобы сообщить среде, как построить окончательное приложение.

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


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


Assembly code-это читаемое человеком представление машинного кода:

mov eax, 77
jmp anywhere

машинный код-это чистый шестнадцатеричный код:

5F 3A E3 F1

Я предполагаю, что вы имеете в виду объектный код в объектный файл. Это вариант машинного кода, с той разницей, что прыжки своего рода параметризованы так, что компоновщик может их заполнить.

ассемблер используется для преобразования кода сборки в машинный код (объектный код) Компоновщик связывает несколько объектных (и библиотечных) файлов для создания исполняемого файла.

Я когда-то написал программу ассемблера в чистом hex (нет ассемблера), к счастью, это было давно на старом (Древнем) 6502. Но я рад, что есть ассемблеры для опкодов pentium.


8B 5D 32 - это машинный код

mov ebx, [ebp+32h] is assembly

lmylib.so содержащих 8B 5D 32 - Это объектный код


один момент еще не упомянут, что существует несколько различных типов кода сборки. В самой простой форме все числа, используемые в инструкциях, должны быть указаны как константы. Например:

02: BD 37 14 : LDA 37,X
05: 85 03    : STA 
07: 85 09    : STA 
09: CA       : DEX
0A: 10       : BPL 02

приведенный выше бит кода, если он хранится по адресу $1900 в картридже Atari 2600, отобразит несколько строк разных цветов, извлеченных из таблицы, которая начинается с адреса $1437. На некоторых инструментах, набрав адрес, вместе с самой правой частью строки выше, сохранит в памяти значения, показанные в среднем столбце, и начнет следующую строку со следующего адреса. Вводить код в такой форме было гораздо удобнее, чем вводить шестнадцатеричный, но нужно было знать точные адреса всего.

большинство ассемблеров позволяют использовать символические адреса. Приведенный выше код будет написан примерно так:

rainbow_lp:
  lda ColorTbl,x
  sta WSYNC
  sta COLUBK
  dex
  bpl rainbow_lp

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


обсуждается код сборки здесь.

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

обсуждается машинный код здесь.

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

в принципе, код ассемблера-это язык, и он переводится в объектный код (собственный код, который запускает процессор) ассемблером (аналогично компилятору).


Я думаю, что это основные различия

  • читабельность кода
  • контроль над тем, что делает ваш код

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

IMO сегодня компьютеры достаточно быстро, чтобы позволить программисту получить быстрое выполнение с ООП.


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

хотя это несколько понятно людям, ассемблер все еще находится на низком уровне. Требуется много кода, чтобы сделать что-то полезное.

поэтому вместо этого мы используем языки более высокого уровня, такие как C, BASIC, FORTAN (хорошо, я знаю, что я встречался сам). При компиляции они создают объектный код. Ранние языки имели в качестве объекта машинный язык. код.

многие языки сегодня такие JAVA и C# обычно компилируются в байт-код, который не является машинным кодом, но который легко интерпретируется во время выполнения для создания машинного кода.