Как работают языки ассемблера? - PullRequest
14 голосов
/ 24 июня 2011

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

mov %eax,%ebx

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

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

Мысли

РЕДАКТИРОВАТЬ: я понимаю, что этот материал определен в справочных руководствах и тому подобное, я думаю, что я хотел бы знать, как вы говорите своему процессору: «Хорошо, когда вы увидите mov, вы собираетесь это сделать». Я также знаю, что это последовательность, вероятно, тонны логических элементов ... но процессор должен каким-то образом распознать, что mov - это символ, который означает «использовать эти логические элементы»

Ответы [ 5 ]

20 голосов
/ 24 июня 2011

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

Самыми основными логическими элементами являются такие вещи, как 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.

8 голосов
/ 24 июня 2011

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

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

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

7 голосов
/ 24 июня 2011

Ваш процессор не выполняет сборку. Ассемблер преобразует его в машинный код. Этот процесс зависит как от конкретного языка ассемблера, так и от архитектуры целевого компьютера. Как правило, они идут рука об руку, но вы можете найти различные варианты ассемблера (например, 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-битный литерал - варьируется в зависимости от инструкции. Когда эта инструкция помещается в ЦПУ, она реагирует соответствующим образом, декодируя код операции, выбирая регистры для чтения и записи и конфигурируя АЛУ для выполнения необходимой арифметики.

3 голосов
/ 24 июня 2011

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

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

Это отображение намного проще, чем, например, компиляция C кода.

2 голосов
/ 16 июня 2016

Во-первых, каждая инструкция, такая как mov, add и т. Д., Имеет собственное значение в двоичной форме, например 10101010, 00110000, 10100, некоторые из них также могут быть, что всегда понимает процессор.

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

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

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

, если вы хотите знать и вообразить отлично - как работает процессорточные инструкции и работа над ними.Вы можете узнать это с графикой здесь.посмотрите это видео на 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...