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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

kKTfY.png

Ответ 3

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

mov eax, 77
jmp anywhere

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

5F 3A E3 F1

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

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

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

Ответ 4

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

mov ebx, [ebp+32h] является сборкой

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

Ответ 5

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

$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. Использование этого стиля ассемблера упрощает запись и редактирование кода, чем это было бы возможно, если бы вам приходилось вручную и вручную поддерживать все адреса.

Ответ 6

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

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

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

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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


Types of code


Исходный код

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


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

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


Код сборки

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


Код объекта

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


Машинный код

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


Байт код

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


Запускаемый файл

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

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


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

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

Ответ 9

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

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

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

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