Как на самом деле выглядит машинный код во время работы?


21

Когда машинный код фактически выполняется аппаратным обеспечением и процессором, как он выглядит?

Будет ли он выглядеть как двоичный, как в инструкциях, представляемых единицами и нулями, или это будет нечто, состоящее из шестнадцатеричных цифр, где коды операций - это байты, представленные в виде шестнадцатеричных чисел, которые можно разбить на двоичные числа, например, байт-код?


24
То, что вы увидите, это провода, ворота и регистры, мерцающие на кремнии. Например, visual6502.org/JSSim
Наюки

4
@Nayuki Я думаю, что эта визуализация удивительна и заслуживает того, чтобы ее превратили в ответ!
Нальзок

2
Это не похоже на меня
Гай

3
Это действительно даже не существует, когда это действительно "выполнено". Это «JIT, скомпилированный» (аппаратным!) Устройством на ЦП в микрокод, который фактически инструктирует ЦП!
xuq01

2
Один из быстрых способов понять, как компьютер переводит, - это построить его из логических элементов. Мне очень нравится наблюдать за тем, что сделал Бен
Эйтер.

Ответы:


38

Лучший ответ, который я могу дать, это то, что он на самом деле не «выглядит». Инструкция, выполняемая в настоящее время ЦП, представлена ​​серией проводов, некоторые из которых имеют высокое напряжение, а некоторые имеют низкое напряжение.

Вы можете интерпретировать высокое и низкое напряжение как нули и единицы, но вы можете одинаково хорошо интерпретировать группы высоких и низких напряжений как шестнадцатеричные цифры или как инструкцию по сборке ADD $0 $1(которая наиболее близка к тому, как процессор интерпретирует ее). Эти цифры и мнемоника сами по себе удобны для чтения; внутренне это только напряжение на проводах.

Из этих вариантов двоичный является «ближайшим к металлу», в котором нули и единицы отображаются непосредственно на высокое и низкое напряжение на проводах. Но ни один из них не является неправильным, и они часто более полезны: есть причина, по которой люди смотрят на hex-дампы исполняемых файлов, но почти никогда не бинарные.


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

4
@TimHardly Да! Гекс просто легче читать. Сборка, аналогично, даже легче читать, но может быть механически переведена в нули и единицы. Вот почему ассемблеры легче писать, чем компиляторы.
Драконис

спасибо, весь этот вопрос расширил мои знания и очистил мое замешательство.
Тим Хард

1
@TimHardly Ассемблер просто отображает последовательность символов, таких как «NOP», в серию битов, таких как «10010000», снова и снова, чтобы превратить файл сборки в машинный код. Коды операций определяются процессором, поскольку именно эта часть будет их использовать. Все компьютеры, на которых могут работать одни и те же исполняемые файлы , действительно имеют одинаковый набор кодов операций; Набор x86 является наиболее распространенным и в настоящее время используется практически на всех ПК. Другим распространенным является MIPS, используемый во многих игровых приставках.
Драконис

1
@TimHardly Если ваш вопрос, может ли ассемблер спросить CPU, какой у него код операции для инструкции NOP, ответ - нет. Ассемблер уже должен знать, какой байт выводить для инструкции, прежде чем она сможет работать. Фактически, ассемблер может выводить программу для одного процессора, в то время как сам он работает на процессоре другого типа.
Мистер Листер

11

«Похоже» подразумевает метафору. Если мы возьмем буквально «как это будет выглядеть», это будет выглядеть как причудливый гравированный кусок кремния, сидящий на материнской плате. Ясно, что метафора была целью. Чтобы построить метафору, нам нужно посмотреть, что это на самом деле в первую очередь. Тогда мы можем построить приемлемую метафору. Это немного долго, но, к счастью, оно заканчивается для вас видео метафорой.

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

Путь машинного кода начинается с «выборки». Конкретная структура напряжений применяется к проводам микросхемы ОЗУ, указывая, что этот конкретный набор битов должен быть отправлен в ЦП. Почему? Не знаю, все равно. Обычно этот сигнал отправляется, потому что процессор завершил последнюю инструкцию и запрашивает новую в качестве инстинктивного ответа, как собака, запрашивающая второе угощение после того, как вы дали ему первое. Этот процесс начинается с некоторого первоначального удара в штаны, вызванного естественной нестабильностью в процессоре. Когда источник питания подает постоянное напряжение на микросхему, повышение напряжения в конечном итоге приводит к тому, что процессор подает правильные напряжения на микросхемы ОЗУ, чтобы получить первые инструкции (я немного помахал рукой по слою BIOS, потому что это не важно к истории. Ищите это).

Современная память передает данные параллельно. Это означает, что биты, составляющие машинный код, разделены на «дорожки» (32 или 64 являются общими), что является логическим способом передачи 32/64 проводов из ОЗУ в ЦП. Напряжение на этих линиях повышается и понижается по мере необходимости для передачи его в процессор.

