Ассемблерный код против машины против кода объектный код?
в чем разница между объектным кодом, машинным кодом и ассемблерным кодом?
можете ли вы привести наглядный пример их различия?
8 ответов:
код это двоичный (1's и 0's) код, который может быть выполнен непосредственно процессором. Если вы откроете файл машинного кода в текстовом редакторе, вы увидите мусор, включая непечатаемые символы (нет, не те непечатаемые символы ;) ).
объектный код - это часть машинного кода, которая еще не была связана в полную программу. Это машинный код для одной конкретной библиотеки или модуля, который будет составлять готовое изделие. Он также может содержать заполнители или смещения не нашли в машинный код завершения программы. Элемент линкер будет использовать эти заполнители и смещений, чтобы соединить все вместе.
ассемблерный код это простой текст и (несколько) человеческий читаемый исходный код, который в основном имеет прямой аналог 1:1 с машинными инструкциями. Это достигается с помощью мнемоники для фактических инструкций, регистров или других ресурсов. Примеры включают в себя
JMP
иMULT
для инструкций перехода и умножения процессора. В отличие от машинного кода, процессор не понимает ассемблерный код. Вы преобразуете ассемблерный код в машинный с помощью сборщик или компилятор, хотя мы обычно думаем о компиляторах в сочетании с языком программирования высокого уровня, которые абстрагируются дальше от инструкций процессора.создание полной программы включает в себя написание исходный код для программа на ассемблере или языке более высокого уровня, например C++. Исходный код собирается (для ассемблерного кода) или компилируется (для языков более высокого уровня) в объектный код, и отдельные модули связываются вместе, чтобы стать машинным кодом для окончательной программы. В случае очень простых программ шаг связывания может быть не нужен. В других случаях, например, в интегрированной среде разработки (IDE) компоновщик и компилятор могут быть вызваны вместе. В других случаях сложнее сделать сценарий или решение файл может быть использован, чтобы сказать среде, как построить окончательное приложение.
также интерпретируемых языках что ведут себя по-разному. Интерпретируемые языки опираются на машинный код специальной программы-интерпретатора. На базовом уровне интерпретатор анализирует исходный код и сразу же преобразует команды в новый машинный код и выполняет их. Современные переводчики, иногда также называемые среда-окружающая среда или виртуальная машина, гораздо сложнее: оценка целых разделов исходного кода за один раз, кэширование и оптимизация, где это возможно, и обработка сложных задач управления памятью. Интерпретируемый язык также может быть предварительно скомпилирован в промежуточный язык более низкого уровня или байт-код, подобный ассемблерному коду.
другие ответы дали хорошее описание разницы, но вы также попросили визуальный. Вот диаграмма, показывающая, что они путешествуют от кода C к исполняемому файлу.
ассемблерный код-это читаемое человеком представление машинного кода:
mov eax, 77 jmp anywhere
машинный код-это чистый шестнадцатеричный код:
5F 3A E3 F1
Я предполагаю, что вы имеете в виду объектный код в объектный файл. Это вариант машинного кода, с той разницей, что прыжки являются своего рода параметризованными, так что компоновщик может их заполнить.
ассемблер используется для преобразования кода сборки в машинный код (объектный код) Компоновщик связывает несколько объектных (и библиотечных) файлов для создания исполняемого файла.
Я однажды написал ассемблерную программу в чистом шестнадцатеричном формате (нет ассемблера), к счастью, это было еще на старом добром (Древнем) 6502. Но я рад, что есть ассемблеры для опкодов pentium.
8B 5D 32
- это машинный код
mov ebx, [ebp+32h]
сборка
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 месяцев после его создания с небольшим усилием, с другой стороны, если производительность критична, вы можете использовать язык низкого уровня для целевого использования конкретного оборудования, которое у вас будет в производстве, чтобы ускорить выполнение.
ИМО сегодня компьютеры достаточно быстро, чтобы позволить программисту получить быстрое выполнение с ООП.
сборка-это короткие описательные термины, которые люди могут понять, которые могут быть непосредственно переведены в машинный код, который фактически использует процессор.
хотя это несколько понятно людям, ассемблер все еще находится на низком уровне. Это требует много кода, чтобы сделать что-нибудь полезное.
поэтому вместо этого мы используем языки более высокого уровня, такие как C, BASIC, FORTAN (хорошо, я знаю, что встречался сам). При компиляции они производят объектный код. Ранние языки имели машинный язык в качестве своего объекта код.
многие языки сегодня такие JAVA и C# обычно компилируются в байт-код, который не является машинным кодом, но который легко интерпретируется во время выполнения для создания машинного кода.