Машинный код

Поделись знанием:
Перейти к: навигация, поиск

Маши́нный код (платфо́рменно-ориенти́рованный код), маши́нный язы́к — система команд (набор кодов операций) конкретной вычислительной машины, которая интерпретируется непосредственно процессором или микропрограммами этой вычислительной машины.[1]

Компьютерная программа, записанная на машинном языке, состоит из машинных инструкций, каждая из которых представлена в машинном коде в виде т. н. опкода — двоичного кода отдельной операции из системы команд машины. Для удобства программирования вместо числовых опкодов, которые только и понимает процессор, обычно используют их условные буквенные мнемоники. Набор таких мнемоник, вместе с некоторыми дополнительными возможностями, называется языком ассемблера.

Каждая модель процессора имеет свой собственный набор команд, хотя во многих моделях эти наборы команд сильно перекрываются. Говорят, что процессор A совместим с процессором B, если процессор A полностью «понимает» машинный код процессора B. Если процессоры A и B имеют некоторое подмножество инструкций, по которым они взаимно совместимы, то говорят, что они одной «архитектуры» (имеют одинаковую архитектуру набора команд).





Машинная инструкция

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

Операции, записываемые в виде одной машинной инструкции, можно разделить на «простые» (элементарные операции) и «сложные». Кроме того, большинство современных процессоров состоит из отдельных «исполнительных устройств» — вычислительных блоков, которые умеют исполнять лишь ограниченный набор простейших операций. При исполнении очередной инструкции специальный блок процессора — декодер — транслирует (декодирует) её в последовательность элементарных операций, понимаемых конкретными исполнительными устройствами.

Архитектура набора команд процессора определяет, какие операции он способен выполнять, и какой машинной инструкции какие числовые коды операций (опкоды) соответствуют. Опкоды бывают постоянной длины (у RISC-, MISC-архитектур) и диапазонной (у CISC-архитектур; например: для архитектуры x86 команда имеет длину от 8 до 120 битов).

Современные суперскалярные процессоры способны выполнять несколько машинных инструкций за один такт.

Машинный код как язык программирования

Машинный код можно рассматривать как примитивный язык программирования или как самый низкий уровень представления скомпилированных или ассемблированных компьютерных программ. Хотя вполне возможно создавать программы прямо в машинном коде, сейчас это делается редко в силу громоздкости кода и трудоёмкости ручного управления ресурсами процессора, за исключением ситуаций, когда требуется экстремальная оптимизация. Поэтому подавляющее большинство программ пишется на языках более высокого уровня и транслируется в машинный код компиляторами. Машинный код иногда называют нативным кодом (также собственным или родным кодом — от англ. native code), когда говорят о платформенно-зависимых частях языка или библиотек.[2]

Программы на интерпретируемых языках (таких как Бейсик или 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

См. также

Напишите отзыв о статье "Машинный код"

Примечания

  1. 1 2 3 Толковый словарь по вычислительным системам = Dictionary of Computing / Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского. — М.: Машиностроение, 1990. — 560 с. — 70 000 (доп,) экз. — ISBN 5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания).
  2. Kate Gregory. [www.developer.com/net/cplus/print.php/2197621 Managed, Unmanaged, Native: What Kind of Code Is This?] (28 апреля 2003). Проверено 27 марта 2012. [www.webcitation.org/68313Lm0E Архивировано из первоисточника 30 мая 2012].

Отрывок, характеризующий Машинный код

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


