Машинный код - Machine code

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

В компьютерное программирование, Машинный код, состоящий из машинный язык инструкции, это язык программирования низкого уровня используется для непосредственного управления компьютером центральное процессорное устройство (ЦПУ). Каждая инструкция заставляет ЦП выполнять очень конкретную задачу, такую ​​как загрузка, сохранение, Прыгать, или арифметико-логическое устройство (ALU) операция с одним или несколькими блоками данных в ЦП регистры или же объем памяти.

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

Подавляющее большинство практических программ сегодня написано на языки более высокого уровня или язык ассемблера. Затем исходный код преобразуется в исполняемый машинный код такими утилитами, как компиляторы, монтажники, и линкеры, за важным исключением интерпретированный программы,[1] которые не переводятся в машинный код. Тем не менее устный переводчик сам по себе, который может рассматриваться как исполнитель или процессор, выполняющий инструкции исходного кода, обычно состоит из непосредственно исполняемого машинного кода (сгенерированного из исходного кода на ассемблере или языке высокого уровня).

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

Набор инструкций

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

В наборе команд процессора могут быть все инструкции одинаковой длины или могут быть инструкции переменной длины. Как организованы шаблоны, сильно зависит от конкретной архитектуры и часто также от типа инструкций. В большинстве инструкций есть один или несколько код операции поля, которые определяют основной тип инструкции (например, арифметические, логические, Прыгать и т. д.), а также фактическую операцию (например, сложение или сравнение) и другие поля, которые могут указывать тип операнд (s), режим адресации (а), адресное смещение (а) или индекс, или само фактическое значение (такие постоянные операнды, содержащиеся в инструкции, называются немедленно).[2]

Не все машины или отдельные инструкции имеют явные операнды. An аккумуляторная машина имеет комбинированный левый операнд и приводит к неявному аккумулятору для большинства арифметических инструкций. Другие архитектуры (например, 8086 и семейство x86) имеют аккумуляторные версии общих инструкций, причем аккумулятор рассматривается как один из общих регистров более длинными инструкциями. А штабелеукладчик имеет большинство или все его операнды в неявном стеке. В инструкциях специального назначения также часто отсутствуют явные операнды (например, CPUID в архитектуре x86 записывает значения в четыре неявных регистра назначения). Это различие между явными и неявными операндами важно в генераторах кода, особенно в частях выделения регистров и отслеживания текущего диапазона. Хороший оптимизатор кода может отслеживать как явные, так и неявные операнды, что может позволить постоянное распространение, постоянное сворачивание регистров (регистр, которому назначается результат константного выражения, освобождается путем замены его этой константой) и другие улучшения кода.

Программы

А компьютерная программа это список инструкций, которые могут быть выполнены центральное процессорное устройство (ЦПУ). Выполнение программы выполняется для того, чтобы ЦП, выполняющий ее, решил конкретную проблему и, таким образом, достиг определенного результата. В то время как простые процессоры могут выполнять инструкции одну за другой, суперскалярный процессоры могут одновременно выполнять множество различных инструкций.

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

Языки ассемблера

Гораздо более читаемое представление машинного языка, называемое язык ассемблера, использует мнемонические коды для обращения к инструкциям машинного кода вместо прямого использования числовых значений инструкций и использует символические имена ссылаться на места хранения, а иногда регистры. Например, на Зилог Z80 процессор, машинный код 00000101, что заставляет ЦП уменьшать B регистр процессора, будет представлен на ассемблере как ДЕКАБРЬ B.

Пример

В Архитектура MIPS предоставляет конкретный пример машинного кода, инструкции которого всегда имеют длину 32 бита. Общий вид обучения дается op Поле (операция), старшие 6 бит. Инструкции J-типа (прыжок) и I-типа (немедленные) полностью определяются op. Инструкции R-типа (регистр) включают дополнительное поле функция для определения точной операции. Поля, используемые в этих типах:

   6 5 5 5 5 6 бит [op | rs | rt | rd | shamt | функция] R-тип [op | rs | rt | адрес / немедленно] I-тип [op | целевой адрес] J-тип

RS, rt, и rd указать операнды регистра; притворство дает величину смены; и адрес или же немедленный поля содержат операнды напрямую.

