Ассемблер компилятор: За что я люблю ассемблер? / Хабр

ассемблер — Как компилятор может быть написан на том же языке который он компилирует?

Вопрос задан

Изменён 2 года 2 месяца назад

Просмотрен 504 раза

Прочитал несколько подобных вопросов но так и не нашел полноценного ответа. Как компилятор Си может быть написан на Си, ведь кто-то должен скомпилировать сам компилятор в машинный код. И будет ли трансляция в ассемблер по сути равна компиляции? (за исключением того что команды ассемблера нужно будет потом заменить на двоичный код)

  • ассемблер
  • компиляция
  • трансляция

Компилятор си написан на предыдущей версии компилятора. Но когда то давно-давно существовал момент, когда компилятор си был написан на чем то другом. Я к сожалению, не знаю этого момента.

Но вот с плюсовым компилятором все проще — вначале был написан cfront — программа на си, которая переводила «плюсовый код» в сишный, а потом уже компилировала.

С другими языками также такое происходило. К примеру, go был вначале написан на си, а потом код так модифицировали, что бы он был максимально похож на go код (https://go-review.googlesource.com/c/go/+/5652).

Поэтому, с чистым си компилятором для x86 скорее всего было так — в какой то момент просто для доступной на тот момент платформы взяли си компилятор и поправили кодогенерацию. И готово. И у нас уже генерируются бинарники для новый платформы.

Но как появился самый первый компилятор тогда? Есть хорошая статья https://jameshfisher.com/2018/01/11/bootstrapping-a-c-compiler/ которая описывает, как поэтапно можно это сделать.

А здесь https://stackoverflow.com/questions/65751457/how-could-one-possibly-bootstrap-a-c-compilerfrom-source спрашивают почти то же, что и Вы.

То есть, вначале все пишется ручками в памяти, в ноликах и единицах, потом постепенно наращиваются инструменты и в конце концов, такими итерациями можно дойти до современного мира. Вот люди пишут простейший си компилятор https://github.com/rdtscp/c-bootstrap

И будет ли трансляция в ассемблер по сути равна компиляции

если у нас есть компилятор ассемблера, то да. Почему «компилятор»? потому что ассемблеры бывают разные. Тот же FLAT assembler обладает таким разувесистым синтаксисом, что я бы побоялся его называть его компилятор «программой для замены на двоичный код».

Да, процесс, когда компилятор компилирует сам себя называется bootstrapping. и это не имеет отношения к html.

4

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Обзор встроенного кода на ассемблере

Twitter LinkedIn Facebook Адрес электронной почты

  • Статья

Блок, относящийся только к системам Microsoft

Встроенный ассемблер позволяет внедрять инструкции языка ассемблера непосредственно в исходные программы С и С++ без дополнительных шагов по сборке и компоновке.

Встроенный код на ассемблере встроен в компилятор, поэтому вам не требуется отдельный сборщик для языка ассемблера, такой как Microsoft Macro Assembler (MASM).

Так как встроенный ассемблер не требует отдельных действий по сборке и компоновке, он является более удобным, чем отдельный ассемблер. Во встроенном коде на языке ассемблера можно использовать любое имя переменной или функции языка C или C++, находящееся в области видимости, поэтому его легко интегрировать с кодом C и C++ программы. Поскольку в коде на языке ассемблера можно одновременно использовать операторы C или C++, с его помощью можно выполнять задачи, которые слишком сложно или невозможно выполнить только в C или только в C++.

__asm ключевое слово вызывает встроенный ассемблер и может отображаться везде, где оператор C или C++ является допустимым. Он не может отображаться самостоятельно. За ним должна следовать инструкция по сборке, группа инструкций, заключенная в круглые скобки, либо, в крайнем случае, пустая пара круглых скобок.

Термин «блок __asm» в этом разделе относится к любой инструкции или группе инструкций, в скобках или без них.

Следующий код — это простой блок __asm, заключенный в фигурные скобки. (Этот код является последовательностью пролога пользовательской функции.)

// asm_overview.cpp
// processor: x86
void __declspec(naked) main()
{
    // Naked functions must provide their own prolog...
    __asm {
        push ebp
        mov ebp, esp
        sub esp, __LOCAL_SIZE
    }
    // ... and epilog
    __asm {
        pop ebp
        ret
    }
}

Кроме того, можно поставить __asm перед каждой инструкцией по сборке.

__asm push ebp
__asm mov  ebp, esp
__asm sub  esp, __LOCAL_SIZE

Поскольку ключевое слово __asm является разделителем операторов, можно также помещать инструкции ассемблера на одной строке.

__asm push ebp   __asm mov  ebp, esp   __asm sub  esp, __LOCAL_SIZE

Завершение блока, относящегося только к системам Майкрософт

Встроенный ассемблер

Разница между компилятором и ассемблером

Разница между компилятором и ассемблером заключается в том, что компилятор используется для преобразования кода языка программирования высокого уровня в код машинного языка. С другой стороны, ассемблер преобразует код языка уровня ассемблера в код машинного языка.

Оба эти термина относятся к контексту выполнения программы. Компилятор считает весь код и один и конвертирует его одновременно. Принимая во внимание, что ассемблер преобразует код построчно.

В этой статье мы подробно сравним компилятор и ассемблер. Кандидаты также могут узнать больше о различных компьютерных языках высокого уровня в связанной статье.

Это различие между компилятором и ассемблером поможет абитуриентам UPSC подготовиться к предстоящему экзамену IAS, поскольку вопросы, основанные на знании компьютера, часто задаются в секции науки и техники экзамена.

Разница между компилятором и ассемблером PDF:- Скачать PDF здесь

Чтобы улучшить свои компьютерные знания, кандидаты могут перейти по следующим ссылкам и узнать больше о соответствующих терминах, приложениях, программном обеспечении и т. д.

Компилятор и ассемблер

И компилятор, и ассемблер используются для преобразования одного типа языкового кодирования в другой, и в основном это единственное сходство между ними.

Тем не менее, они отличаются друг от друга в различных других аспектах.

Ниже приведено табличное сравнение между компилятором и ассемблером для справки кандидатов:

Разница между компилятором и ассемблером
Компилятор Сборщик
Функция: Его основная функция заключается в преобразовании кода программирования высокого уровня в код машинного языка Функция: Основная функция ассемблера заключается в преобразовании кода уровня сборки в код машинного уровня
Весь код одновременно преобразуется в машинный язык Он не преобразует весь код за один раз
Существует 7 фаз компилятора:
  1. Лексический анализатор
  2. Синтаксический анализатор
  3. Семантический анализатор
  4. Сгенерирован промежуточный код
  5. Оптимизатор кода
  6. Генератор кодов
  7. Обработчик ошибок
Есть только две фазы ассемблера:
  1. Первая фаза
  2. Вторая фаза
Вводит исходный код Вводит код уровня сборки
Вывод представляет собой мнемоническую версию машинного кода Выводится двоичный код
Различные типы компиляторов включают:
  1. Кросс-компилятор
  2. Начальный компилятор
  3. Декомпилятор
  4. Компилятор исходного кода
Различные типы ассемблеров включают:
  1. Однопроходные сборщики
  2. Погрузочно-разгрузочные сборщики

C++ — пример компилируемого языка, а GNU — пример ассемблера.

Упомянутое выше подробное сравнение ясно позволяет проанализировать разницу между ними.

Как обсуждалось ранее, компьютеры являются частью раздела «Наука и техника» программы экзамена на гражданскую службу. Таким образом, кандидаты могут получать заметки об этом на странице UPSC Notes: Science & Technology.

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

  • Разница между поисковой системой и веб-браузером
  • Разница между ОЗУ и ПЗУ
  • Разница между аппаратным и программным обеспечением
  • Разница между брандмауэром и антивирусом
  • Разница между WWW и Интернетом
  • Разница между MS Excel и MS Word
  • Разница между Блокнотом и WordPad
  • Разница между TCP/IP и моделью OSI

Претенденты также могут получить более 100 различий между статьями, основанными на различных разделах и программе экзамена UPSC, в статье по ссылке.

Разница между компилятором и ассемблером PDF:- Скачать PDF здесь

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

Q1

Какова функция ассемблера и компилятора?

Целью ассемблера является перевод языка ассемблера в объектный код. В то время как компиляторы и интерпретаторы генерируют много инструкций машинного кода для каждой инструкции высокого уровня, ассемблеры создают одну инструкцию машинного кода для каждой инструкции ассемблера.

Q2

Как работает компилятор?

Компиляторы — это служебные программы, которые берут ваш код и преобразуют его в исполняемые файлы машинного кода. Затем компилятор обрабатывает предварительно обработанный код построчно, переводя каждую строку в соответствующую инструкцию машинного языка.

Чтобы получить общую схему экзамена и узнать подробную программу UPSC, кандидаты могут посетить статью по ссылке.

Кроме того, чтобы получить последние обновления экзамена, советы по подготовке и учебные заметки в BYJU’S.

компиляторов и ассемблеров

компиляторов и ассемблеров

Исходный код или машинный код?

Фактическая программа, которая выполняется в ЦП, состоит из инструкций в машинный код ; шаблоны 0 и 1, хранящиеся в словах памяти. В конце концов, какие бы средства для этого ни использовались, машинный код должен быть размещен по правильным адресам, чтобы диспетчерский модуль ЦП мог выполнять инструкции.

Программистам-людям трудно писать программы на машинном коде; это трудно понять, трудно прочитать, трудно запомнить. Вместо этого они могут написать в язык ассемблера ; это будет представлено в виде списка символов ASCII, образующих буквы слов, которые легче понять, легче прочитать, легче запомнить; но они точно соответствуют инструкциям, которые выполняет ЦП, и могут быть преобразованы в такие инструкции.

Так, например, INC COUNTER (что означает, увеличить значение числа, хранящегося в реестре, которому присвоено метка COUNTER» легче понять и запомнить, чем 00101010001100; даже если это написано в шестнадцатеричном формате (0A8C), это может быть легче написать, но не легче понять. (язык вроде C немного отличается; он также представлен строкой символы ASCII; но каждое слово или строчка обычно не соответствует к одной инструкции, а к целому ряду таких инструкций).

Чтобы быть полезным, язык ассемблера должен быть точным; не должно быть никаких сомнений в том, как перевести слова в инструкции; для этого важно соблюдать ряд правил именно для конкретного языка.

Программирование на C или ассемблере

C — это язык высокого уровня, который компилируется, а не собирается. Процесс компиляции очень сложен, но основная операция напоминает сборку, за одним исключением: каждая строка программы может производить одну или несколько инструкций машинного кода (по сравнению с обычным однозначным соответствием между ассемблером и машинным кодом). ).

Большинство программ написаны на «языке высокого уровня». например C, а не ассемблер. Однако для некоторых специфических задач ассемблер мне будет более подходящим языком.

Преимущества C

  • Программы могут быть более четкими и лучше структурированными.
  • Легко использовать предварительно написанные функции, которые могут быть довольно сложный.
  • Компилятор C, если он написан аккуратно, может автоматически принимать позаботиться о некоторых проблемах, таких как выделение адресов памяти.

Одна и та же программа может быть перенесена на другой процессор легче.

Недостатки C

  • Исполняемый код может быть длиннее (т.к. он не всегда оптимизирован для аппаратного обеспечения, на котором он выполняется), и менее эффективным.
  • Некоторые «ошибки» найти труднее, потому что вы не знаю точно, как работает компилятор.
  • Работа с некоторыми деталями аппаратного обеспечения, такими как прерывания, может быть сложно в C
  • В некоторых случаях, например для необычных конструкций ЦП, может быть недоступен компилятор C. Почти в каждом случае ассемблер будет поставляться производителем процессора.

На практике можно получить многие преимущества обоих миров используя C для большей части программы и вставляя разделы ассемблер (как внешние процедуры) для ключевых функций. Большинство компиляторов C разрешить это, и компоновщик отвечает за присоединение к различным фрагменты объектного кода для формирования единого исполняемого фрагмента amchine. код.

В чем разница между компилятором и ассемблером?

Компилятор использует в качестве исходного кода программу на C; Это файл символов ASCII. Он производит либо язык ассемблера программу в качестве промежуточного шага или непосредственно машинный код. В любом случае конечным результатом будет машинный код.

Ассемблер принимает в качестве исходного кода язык ассемблера программа; это также файл символов ASCII; он использовал это для создания машинного кода.

Примеры программирования на ассемблере предоставляются на отдельная страница.

Библиотеки

Иногда программисты разрешают другим использовать процедуры которые они написали, но не хотят отдавать источник код для своих программ. Один из распространенных способов сделать это — использовать библиотека». Библиотеки также полезны при управлении большие проекты, которые имеют много процедур, некоторые из которых используются более чем одной программой.

Библиотека собирает фрагменты объектного кода для указанного набор процедур в один файл и создает список индексов процедуры и положение каждой из соответствующих частей объектного кода. Библиотеки обычно создаются менеджером библиотеки. который принимает объектный код, сгенерированный ассемблером компилятора (действующий вместо компоновщика).

Когда программист хочет использовать библиотеку, он сообщает компилятору/ассемблеру путем указания имени процедуры (обычно с помощью «внешнего» директива, говорящая, что это вызов внешней процедуры) и иногда имя файла библиотеки. Когда ассемблер/компилятор находит вызов процедуры, которую он требует, не является частью текущего программа. Тогда компилятор/ассемблер не пытается найти адрес процедуры, но вместо этого оставляет это компоновщику. Это обеспечивает имя соответствующего библиотечного файла компоновщику (или компоновщик выполняет поиск по предварительно настроенному списку библиотек).

Затем компоновщик обрабатывает сгенерированный объектный код. Он ищет известные наборы библиотечных файлов. Каждый раз находит процедура, которая соответствует одной из неразрешенных процедур в объектный код «связывает» копию объектного кода в исполняемый файл, который он генерирует (т. е. копирует соответствующий объектный код байт за байтом из библиотеки). Это называется « статический связывание ». Он исправляет исполняемый код, чтобы он всегда запускаются одинаково (даже если файлы библиотеки больше не присутствует на компьютере).

В некоторых случаях программисту не нужен исполняемый код. содержит копию библиотечной процедуры. Это называется « динамическая связь «. Она/он может пожелать использовать самая последняя версия процедуры, которая доступна, когда программа запускается (что может происходить спустя много времени после ее компиляции). Эта функция позволяет программистам скомпилировать один раз, но воспользоваться преимуществами новых функций, присутствующих в новых версиях библиотек. Например, если будет разработана новая графическая библиотека, которая обеспечивает улучшенные цвета на экране, динамически связанный программа сразу воспользуется преимуществами новых возможностей библиотеки.

Когда компоновщик выполняет динамическую ссылку, ему требуется библиотека присутствовать на компьютере при каждом запуске программы. Вместо побайтового копирования кода при компоновке компоновщик вставляет небольшой фрагмент кода-заглушки, который вызывает выполнение программа, чтобы найти библиотеку и скопировать соответствующие байты в память при необходимости. Динамическое связывание обычно приводит к меньшему исполняемые программы. Иногда программисты предпочитают делиться одними и теми же набор библиотек между рядом одновременно загружаемых программ — это может сэкономить значительное количество памяти и обычно подход, используемый частями операционной системы.


Директивы

Ассемблер и компилятор позволяют исходному коду содержать инструкции компилятору/ассемблеру, чтобы управлять тем, как он работает или попросить его выполнить определенные задачи. Это так называемые «директивы». и поэтому не обязательно создавать объектный код, как обычные строки программа делаю.

Директива #define

Директива #define позволяет сообщить компилятор/ассемблер, чтобы заменить слово другим словом. Источник файл ищется по всем вхождениям первого слова и каждого когда совпадение найдено, оно заменяется вторым словом. Этот обеспечивает удобный способ ввода часто используемых меток или процедур имена. Это также позволяет изменить имена позже, если это быть обязательным.

Например,
#define z_bit status2
может определять нулевой бит в регистре состояния.

Где бы вы ни кодировали ‘z_bit’ в своей программе, ассемблер интерпретируйте это как ссылку на бит 2 регистра состояния.

Директива #include

Директива include просто копирует файл, содержащий исходный код.

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *