Набор инструкций, выполняемых непосредственно центральным процессором (ЦП) компьютера Машина языковой монитор в W65C816S одноплатном компьютере, отображающий дизассемблированный код, а также дамп регистров процессора и памяти.
В компьютерном программировании, машинный код, состоящий из машинного языка инструкций, является языком программирования низкого уровня используется для непосредственного управления центральным процессором (ЦП) компьютера. Каждая инструкция заставляет ЦП выполнять очень конкретную задачу, такую как загрузка, сохранение, операция jump или арифметико-логического блока (ALU) на одном или нескольких блоках данные в регистрах ЦП или памяти.
Машинный код — это строго числовой язык, который предназначен для работы с максимально возможной скоростью и может рассматриваться как представление нижнего уровня скомпилированная или собранная компьютерная программа или как примитивный и аппаратно -зависимый язык программирования. Хотя можно писать программы непосредственно в машинном коде, управление отдельными битами и вычисление числовых адресов и констант вручную утомительно и чревато ошибками. По этой причине в современных условиях программы очень редко пишутся непосредственно в машинном коде, но их можно выполнять для отладки низкого уровня, исправления программы (особенно когда исходный код ассемблера недоступен) и язык ассемблера дизассемблирование.
Что такое машинный код
Подавляющее большинство практических программ сегодня написано на языках высокого уровня или языке ассемблера. Затем исходный код преобразуется в исполняемый машинный код с помощью таких утилит, как компиляторы, ассемблеры и компоновщики, с важным исключением интерпретируемого программы, которые не транслируются в машинный код. Однако сам интерпретатор , который может рассматриваться как исполнитель или процессор, выполняющий инструкции исходного кода, обычно состоит из непосредственно исполняемого машинного кода (сгенерированного из исходного кода на ассемблере или языке высокого уровня).
Машинный код по определению является самым низким уровнем деталей программирования, видимым программисту, но внутри многие процессоры используют микрокод или оптимизируют и преобразуют инструкции машинного кода в последовательности микроопераций.. Обычно это не считается машинным кодом.
Набор команд
Каждый процессор или семейство процессоров имеет свой собственный набор команд. Инструкции представляют собой шаблоны бит, цифр или символов, которые по своей физической конструкции соответствуют различным командам для машины. Таким образом, набор команд специфичен для класса процессоров, использующих (в основном) одну и ту же архитектуру.
Последующие или производные процессоры часто включают все инструкции предшественника и могут добавлять дополнительные инструкции. Иногда последующий дизайн прерывает или изменяет значение некоторого кода инструкции (обычно потому, что он нужен для новых целей), в некоторой степени влияя на совместимость кода; даже почти полностью совместимые процессоры могут показывать несколько иное поведение для некоторых инструкций, но это редко является проблемой. Системы также могут отличаться другими деталями, такими как расположение памяти, операционные системы или периферийные устройства. Поскольку программа обычно зависит от таких факторов, разные системы обычно не будут запускать один и тот же машинный код, даже если используется один и тот же тип процессора.
Чем машинный код отличается от ассемблера
В наборе команд процессора могут быть все команды одинаковой длины или могут быть команды переменной длины. Как организованы шаблоны, сильно зависит от конкретной архитектуры и часто также от типа инструкций. Большинство инструкций имеют одно или несколько полей opcode, которые определяют базовый тип инструкции (например, арифметическая, логическая, jump и т. Д.) И фактическую операцию (например, сложение или сравнение) и другие поля, которые могут указывать тип операнда , режим адресации , смещение или индекс адресации или само фактическое значение (такая константа операнды, содержащиеся в инструкции, называются непосредственными).
Не все машины или отдельные инструкции имеют явные операнды. Аккумуляторная машина имеет комбинированный левый операнд и приводит к неявному аккумулятору для большинства арифметических инструкций.
Другие архитектуры (например, 8086 и семейство x86) имеют аккумуляторные версии общих инструкций, причем аккумулятор рассматривается как один из общих регистров более длинными инструкциями. Стековая машина имеет большую часть или все свои операнды в неявном стеке. В инструкциях специального назначения также часто отсутствуют явные операнды (например, CPUID в архитектуре x86 записывает значения в четыре неявных регистра назначения). Это различие между явными и неявными операндами важно в генераторах кода, особенно в частях выделения регистров и отслеживания текущего диапазона. Хороший оптимизатор кода может отслеживать как неявные, так и явные операнды, что может позволить более частое распространение констант, сворачивание констант регистров (регистр, которому назначен результат константного выражения, освобождается путем замены это константа) и другие улучшения кода.
Программы
A компьютерная программа — это список инструкций, которые могут выполняться центральным процессором (CPU). Выполнение программы выполняется для того, чтобы процессор, который ее выполняет, решил конкретную проблему и, таким образом, достиг определенного результата. В то время как простые процессоры могут выполнять инструкции одну за другой, процессоры суперскалярные могут выполнять одновременно множество различных инструкций.
На выполнение программы могут влиять специальные инструкции «перехода», которые передают выполнение инструкции, отличной от следующей, численно следующей. Условные переходы выполняются (выполнение продолжается по другому адресу) или нет (выполнение продолжается со следующей инструкции) в зависимости от некоторого условия.
Ассемблерные языки
Гораздо более удобочитаемая версия машинного языка, называемая языком ассемблера, использует мнемонические коды для обозначения инструкций машинного кода, а не чем использование числовых значений инструкций напрямую, и использует символические имена для обозначения мест хранения, а иногда и регистры. Например, на процессоре Zilog Z80 машинный код 00000101 , который заставляет ЦП декрементировать регистр процессора B , будет представлен на языке ассемблера как DEC 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 указывают регистровые операнды; shamt дает величину сдвига; а поля адреса или непосредственного присутствия содержат непосредственно операнд.
Например, сложение регистров 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 System / 360 и их преемники. При ширине пути потока данных от 8 до 64 бит и более они, тем не менее, представляют общую архитектуру на уровне машинного языка по всей линии.
Использование микрокода для реализации эмулятора позволяет компьютеру представить архитектуру совершенно другого компьютера. Линия System / 360 использовала это, чтобы позволить переносить программы с более ранних машин IBM на новое семейство компьютеров, например эмулятор IBM 1401/1440/1460 на IBM S / 360 модели 40.
Связь с байт-кодом
Машинный код обычно отличается от байт-кода (также известный как p-код), который либо выполняется интерпретатором, либо сам компилируется в машинный код для более быстрого (прямого) выполнения. Исключением является случай, когда процессор предназначен для использования определенного байт-кода непосредственно в качестве своего машинного кода, например, в случае с процессорами Java.
Машинный код и код сборки иногда называют собственным кодом, когда относится к платформенно-зависимым частям языковых функций или библиотек.
Хранение в памяти
Гарвардская архитектура — это компьютерная архитектура с физически отдельными хранилищами и путями передачи сигналов для кода (инструкции) и данные. Сегодня большинство процессоров реализуют такие отдельные пути прохождения сигналов по соображениям производительности, но реализуют Модифицированную Гарвардскую архитектуру, поэтому они могут поддерживать такие задачи, как загрузка исполняемой программы из дискового хранилища как данные, а затем выполнить его. Гарвардская архитектура контрастирует с архитектурой фон Неймана, где данные и код хранятся в одной и той же памяти, которая считывается процессором, позволяя компьютеру выполнять команды.
С точки зрения процесса, пространство кода — это часть его адресного пространства, где хранится исполняемый код. В многозадачных системах это включает программный сегмент кода и обычно разделяемые библиотеки. В среде с многопоточностью разные потоки одного процесса совместно используют пространство кода вместе с пространством данных, что значительно снижает накладные расходы на переключение контекста по сравнению с переключением процессов.
Читаемость для людей
Памела Самуэльсон написала, что машинный код настолько нечитаем, что Бюро регистрации авторских прав США не может определить, является ли конкретная закодированная программа оригинальной авторской работой; однако Бюро регистрации авторских прав США разрешает регистрацию авторских прав на компьютерные программы, и машинный код программы иногда может быть декомпилирован, чтобы сделать его работу более понятной для людей.
Профессор когнитивной науки Дуглас Хофштадтер сравнил машинный код с генетическим кодом, заявив, что «просмотр программы, написанной на машинном языке, отдаленно сравним с рассмотрением атома молекулы ДНК atom. «
См. также
Найдите машинный код в Wiktionary, бесплатном словаре. |
- Язык ассемблера
- Endianness
- Список машинных языков
- Монитор машинного кода
- Служебный код
- Машина P-кода
- Pep / 7
- Вычисление сокращенного набора команд (RISC)
- Очень длинное командное слово
- Код обучающей машины: Микропрофессор MPF-I
Примечания и ссылки
Дополнительная литература
- Хеннесси, Джон Л. ; Паттерсон, Дэвид А. (1994). Компьютерная организация и дизайн. Аппаратно-программный интерфейс. Издательство Морган Кауфманн. ISBN 1-55860-281-X.
- Таненбаум, Эндрю С. (1999). Структурированная компьютерная организация. Прентис Холл. ISBN 0-13-020435-8.
- Брукшир, Дж. Гленн (2007). Компьютерные науки: обзор. Эддисон Уэсли. ISBN 978-0-321-38701-1.
Источник: alphapedia.ru
Машинный код
Информация должна быть проверяема, иначе она может быть удалена. Вы можете отредактировать статью, добавив ссылки на авторитетные источники в виде сносок. Эта отметка установлена 11 декабря 2022 года.
Памятка программиста, 1960-е годы. Цифровой (машинный) код «Минск-22»
Маши́нный код (платфо́рменно-ориенти́рованный код), маши́нный язы́к — система команд (набор кодов операций) конкретной вычислительной машины, которая интерпретируется непосредственно процессором или микропрограммами этой вычислительной машины. [1]
Компьютерная программа, записанная на машинном языке, состоит из машинных инструкций, каждая из которых представлена в машинном коде в виде т. н. опкода — двоичного кода отдельной операции из системы команд машины. Для удобства программирования вместо числовых опкодов, которые только и понимает процессор, обычно используют их условные буквенные мнемоники. Набор таких мнемоник, вместе с некоторыми дополнительными возможностями (например, некоторыми макрокомандами, директивами), называется языком ассемблера.
Каждая модель процессора имеет собственный набор команд, хотя во многих моделях эти наборы команд сильно перекрываются. Говорят, что процессор A совместим с процессором B, если процессор A полностью «понимает» машинный код процессора B. Если процессоры A и B имеют некоторое подмножество инструкций, по которым они взаимно совместимы, то говорят, что они одной «архитектуры» (имеют одинаковую архитектуру набора команд).
- 1 Машинная инструкция
- 2 Машинный код как язык программирования
- 3 Микрокод
- 4 Абсолютный и позиционно-независимый код
- 5 Программа «Hello, world!»
- 6 См. также
- 7 Примечания
Машинная инструкция
Основная статья: Инструкция (информатика)
Каждая машинная инструкция выполняет определённое действие, такое как операция с данными (например, сложение или копирование машинного слова в регистре или в памяти) или переход к другому участку кода (изменение порядка исполнения; при этом переход может быть безусловным или условным, зависящим от результатов предыдущих инструкций). Любая исполнимая программа состоит из последовательности таких атомарных машинных операций.
Операции, записываемые в виде одной машинной инструкции, можно разделить на «простые» (элементарные операции) и «сложные». Кроме того, большинство современных процессоров состоит из отдельных «исполнительных устройств» — вычислительных блоков, которые умеют исполнять лишь ограниченный набор простейших операций. При исполнении очередной инструкции специальный блок процессора — декодер — транслирует (декодирует) её в последовательность элементарных операций, понимаемых конкретными исполнительными устройствами.
Архитектура набора команд процессора определяет, какие операции он способен выполнять, и какой машинной инструкции какие числовые коды операций (опкоды) соответствуют. Опкоды бывают постоянной длины (у RISC-, MISC-архитектур) и диапазонной (у CISC-архитектур; например: для архитектуры x86 команда имеет длину от 8 до 120 битов).
Современные суперскалярные процессоры способны выполнять несколько машинных инструкций за один такт.
Машинный код как язык программирования
Машинный код можно рассматривать как примитивный язык программирования или как самый низкий уровень представления скомпилированных или ассемблированных компьютерных программ. Хотя вполне возможно создавать программы прямо в машинном коде, сейчас это делается редко в силу громоздкости кода и трудоёмкости ручного управления ресурсами процессора, за исключением ситуаций, когда требуется экстремальная оптимизация. Поэтому подавляющее большинство программ пишется на языках более высокого уровня и транслируется в машинный код компиляторами. Машинный код иногда называют нативным кодом (также собственным или родным кодом — от англ. native code ), когда говорят о платформенно-зависимых частях языка или библиотек. [2]
Программы на интерпретируемых языках (таких как Basic или Python) не транслируются в машинный код; вместо этого они либо исполняются непосредственно интерпретатором языка, либо транслируются в псевдокод (байт-код). Однако интерпретаторы этих языков (которые сами можно рассматривать как процессоры), как правило, представлены в машинном коде.
Микрокод
Основная статья: Микрокод
В некоторых компьютерных архитектурах поддержка машинного кода реализуется ещё более низкоуровневым слоем программ, называемых микропрограммами. Это позволяет обеспечить единый интерфейс машинного языка у всей линейки или семейства компьютеров, которые могут иметь значительные структурные отличия между собой, и облегчает перенос программ в машинном коде между разными моделями компьютеров. Примером такого подхода является семейство компьютеров IBM System/360 и их преемников: несмотря на разные шины шириной от 8 до 64 бит и выше, тем не менее, у них общая архитектура на уровне машинного языка.
Использование слоя микрокода для реализации эмулятора позволяет компьютеру представлять архитектуру совершенно другого компьютера. В линейке System/360 это использовалось для переноса программ с более ранних машин IBM на новое семейство — например, эмулятор IBM 1401/1440/1460 на IBM S/360 model 40.
Абсолютный и позиционно-независимый код
Абсолютный код (англ. absolute code ) — программный код, пригодный для прямого выполнения процессором [1] , то есть код, не требующий дополнительной обработки (например, разрешения ссылок между различными частями кода или привязки к адресам в памяти, обычно выполняемой загрузчиком программ). Примерами абсолютного кода являются исполнимые файлы в формате .COM и загрузчик ОС, располагаемый в MBR. Часто абсолютный код понимается в более узком смысле как позиционно-зависимый код (то есть код, привязанный к определённым адресам памяти).
Позиционно-независимый код (англ. position-independent code ) — программа, которая может быть размещена в любой области памяти, так как все ссылки на ячейки памяти в ней относительные (например, относительно счётчика команд). Такую программу можно переместить в другую область памяти в любой момент, в отличие от перемещаемой программы, которая хотя и может быть загружена в любую область памяти, но после загрузки должна оставаться на том же месте. [1]
Возможность создания позиционно-независимого кода зависит от архитектуры и системы команд целевой платформы. Например, если во всех инструкциях перехода в системе команд должны указываться абсолютные адреса, то код, требующий переходов, практически невозможно сделать позиционно-независимым. В архитектуре x86 непосредственная адресация в инструкциях работы с данными представлена только абсолютными адресами, но поскольку адреса данных считаются относительно сегментного регистра, который можно поменять в любой момент, это позволяет создавать позиционно-независимый код со своими ячейками памяти для данных. Кроме того, некоторые ограничения набора команд могут сниматься с помощью самомодифицирующегося кода или нетривиальных последовательностей инструкций.
Программа «Hello, world!»
Программа «Hello, world!» для процессора архитектуры x86 (ОС MS DOS, вывод при помощи BIOS прерывания int 10h) выглядит следующим образом (в шестнадцатеричном представлении):
BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21
Данная программа работает при её размещении по смещению 10016. Отдельные инструкции выделены цветом:
- BB 11 01 , B9 0D 00 , B4 0E , 8A 07 — команды присвоения значений регистрам.
- 43 — инкремент регистра BX.
- CD 10 , CD 20 — вызов программных прерываний 1016 и 2016.
- E2 F9 — команда для организации цикла.
- Малиновым показаны данные (строка «Hello, world!»).
XXXX:0100 mov bx, 0111h ; поместить в bx смещение строки HW XXXX:0103 mov cx, 000Dh ; поместить в cx длину строки HW XXXX:0106 mov ah, 0Eh ; поместить в ah номер функции прерывания 10h XXXX:0108 mov al, [bx] ; поместить в al значение ячейки памяти, адрес которой находится в bx XXXX:010A inc bx ; перейти к следующему байту строки (увеличить смещение на 1) XXXX:010B int 10h ; вызов прерывания 10h XXXX:010D loop 0108 ; уменьшить cx на 1 и, если результат≠0, то перейти по адресу 0108 XXXX:010F int 20h ; прерывание 20h: завершить программу XXXX:0111 HW db ‘Hello, World!’ ; строка, которую требуется напечатать
См. также
- Язык ассемблера
- JIT-компиляция
Примечания
- ↑ 1,01,11,2 Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М. : Машиностроение, 1990. — 560 с. — 70 000 (доп.) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
- ↑Kate Gregory.Managed, Unmanaged, Native: What Kind of Code Is This?(неопр.) (28 апреля 2003). Дата обращения: 27 марта 2012.Архивировано 30 мая 2012 года.
Источник: xn--h1ajim.xn--p1ai
Машинный код
Машинный код (также употребляются термины собственный код, или платформенно-ориентированный код, или родной код, или нативный код — от англ.native code) — система команд (язык) конкретной вычислительной машины (машинный язык), который интерпретируется непосредственно микропроцессором или микропрограммами данной вычислительной машины.
Машинный язык — набор команд конкретной вычислительной машины, который интерпретируется на аппаратном уровне или с помощью микропрограмм самой машины.
Каждая модель процессора имеет свой собственный машинный язык, хотя во многих моделях эти наборы команд сильно перекрываются. Говорят, что процессор A совместим с процессором B, если процессор A полностью «понимает» машинный код процессора B. Если процессор A знает несколько команд, которых не понимает процессор B, то B несовместим с A.
«Слова» машинного языка называются машинными инструкциями. Каждая из них описывает элементарное действие, выполняемое процессором, такое как «переслать байт из памяти в регистр». Программа — это просто длинный список инструкций, выполняемых процессором.
Раньше процессоры просто выполняли инструкции одну за другой, но новые суперскалярные процессоры способны выполнять несколько инструкций за раз. Прямой поток выполнения команд может быть изменён инструкцией перехода, которая переносит выполнение на инструкцию с заданным адресом. Инструкция перехода может быть условной, выполняющей переход только при соблюдении некоторого условия.
Также инструкции бывают постоянной длины (у RISC, MISC-архитектур) и диапазонной (у CISC-архитектур; например, для архитектуры x86 команда имеет длину от 8 до 120 битов).
Источник: www.tadviser.ru