Код сборки против машинного кода против объектного кода? - PullRequest
207 голосов
/ 21 января 2009

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

Можете ли вы привести наглядный пример их различия?

Ответы [ 9 ]

265 голосов
/ 21 января 2009

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

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

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

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

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

115 голосов
/ 31 июля 2009

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

image

47 голосов
/ 21 января 2009

Ассемблерный код представляет собой удобочитаемое представление машинного кода:

mov eax, 77
jmp anywhere

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

5F 3A E3 F1

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

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

Я однажды написал программу на ассемблере в чистом шестнадцатеричном формате (ассемблер не доступен), к счастью, это было в далеком старом (старом) 6502. Но я рад, что есть ассемблеры для кодов операций Pentium.

17 голосов
/ 21 января 2009

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

mov ebx, [ebp+32h] это сборка

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

7 голосов
/ 19 декабря 2010

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

$1902: BD 37 14 : LDA $1437,X
$1905: 85 03    : STA $03
$1907: 85 09    : STA $09
$1909: CA       : DEX
$190A: 10       : BPL $1902

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

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

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

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

2 голосов
/ 07 апреля 2019

Исходный код, код сборки, машинный код, код объекта, байт-код, исполняемый файл и файл библиотеки.

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


Types of code


Исходный код

Инструкции на человекочитаемом (программирующем) языке

1020 *
*

код высокого уровня

Инструкции, написанные на языке высокого уровня (программирования)
Например, программы на C, C ++ и Java


Код сборки

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


Код объекта

Продукт процесса компиляции. Это может быть в форме машинного кода или байтового кода.
Например, file.o


Машинный код

Инструкции на машинном языке.
Например, a.out


Байт-код

Инструкция в промежуточной форме, которая может быть выполнена таким переводчиком, как JVM.
Например, файл классов Java

* *
тысяча сорок-девять

Исполняемый файл

Продукт связывания процесса. Это машинный код, который может напрямую выполняться процессором.
Например, файл .exe.

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


Библиотечный файл

Некоторый код скомпилирован в эту форму по разным причинам, например, для повторного использования и позднее используется исполняемыми файлами.

1 голос
/ 21 января 2009

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

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

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

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

1 голос
/ 21 января 2009

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

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

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

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

1 голос
/ 21 января 2009

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

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

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

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

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

...