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


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

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

8 187

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