Что преобразует язык ассемблера в машинный код

Я новичок в программировании, и я начал с языка C ++, насколько мне известно, язык C ++ конвертируется в язык ассемблера компилятором C ++ (например, Visual Studio), но я попытался найти то, что преобразует язык ассемблера в машинный код, чтобы быть понятым и выполненным компьютером, но я не мог найти ответа.

Итак, вопрос в том, где и как ассемблер конвертируется в машинный код? это какой-то компилятор, интегрированный в ОС?

Заранее спасибо.


person Karim K.    schedule 25.07.2014    source источник
comment
Нет, это происходило только в былые времена. Типичный этап начальной загрузки, но никто не хочет ждать дополнительного необходимого прохода ассемблера. Остается только то, что компиляторы C и C ++ по-прежнему имеют возможность генерировать листинг сборки.   -  person Hans Passant    schedule 25.07.2014
comment
Компилятор Microsoft C ++ генерирует машинный код напрямую, тогда как компилятор GNU C генерирует ассемблер, а затем использует ассемблер для преобразования его в машинный код.   -  person Ross Ridge    schedule 25.07.2014
comment
Компиляторы Microsoft могут выводить ассемблерный код. Я не знаю, есть ли возможность скомпилировать код сборки, а затем собрать код сборки. Ассемблер Microsoft - это ML.EXE для 32-битной версии и ML64.EXE для 64-битной версии. Также существует MASM.EXE, который в некоторых случаях относится к версиям MASM 5.x, в то время как ML.EXE было / является новым именем для MASM 6.x или более поздних версий.   -  person rcgldr    schedule 25.07.2014


Ответы (4)


Некоторые компиляторы (например, GNU) преобразуют код C / C ++ в код сборки. Инструмент под названием «ассемблер» преобразует код сборки в машинный код, а инструмент под названием «компоновщик» соединяет несколько файлов машинного кода в один исполняемый файл (.EXE в Windows). Большинство этих компиляторов позволяют записать результирующий код ассемблера в файл, чтобы вы могли просмотреть код ассемблера или изменить его.

Ассемблер и компоновщик являются частью цепочки инструментов, что означает, что они обычно поставляются вместе с компилятором.

Однако некоторые компиляторы (например, Microsoft) напрямую преобразуют код C / C ++ в машинный язык, поэтому ассемблер больше не нужен. Многие из этих компиляторов не могут создавать код ассемблера, поэтому вы не можете записать код ассемблера в файл.

Между прочим: существуют даже компиляторы (не для C / C ++, а для других языков программирования), которые напрямую создают файл .EXE, поэтому компоновщик не требуется.

person Martin Rosenau    schedule 25.07.2014
comment
Но если так ... почему не все компиляторы конвертируют язык программирования высокого уровня непосредственно в машинный код, а не в ассемблер? не лучше бы? Я имею в виду, что из того, что я прочитал, язык ассемблера облегчает пользователю чтение низкоуровневого кода, но не позволяет компьютеру запускать программу. - person Karim K.; 25.07.2014
comment
В любом случае вам понадобится ассемблер, потому что какой-то код (в ядре ОС) не может быть написан на языке высокого уровня. Код ассемблера легче генерировать и легче отлаживать, поэтому написание кода ассемблера упрощает разработку компилятора. Некоторые типы ЦП используют другой машинный код, но одни и те же инструкции ассемблера (исторический пример: 6800/6809; современные примеры: ЦП со смешанным порядком байтов, ARM abi / thumb). В этих случаях вам нужен только один компилятор для двух процессоров. - person Martin Rosenau; 28.10.2015
comment
clang / LLVM также напрямую испускает машинный код, но они говорят об этом так, что он использует встроенный внутренний ассемблер. Он по-прежнему может компилировать код, использующий встроенный синтаксис asm GNU C. Однако инструкции, сгенерированные компилятором, могут никогда не проходить через текстовое представление; Я не уверен. clang и MSVC абсолютно могут выводить asm для чтения пользователями (даже с комментариями); вам не нужно просто разбирать объектные файлы. - person Peter Cordes; 21.07.2016
comment
Привет @MartinRosenau, я хочу понять, когда ассемблерный код конвертируется в машинный код. Поскольку Kind of Cpu, на котором он будет работать, известен только во время выполнения, Итак, как это обрабатывается. Означает ли это, что ассемблер конвертируется в машинный код, когда пользователь дважды щелкает exe-файл. Я говорю в контексте языка C. И вторые компиляторы Microsoft, которые преобразуют непосредственно в машинный код, справляются с этой ситуацией. - person Gajanan Kulkarni; 29.10.2020

Когда компилятор преобразует код высокого уровня в язык ассемблера, который выглядит примерно так:

  • MOV AX, [A]; # Переместите A, чтобы зарегистрировать Ax
  • ДОБАВИТЬ AX, [B]; # Добавить B в A
  • IMUL AX; # Квадрат (A + B)
  • MOV [C], AX;

Ассемблер преобразует эти инструкции сборки в машинный код.

Инструкция по сборке имеет типичную форму: код операции операнд [операнд]

И если вы посмотрите руководство по микропроцессору, вы узнаете, как каждую инструкцию можно преобразовать в двоичную форму, например, 1001000. Некоторые биты предназначены для кода операции, а некоторые - для операндов.

http://www.mathemainzel.info/files/x86asmref.html

person rsmagdum    schedule 08.07.2015

Язык ассемблера преобразуется в исполняемый машинный код служебной программой, называемой ассемблером; процесс преобразования называется сборкой или сборкой кода.

Дополнительные сведения см. здесь

Ваше здоровье !!

person Sachin Thapa    schedule 25.07.2014

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

person David Frye    schedule 25.07.2014