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

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

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

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

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

Набор инструкций [ править ]

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

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

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

Программы [ править ]

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

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

Языки ассемблера [ править ]

Гораздо более удобное для человека представление машинного языка, называемое языком ассемблера , использует мнемонические коды для ссылки на инструкции машинного кода, а не напрямую числовые значения команд, и использует символические имена для обозначения мест хранения, а иногда и регистров . Например, на процессоре Zilog Z80 машинный код 00000101, который заставляет ЦП декрементировать B регистр процессора , будет представлен на языке ассемблера как DEC B.

Пример [ править ]

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

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

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

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

[op | rs | rt | rd | shamt | функция] 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 System / 360 и их преемники. При ширине пути потока данных от 8 до 64 бит и более они, тем не менее, представляют общую архитектуру на уровне машинного языка по всей линии.

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

Связь с байт-кодом [ править ]

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

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

Хранение в памяти [ править ]

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

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

Читаемость людьми [ править ]

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

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

См. Также [ править ]

  • язык ассемблера
  • Порядок байтов
  • Список машинных языков
  • Монитор машинного кода
  • Код накладных расходов
  • P-кодовая машина
  • Пеп / 7
  • Вычисления с сокращенным набором команд (RISC)
  • Очень длинное командное слово
  • Код обучающей машины: Micro-Professor MPF-I

Примечания и ссылки [ править ]

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

Дальнейшее чтение [ править ]

  • Хеннесси, Джон Л .; Паттерсон, Дэвид А. (1994). Компьютерная организация и дизайн. Аппаратно-программный интерфейс . Издательство Морган Кауфманн. ISBN 1-55860-281-X.
  • Таненбаум, Эндрю С. (1999). Структурированная компьютерная организация . Прентис Холл. ISBN 0-13-020435-8.
  • Брукшир, Дж. Гленн (2007). Компьютерные науки: обзор . Эддисон Уэсли. ISBN 978-0-321-38701-1.