Нет прототипа функции, вот и все, поэтому сигнатура функции выведена и выводится неправильно. Добавить "void a ();" в верхней части файла, и вы все настроены.
Машинный код является двоичным (1's и 0) код, который может быть выполнен непосредственно ЦП. Если бы необходимо было открыть файл машинного кода в текстовом редакторе, то Вы видели бы мусор, включая непечатные символы (не, не те непечатные символы;)).
Объектный код является частью машинного кода, который еще не был связан в полную программу. Это - машинный код для одной конкретной библиотеки или модуля, который составит завершенный продукт. Это может также содержать заполнителей или смещения, не найденные в машинном коде завершенной программы. компоновщик будет использовать этих заполнителей и смещения для соединения всего вместе.
Ассемблерный код является простым текстом и (несколько) человеческим читаемым исходным кодом, который главным образом имеет прямое 1:1 аналог с машинными командами. Это выполняется с помощью мнемоники для фактических инструкций, регистров или других ресурсов. Примеры включают JMP
и MULT
для инструкций по переходу и умножению ЦП. В отличие от машинного кода, ЦП не понимает ассемблерный код. Вы преобразовываете ассемблерный код в машину с использованием ассемблер или компилятор , хотя мы обычно думаем о компиляторах в сотрудничестве с высокоуровневым языком программирования, которые абстрагированы далее из инструкций по ЦП.
Здание полная программа включает запись исходный код для программы или в блоке или в высокоуровневом языке как C++. Исходный код собран (для ассемблерного кода) или скомпилирован (для высокоуровневых языков) к объектному коду, и отдельные модули соединены для становления машинным кодом для заключительной программы. В случае очень простых программ не может быть необходим связывающийся шаг. В других случаях такой как с IDE (интегрированная среда разработки) компоновщик и компилятор могут быть вызваны вместе. В других случаях сложное делает сценарий или , файл решения может использоваться для сообщения среды, как создать заключительное приложение.
существуют также интерпретируемые языки , которые ведут себя по-другому. Интерпретируемые языки полагаются на машинный код специальной программы интерпретатора. На базовом уровне интерпретатор анализирует исходный код и сразу преобразовывает команды в новый машинный код и выполняет их. Современные интерпретаторы, иногда также названные среда выполнения или виртуальная машина , намного более сложны: оценка целых разделов исходного кода за один раз, кэширования и оптимизации, если это возможно, и справления со сложными задачами управления памятью. Интерпретируемый язык может также быть предварительно скомпилирован в промежуточный язык низшего уровня или байт-код, подобный ассемблерному коду.
8B 5D 32
машинный код
mov ebx, [ebp+32h]
, блок
lmylib.so
содержащий 8B 5D 32
, объектный код
Ассемблерный код является человекочитаемым представлением машинного кода:
mov eax, 77
jmp anywhere
Машинный код является чистым шестнадцатеричным кодом:
5F 3A E3 F1
я предполагаю, что Вы имеете в виду объектный код как в объектном файле. Это - вариант машинного кода с различием, что переходы являются видом параметризованных, таким образом, что компоновщик может заполнить их.
ассемблер используется для преобразования ассемблерного кода в машинный код (объектный код), компоновщик связывает несколько объектов (и библиотека) файлы для генерации исполняемого файла.
я когда-то записал ассемблерную программу в чистом шестнадцатеричном числе (никакой доступный ассемблер) к счастью, это было путем назад на старых добрых (древних) 6502. Но я рад, что существуют ассемблеры для кодов операций Pentium.
Ассемблерный код обсужден здесь .
"Ассемблер является низкоуровневым языком для программирования компьютеров. Это реализует символьное представление числовых машинных кодов, и другие константы должны были программировать конкретную архитектуру ЦП".
Машинный код обсужден здесь .
"Машинный код или машинный язык являются системой инструкций и данных, выполняемых непосредственно центральным процессором компьютера".
В основном, ассемблерный код является языком, и это переводится в объектный код (собственный код, который ЦП выполняет) ассемблером (аналогичный компилятору).
Я думаю, что это основные отличия
, Удобочитаемость может сделать код улучшенным или заняла место спустя 6 месяцев после того, как это было создано с litte усилием, с другой стороны, если производительность очень важна, что можно хотеть использовать низкоуровневый язык для предназначения для определенных аппаратных средств, которые Вы будете иметь в производстве, так для получения более быстрого выполнения.
IMO сегодня компьютеры достаточно быстры, чтобы позволить программисту получить быстрое выполнение с ООП.
Блок является короткими людьми описательных терминов, может понять, что это может быть непосредственно переведено в машинный код, который на самом деле использует ЦП.
, В то время как несколько понятный людьми, Ассемблер является все еще низким уровнем. Требуется много кода, чтобы сделать что-либо полезное.
Так вместо этого мы используем высокоуровневые языки, такие как C, ОСНОВНОЙ, FORTAN (хорошо, я знаю, что встречался со мной). Когда скомпилировано они производят объектный код. Ранние языки имели машинный язык как свой объектный код.
Много языков сегодня такой JAVA и C# обычно компилируют в байт-код, который не является машинным кодом, но тем, который легко можно интерпретироваться во время выполнения для создания машинного кода.
Исходные файлы Ваших программ компилируются в объектные файлы, и затем компоновщик соединяет те объектные файлы, производя исполняемый файл включая машинные коды Вашей архитектуры.
И объектный файл и исполняемый файл включают машинный код архитектуры в форме печатаемых и непечатаемых символов, когда он открыт текстовым редактором.
, Тем не менее, дихотомия между файлами - то, что объектный файл (файлы) может содержать неразрешенные внешние ссылки (такой как printf
, например). Так, это, возможно, должно быть связано против других объектных файлов.. То есть неразрешенные внешние ссылки необходимы, чтобы быть разрешенными для получения достойного выполнимого исполняемого файла путем соединения с другими объектными файлами, такими как библиотека времени выполнения C/C++.
В других ответах хорошо описана разница, но вы также просили визуализацию. Вот диаграмма, показывающая, что они переходят от кода C к исполняемому файлу.