Подтвердить что ты не робот

Как работают языки ассемблера?

Мне очень любопытно, как работают ассемблерные языки - я остаюсь общим, потому что я говорю не только об Intel x86 assembly (хотя это единственный, с которым я очень хорошо знаком). Чтобы быть немного понятнее...

mov %eax,%ebx

Как компьютер знает, что делает инструкция типа "mov"? Как он знает, что eax и ebx являются регистрами? Люди пишут грамматики для языков ассемблера? Как они это пишут? Я полагаю, что ничто не мешает кому-либо писать язык ассемблера, который заменяет инструкцию mov чем-то вроде dog или horse и т.д. (Очевидно, это не является семантическим)

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

Мысли?

EDIT: Я понимаю, что этот материал определен в справочных руководствах и вещах, я думаю, что я хочу знать, так это то, как вы говорите своему процессору "Хорошо, когда вы увидите mov, вы сделаете это". Я также знаю, что это последовательность, вероятно, тонны логических выводов... но должен быть какой-то способ распознавания процессором, так это то, что mov является символом, который означает "использовать эти логические ворота"

4b9b3361

Ответ 1

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

Если вам интересно, как именно это происходит, то это долгий процесс, но этот содержит всю эту информацию.

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

Ответ 2

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

Самые основные логические логики - это такие вещи, как AND, и OR, которые просто объединяют биты и разбивают некоторые логические операции между ними. Создавая контуры обратной связи в логических строках, вы можете хранить память. Один тип стандартной схемы памяти называется триггером, и это, в основном, небольшая петля из проволоки вместе с некоторыми воротами И и возможностью держать он стабилен. Объединение нескольких защелок позволяет создавать битовые векторы, и эти вещи называются registers (что представляют собой такие вещи, как eax и ebx). Существует также множество других типов деталей, таких как сумматоры, мультиплексоры и т.д., Которые реализуют различные кусочки логической логики. Вот каталог некоторых схем:

http://www.labri.fr/perso/strandh/Teaching/AMP/Common/Strandh-Tutorial/Dir.html

Ваш процессор - это, по сути, куча этих вещей, застрявших вместе, все они построены из одних и тех же базовых логических ворот. Способ, которым ваш компьютер знает, как продолжать выполнение инструкций, заключается в том, что есть специальный механизм, называемый часами, который испускает импульсы через равные промежутки времени. Когда ваш процессорный такт испускает импульс, он устанавливает последовательность реакций в этих логических затворах, из-за чего процессор выполняет инструкцию. Например, когда он читает инструкцию, которая говорит "mov eax, ebx", то, что заканчивается, заключается в том, что состояние одного из этих регистров (ebx) копируется в состояние другого (eax) как раз вовремя до следующего импульс выходит из строя.

Конечно, это грубое упрощение, но, как изображение высокого уровня, оно, по сути, правильное. Остальные детали требуют времени, чтобы объяснить, и здесь есть несколько вещей, которые я пренебрег из-за ненужной тонкости (например, в реальном процессоре иногда несколько команд выполняются за один такт, а из-за регистрации пейджинга иногда eax isn всегда всегда одно и то же, а иногда из-за переупорядочения время от времени происходит перемещение инструкций и т.д.). Тем не менее, это определенно стоит изучать всю историю, так как она на самом деле довольно удивительна (или, по крайней мере, мне нравится думать так!). Вы сделали бы для себя большую услугу, чтобы выходить и читать на этом материале, и, возможно, попытаться создать несколько собственных схем (либо с использованием реального оборудования, симулятора, либо даже minecraft!)

В любом случае, надеюсь, что ответит на ваш вопрос о том, что такое mov eax, ebx.

Ответ 3

Ваш процессор не выполняет сборку. Ассемблер преобразует его в машинный код. Этот процесс зависит как от конкретного языка ассемблера, так и от целевой компьютерной архитектуры. Как правило, они идут рука об руку, но вы можете найти различные варианты ассемблерного языка (например, nasm или AT & T), которые все переводятся в аналогичный машинный код.

Типичная (MIPS) инструкция сборки, такая как "И немедленная"

andi $t, $s, imm

станет 32-битным машинным кодовым словом

0011 00ss ssst tttt iiii iiii iiii iiii

где s и t - цифры из 0-31, имена которых регистры, а i - 16-битное значение. Его эта битовая диаграмма, которую фактически выполняет процессор. 001100 в начале - это код операции, соответствующий инструкции andi, а последующий битовый шаблон - 5-битный исходный регистр, 5-битный целевой регистр, 16-разрядный литерал - изменяется в зависимости от инструкции. Когда эта инструкция помещается в ЦП, она отвечает соответствующим образом, декодируя код операции, выбирая регистры для чтения и записи и настраивая ALU для выполнения необходимой арифметики.

Ответ 4

Инструкции в коде ассемблера соответствуют фактическим наборам команд и именам регистров для архитектуры ЦП, на которую вы нацеливаете. mov - это инструкция X86, а eax, а другие - имена регистров (в данном случае общего назначения), которые определены в справочном руководстве Intel x86.

То же самое для других архитектур - код сборки сопоставляется непосредственно с фактическими именами операций, как определено в спецификации/документации чипа.

Это сопоставление является более простым, чем, например, компиляция кода C.

Ответ 5

Первое, что каждая инструкция, такая как mov, add и т.д., имеет собственный смысл в двоичной форме, такой как 10101010, 00110000, 10100, некоторые из них также, которые всегда понимают CPU.

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

Вторая вещь конверсия с английского (mov, add и т.д.) в двоичный код происходит при сборке или компиляции их кода.      после этого - двоичные инструкции (наборы инструкций), хранящиеся в памяти и готовые к выполнению.

но это может быть не ваш ответ, который я знаю.

если вы хотите знать и представить себе, как cpu выдает инструкции и работает над ними. Вы можете изучить его с помощью графики здесь. см. это видео на youtube: (ссылка здесь)

https://m.youtube.com/watch?v=cNN_tTXABUA&itct=CCUQpDAYAyITCOHa_9e_q80CFZ1Vvgodek8KmzILYzQtb3ZlcnZpZXdaGFVDNmVhVm43MzQ5TFJoNXl6cFhqZXU4QQ%3D%3D&client=mv-google&gl=IN&hl=en-GB

https://m.youtube.com/watch?v=NKYgZH7SBjk&itct=CBoQpDAYAiITCOHa_9e_q80CFZ1Vvgodek8KmzILYzQtb3ZlcnZpZXdaGFVDNmVhVm43MzQ5TFJoNXl6cFhqZXU4QQ%3D%3D&client=mv-google&gl=IN&hl=en-GB

посмотрите его один раз, и я обещаю вам. вы будете более ясно об этом. посмотрите прямо.