Код сборки 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# обычно компилируются в байт-код, который не является машинным кодом, но который легко интерпретируется во время выполнения для создания машинного кода.