Силы двунадесяти языков Европы ворвались в Россию. Русское войско и население отступают, избегая столкновения, до Смоленска и от Смоленска до Бородина. Французское войско с постоянно увеличивающеюся силой стремительности несется к Москве, к цели своего движения. Сила стремительности его, приближаясь к цели, увеличивается подобно увеличению быстроты падающего тела по мере приближения его к земле. Назади тысяча верст голодной, враждебной страны; впереди десятки верст, отделяющие от цели. Это чувствует всякий солдат наполеоновской армии, и нашествие надвигается само собой, по одной силе стремительности.
В русском войске по мере отступления все более и более разгорается дух озлобления против врага: отступая назад, оно сосредоточивается и нарастает. Под Бородиным происходит столкновение. Ни то, ни другое войско не распадаются, но русское войско непосредственно после столкновения отступает так же необходимо, как необходимо откатывается шар, столкнувшись с другим, с большей стремительностью несущимся на него шаром; и так же необходимо (хотя и потерявший всю свою силу в столкновении) стремительно разбежавшийся шар нашествия прокатывается еще некоторое пространство.
Русские отступают за сто двадцать верст – за Москву, французы доходят до Москвы и там останавливаются. В продолжение пяти недель после этого нет ни одного сражения. Французы не двигаются. Подобно смертельно раненному зверю, который, истекая кровью, зализывает свои раны, они пять недель остаются в Москве, ничего не предпринимая, и вдруг, без всякой новой причины, бегут назад: бросаются на Калужскую дорогу (и после победы, так как опять поле сражения осталось за ними под Малоярославцем), не вступая ни в одно серьезное сражение, бегут еще быстрее назад в Смоленск, за Смоленск, за Вильну, за Березину и далее.
В вечер 26 го августа и Кутузов, и вся русская армия были уверены, что Бородинское сражение выиграно. Кутузов так и писал государю. Кутузов приказал готовиться на новый бой, чтобы добить неприятеля не потому, чтобы он хотел кого нибудь обманывать, но потому, что он знал, что враг побежден, так же как знал это каждый из участников сражения.
Но в тот же вечер и на другой день стали, одно за другим, приходить известия о потерях неслыханных, о потере половины армии, и новое сражение оказалось физически невозможным.
Нельзя было давать сражения, когда еще не собраны были сведения, не убраны раненые, не пополнены снаряды, не сочтены убитые, не назначены новые начальники на места убитых, не наелись и не выспались люди.
А вместе с тем сейчас же после сражения, на другое утро, французское войско (по той стремительной силе движения, увеличенного теперь как бы в обратном отношении квадратов расстояний) уже надвигалось само собой на русское войско. Кутузов хотел атаковать на другой день, и вся армия хотела этого. Но для того чтобы атаковать, недостаточно желания сделать это; нужно, чтоб была возможность это сделать, а возможности этой не было. Нельзя было не отступить на один переход, потом точно так же нельзя было не отступить на другой и на третий переход, и наконец 1 го сентября, – когда армия подошла к Москве, – несмотря на всю силу поднявшегося чувства в рядах войск, сила вещей требовала того, чтобы войска эти шли за Москву. И войска отступили ещо на один, на последний переход и отдали Москву неприятелю.
Для тех людей, которые привыкли думать, что планы войн и сражений составляются полководцами таким же образом, как каждый из нас, сидя в своем кабинете над картой, делает соображения о том, как и как бы он распорядился в таком то и таком то сражении, представляются вопросы, почему Кутузов при отступлении не поступил так то и так то, почему он не занял позиции прежде Филей, почему он не отступил сразу на Калужскую дорогу, оставил Москву, и т. д. Люди, привыкшие так думать, забывают или не знают тех неизбежных условий, в которых всегда происходит деятельность всякого главнокомандующего. Деятельность полководца не имеет ни малейшего подобия с тою деятельностью, которую мы воображаем себе, сидя свободно в кабинете, разбирая какую нибудь кампанию на карте с известным количеством войска, с той и с другой стороны, и в известной местности, и начиная наши соображения с какого нибудь известного момента. Главнокомандующий никогда не бывает в тех условиях начала какого нибудь события, в которых мы всегда рассматриваем событие. Главнокомандующий всегда находится в средине движущегося ряда событий, и так, что никогда, ни в какую минуту, он не бывает в состоянии обдумать все значение совершающегося события. Событие незаметно, мгновение за мгновением, вырезается в свое значение, и в каждый момент этого последовательного, непрерывного вырезывания события главнокомандующий находится в центре сложнейшей игры, интриг, забот, зависимости, власти, проектов, советов, угроз, обманов, находится постоянно в необходимости отвечать на бесчисленное количество предлагаемых ему, всегда противоречащих один другому, вопросов.
Нам пресерьезно говорят ученые военные, что Кутузов еще гораздо прежде Филей должен был двинуть войска на Калужскую дорогу, что даже кто то предлагал таковой проект. Но перед главнокомандующим, особенно в трудную минуту, бывает не один проект, а всегда десятки одновременно. И каждый из этих проектов, основанных на стратегии и тактике, противоречит один другому. Дело главнокомандующего, казалось бы, состоит только в том, чтобы выбрать один из этих проектов. Но и этого он не может сделать. События и время не ждут. Ему предлагают, положим, 28 го числа перейти на Калужскую дорогу, но в это время прискакивает адъютант от Милорадовича и спрашивает, завязывать ли сейчас дело с французами или отступить. Ему надо сейчас, сию минуту, отдать приказанье. А приказанье отступить сбивает нас с поворота на Калужскую дорогу. И вслед за адъютантом интендант спрашивает, куда везти провиант, а начальник госпиталей – куда везти раненых; а курьер из Петербурга привозит письмо государя, не допускающее возможности оставить Москву, а соперник главнокомандующего, тот, кто подкапывается под него (такие всегда есть, и не один, а несколько), предлагает новый проект, диаметрально противоположный плану выхода на Калужскую дорогу; а силы самого главнокомандующего требуют сна и подкрепления; а обойденный наградой почтенный генерал приходит жаловаться, а жители умоляют о защите; посланный офицер для осмотра местности приезжает и доносит совершенно противоположное тому, что говорил перед ним посланный офицер; а лазутчик, пленный и делавший рекогносцировку генерал – все описывают различно положение неприятельской армии. Люди, привыкшие не понимать или забывать эти необходимые условия деятельности всякого главнокомандующего, представляют нам, например, положение войск в Филях и при этом предполагают, что главнокомандующий мог 1 го сентября совершенно свободно разрешать вопрос об оставлении или защите Москвы, тогда как при положении русской армии в пяти верстах от Москвы вопроса этого не могло быть. Когда же решился этот вопрос? И под Дриссой, и под Смоленском, и ощутительнее всего 24 го под Шевардиным, и 26 го под Бородиным, и в каждый день, и час, и минуту отступления от Бородина до Филей.