Например, сложение регистров 1 и 2 и помещение результата в регистр 6 кодируется:

[op | rs | rt | rd | shamt | funct] 0 1 2 6 0 32 десятичное 000000 00001 00010 00110 00000 100000 двоичное

Загрузить значение в регистр 8, взятое из ячейки памяти 68 ячеек после ячейки, указанной в регистре 3:

[op | rs | rt | адрес / сразу] 35 3 8 68 десятичное 100011 00011 01000 00000 00001 000100 двоичное

Переход по адресу 1024:

[op | целевой адрес] 2 1024 десятичное 000010 00000 00000 00000 10000 000000 двоичное

Отношение к микрокоду

В некоторых компьютерные архитектуры, машинный код реализуется еще более фундаментальным базовым уровнем, называемым микрокод, предоставляя общий интерфейс на машинном языке для линейки или семейства различных моделей компьютеров с очень разными базовыми потоки данных. Это сделано для облегчения перенос программ на машинном языке между разными моделями. Примером такого использования является IBM Система / 360 семейство компьютеров и их преемники. При ширине пути потока данных от 8 до 64 бит и более они, тем не менее, представляют общую архитектуру на уровне машинного языка по всей линии.

Использование микрокода для реализации эмулятор позволяет компьютеру представить архитектуру совершенно другого компьютера. Линия System / 360 использовала это, чтобы позволить переносить программы с более ранних машин IBM на новое семейство компьютеров, например ан IBM 1401/1440/1460 эмулятор на модели IBM S / 360 40.

Связь с байт-кодом

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

Машинный код и ассемблерный код иногда называют родные код при обращении к платформенно-зависимым частям языковых функций или библиотек.[3]

Хранение в памяти

В Гарвардская архитектура представляет собой компьютерную архитектуру с физически раздельными хранилищами и сигнальными путями для кода (инструкций) и данные. Сегодня большинство процессоров реализуют такие отдельные пути прохождения сигналов по соображениям производительности, но реализуют Модифицированная архитектура Гарварда,[нужна цитата ] чтобы они могли поддерживать такие задачи, как загрузка исполняемый файл программа от дисковое хранилище как данные, а затем выполнить его. Гарвардская архитектура контрастирует с Архитектура фон Неймана, где данные и код хранятся в одной и той же памяти, которая считывается процессором, позволяя компьютеру выполнять команды.

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

Читаемость людьми

Памела Самуэльсон написала, что машинный код настолько нечитаем, что Бюро авторских прав США не может определить, является ли конкретная закодированная программа оригинальной авторской работой;[4] однако Бюро регистрации авторских прав США делает разрешить регистрацию авторских прав на компьютерные программы[5] и машинный код программы иногда может быть декомпилированный чтобы сделать его работу более понятной для людей.[6]

Профессор когнитивных наук Дуглас Хофштадтер сравнил машинный код с генетический код, говоря, что "Просмотр программы, написанной на машинном языке, отдаленно сопоставим с просмотром ДНК молекула атом за атомом ".[7]

Смотрите также

Примечания и ссылки

  1. ^ Например, многие версии БАЗОВЫЙ, особенно ранние, а также Болтовня, MATLAB, Perl, Python, Рубин и другого специального назначения или языки сценариев.
  2. ^ Кьелл, Брэдли. «Непосредственный операнд».
  3. ^ «Управляемый, неуправляемый, собственный: что это за код?». developer.com. Получено 2008-09-02.
  4. ^ Самуэльсон, Памела (сентябрь 1984 г.). «Повторение CONTU: аргументы против защиты авторских прав на компьютерные программы в машиночитаемой форме». Duke Law Journal. 1984 (4): 663–769. Дои:10.2307/1372418. JSTOR  1372418.
  5. ^ «Регистрация авторских прав на компьютерные программы» (PDF). Бюро авторских прав США. Август 2008 г.. Получено 23 февраля, 2014.
  6. ^ «Что такое декомпиляция? - Определение с сайта WhatIs.com». WhatIs.com. Получено 2016-12-26.
  7. ^ Д. Хофштадтер (1980). «Гедель, Эшер, Бах: вечная золотая коса»: 290. Цитировать журнал требует | журнал = (помощь)

дальнейшее чтение