Оказавшись в процессоре, он может делать свою работу. Это сфера микроархитектуры , и она может усложниться, потому что это индустрия на миллиард долларов. Эти напряжения влияют на транзисторы, которые влияют на другие напряжения, способами, которые мы могли бы описать как «добавление битов» или «умножение». На самом деле это всего лишь напряжения, которые представляют эти биты, точно так же, как мы могли бы набросать 5-символьную строку «2 + 2 = 4» на листе бумаги и сказать, что мы занимались математикой. Карандашный графит не номер два. Это просто физическое представление, которое мы используем для этого числа.

Вот что делает настоящая система, на чрезвычайно высоком уровне. Я хорошо пропустил ... почти все ... но достаточно прилично, чтобы вернуться к вашему актуальному вопросу. Как бы это [метафорически] выглядело бы?

Когда это происходит, я думаю, что Мартин Молин, возможно, создал лучшую метафору со своей Мраморной машиной . Машинный код кодируется (вручную) на некоторых полосках Lego Technics в середине в виде колышков, а не напряжений на конденсаторе. Это больше похоже на EPROM, чем на DRAM, но оба хранят данные. Мрамор подобен электронам, движущимся под действием напряжения (или гравитации в случае мрамора). И когда электроны движутся, они прикладывают силу к воротам, которые что-то делают.

Его машина проста, по сравнению с современным процессором, но это не так уж плохо, если говорить о метафорах. И это броско!


1
Мраморная машина слишком проста для этого в видео. Процессор нуждается в состоянии.
Торбьерн Равн Андерсен

@ ThorbjørnRavnAndersen Правда. Я полагаю, если бы у мраморной машины было несколько ворот, которые позволяли бы ей автоматически запускать рычаги вместо того, чтобы Марину пришлось их щелкать, она была бы ближе.
Cort Ammon - Восстановить Монику

Благодарность! Подобно вопросу, который я задал в ответе выше этого, будет ли собранный код сборки считаться машинным кодом, который переводится в напряжения и тому подобное?
Тим Хард

@TimHardly Используя только значения «собранный», «сборка» и «машинный код», продукт сборки «Сборка» определяется как машинный код (так что да, его можно считать таковым =)). Что может помочь, так это то, что и сборка, и машинный код считаются «логическими» концепциями, ближе к математической концепции «2 + 2 = 4» и дальше от графита на бумаге, на которой написано это уравнение. Сборка / машинный код - это сборка / машинный код, хранится ли он на магнитном диске, записан на листе бумаги или хранится в конденсаторах в DRAM.
Cort Ammon - Восстановить Монику

1
Если можно выразиться философски, машинный код - это машинный код, потому что мы рассматриваем его как машинный код. Мы думаем об этом как машинный код. Я могу указать CPU на байты, описывающие звук в формате .wav, и он действительно выполнит их как машинный код. Результирующее выполнение, скорее всего, не принесет ничего полезного (поскольку звук не был сконструирован как машинный код), и оно может остановиться, но его можно выполнить.
Cort Ammon - Восстановить Монику

10

Посмотрите это видео , в частности с 1:00 до 1:17. Это именно то, как это выглядит, когда программа работает на компьютере. Две строки индикаторов показывают текущее содержимое регистра адресов и регистра данных. PDP-11 не имеет регистра команд, но если бы он был и на передней панели были огни, чтобы показать его содержимое, он выглядел бы почти так же. 16 лампочек - некоторые из них включены, некоторые выключены.

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

Это PDP11-70, который работает на частоте 15,2 МГц, и выполнение каждой инструкции занимает около 1,5 мкс. Человеческий глаз может обнаружить изменения вплоть до 1/10 секунды, и за это время PDP-11 может выполнить 60000 инструкций. В основном все размыто.


Вау, это хороший пример, я видел таких людей, что-то вроде тех линий, где можно увидеть свет и другие вещи. youtube.com/watch?v=yOyaJXpAYZQ
Тим Хард


6

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

DVE Waves для RISC-V

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

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


2

Представьте себе слепого, спотыкающегося по строящемуся переулку. Везде есть дыры и трещины, поэтому, естественно, он должен упасть. Не этот слепой, потому что у него есть бумажный свиток с инструкциями, когда ждать, когда двигаться, куда двигаться и как манипулировать своим окружением, чтобы достичь конца дороги. Вот что такое собрание, слепо соблюдаемые списки инструкций - они имеют смысл только для этого переулка и для этого слепого. Теоретически вы можете даже восстановить 3d-модель по одной инструкции (декомпиляция).

Каждое изменение на платформе, заставляет пересобирать инструкции для слепого. Вам нужно знать аппаратное обеспечение (расположение строительной площадки), инструкции о намерениях, набранные человеком (код высокого уровня), например: «Я хочу, чтобы вы перепрыгивали через все заборы, с которыми вы сталкивались подряд, пока у вас не было 12 заборов позади вас», и способности слепых (CPU). Есть ли у него кратковременная память, способность делать несколько вещей одновременно?

Сбор всей этой информации и создание последовательной прокрутки команд - задача компилятора.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.