<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4</id>
	<title>Машинный код - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://camokathomelab.servebeer.com/mediawiki/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4"/>
	<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4&amp;action=history"/>
	<updated>2026-07-17T03:29:14Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4&amp;diff=32037&amp;oldid=prev</id>
		<title>imported&gt;Northgav: /* Абсолютный и позиционно-независимый код */оформление (см. ВП:СН-ПРЕП)</title>
		<link rel="alternate" type="text/html" href="https://camokathomelab.servebeer.com/mediawiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4&amp;diff=32037&amp;oldid=prev"/>
		<updated>2025-09-21T22:15:27Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Абсолютный и позиционно-независимый код: &lt;/span&gt;оформление (см. &lt;a href=&quot;/mediawiki/index.php?title=%D0%92%D0%9F:%D0%A1%D0%9D-%D0%9F%D0%A0%D0%95%D0%9F&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;ВП:СН-ПРЕП (страница не существует)&quot;&gt;ВП:СН-ПРЕП&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{эта статья|о системе команд в целом|Код операции|об инструкциях}}&lt;br /&gt;
[[Файл:Цифровой код ЭВМ «Минск-22».jpg|200px|thumb|Памятка программиста, 1960-е годы. Цифровой (машинный) код «[[Минск-22]]»]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Маши́нный код&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;платфо́рменно-ориенти́рованный код&amp;#039;&amp;#039;&amp;#039;), &amp;#039;&amp;#039;&amp;#039;маши́нный язы́к&amp;#039;&amp;#039;&amp;#039; — [[система команд]] (набор кодов операций) конкретной [[компьютер|вычислительной машины]], которая [[интерпретатор|интерпретируется]] непосредственно [[процессор]]ом или [[Микрокод|микропрограммами]] этой вычислительной машины&amp;lt;ref name=&amp;quot;Dict&amp;quot;&amp;gt;{{книга|заглавие=Толковый словарь по вычислительным системам|оригинал=Dictionary of Computing|ответственный=Под ред. В. Иллингуорта и др.: Пер. с англ. А. К. Белоцкого и др.; Под ред. Е. К. Масловского|место={{М.}}|издательство=Машиностроение|год=1990|страниц=560|isbn=5-217-00617-X (СССР), ISBN 0-19-853913-4 (Великобритания)|тираж=70000 (доп.)}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Компьютерная программа]], записанная на машинном языке, состоит из &amp;#039;&amp;#039;&amp;#039;машинных инструкций&amp;#039;&amp;#039;&amp;#039;, каждая из которых представлена в машинном коде в виде т. н. [[Код операции|опкода]] — [[Двоичный код|двоичного кода]] отдельной операции из системы команд машины. Для удобства [[Программирование|программирования]] вместо числовых опкодов, которые только и понимает процессор, обычно используют их условные буквенные [[Мнемоника|мнемоники]]. Набор таких мнемоник, вместе с некоторыми дополнительными возможностями (например, некоторыми макрокомандами, &amp;#039;&amp;#039;директивами&amp;#039;&amp;#039;), называется [[Язык ассемблера|языком ассемблера]].&lt;br /&gt;
&lt;br /&gt;
Каждая модель процессора имеет собственный набор команд, хотя во многих моделях эти наборы команд сильно перекрываются. Говорят, что процессор &amp;#039;&amp;#039;A&amp;#039;&amp;#039; &amp;#039;&amp;#039;совместим&amp;#039;&amp;#039; с процессором &amp;#039;&amp;#039;B&amp;#039;&amp;#039;, если процессор &amp;#039;&amp;#039;A&amp;#039;&amp;#039; полностью «понимает» машинный код процессора &amp;#039;&amp;#039;B&amp;#039;&amp;#039;. Если процессоры &amp;#039;&amp;#039;A&amp;#039;&amp;#039; и &amp;#039;&amp;#039;B&amp;#039;&amp;#039; имеют некоторое подмножество инструкций, по которым они взаимно совместимы, то говорят, что они одной «архитектуры» (имеют одинаковую [[Архитектура набора команд|архитектуру набора команд]]).&lt;br /&gt;
&lt;br /&gt;
== Машинная инструкция ==&lt;br /&gt;
{{main|Инструкция (информатика)}}&lt;br /&gt;
Каждая машинная инструкция выполняет определённое действие, такое как операция с данными (например, [[сложение]] или копирование [[Машинное слово|машинного слова]] в [[Регистр процессора|регистре]] или в [[Компьютерная память|памяти]]) или переход к другому участку кода (изменение порядка исполнения; при этом переход может быть [[Команда перехода|безусловным]] или [[Условный переход|условным]], зависящим от результатов предыдущих инструкций). Любая [[Исполнимый модуль|исполнимая программа]] состоит из последовательности таких атомарных машинных операций.&lt;br /&gt;
&lt;br /&gt;
Операции, записываемые в виде одной машинной инструкции, можно разделить на «простые» ([[элементарная операция|элементарные операции]]) и «сложные». Кроме того, большинство современных процессоров состоит из отдельных «[[Автомат (механизм)|исполнительных устройств]]» — вычислительных блоков, которые умеют исполнять лишь ограниченный набор простейших операций. При исполнении очередной инструкции специальный блок процессора — декодер — [[Транслятор|транслирует]] (декодирует) её в последовательность элементарных операций, понимаемых конкретными исполнительными устройствами.&lt;br /&gt;
&lt;br /&gt;
[[Архитектура набора команд]] процессора определяет, какие операции он способен выполнять, и какой машинной инструкции какие числовые [[Код операции|коды операций]] (опкоды) соответствуют. Опкоды бывают постоянной длины (у [[RISC]]-, [[MISC]]-архитектур) и диапазонной (у [[CISC]]-архитектур; например: для архитектуры [[x86]] команда имеет длину от 8 до 120 битов).&lt;br /&gt;
&lt;br /&gt;
Современные [[Суперскалярный процессор|суперскалярные процессоры]] способны выполнять несколько машинных инструкций за один [[Тактовый сигнал|такт]].&lt;br /&gt;
&lt;br /&gt;
== Машинный код как язык программирования ==&lt;br /&gt;
{{seealso|Язык ассемблера}}&lt;br /&gt;
Машинный код можно рассматривать как примитивный [[язык программирования]] или как самый низкий уровень представления [[компилятор|скомпилированных]] или [[ассемблер|ассемблированных]] компьютерных программ. Хотя вполне возможно создавать программы прямо в машинном коде, сейчас это делается редко в силу громоздкости кода и трудоёмкости ручного управления ресурсами процессора, за исключением ситуаций, когда требуется экстремальная [[Оптимизация (информатика)|оптимизация]]. Поэтому подавляющее большинство программ пишется на [[Высокоуровневый язык программирования|языках более высокого уровня]] и транслируется в машинный код [[компилятор]]ами. Машинный код иногда называют &amp;#039;&amp;#039;&amp;#039;нативным кодом&amp;#039;&amp;#039;&amp;#039; (также &amp;#039;&amp;#039;&amp;#039;собственным&amp;#039;&amp;#039;&amp;#039; или &amp;#039;&amp;#039;&amp;#039;родным кодом&amp;#039;&amp;#039;&amp;#039; — от {{lang-en|native code}}), когда говорят о платформенно-зависимых частях языка или библиотек&amp;lt;ref&amp;gt;{{cite web|url=http://www.developer.com/net/cplus/print.php/2197621|title=Managed, Unmanaged, Native: What Kind of Code Is This?|author=Kate Gregory.|date=2003-04-28|access-date=2012-03-27|archive-url=https://www.webcitation.org/68313Lm0E?url=http://www.developer.com/net/cplus/print.php/2197621|archive-date=2012-05-30|url-status=live}}&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Программы на [[Интерпретируемый язык программирования|интерпретируемых языках]] (таких как [[Бейсик|Basic]] или [[Python]]) не транслируются в машинный код; вместо этого они либо исполняются непосредственно [[интерпретатор]]ом языка, либо транслируются в псевдокод ([[байт-код]]). Однако интерпретаторы этих языков (которые сами можно рассматривать как процессоры), как правило, представлены в машинном коде.&lt;br /&gt;
&lt;br /&gt;
== Микрокод ==&lt;br /&gt;
{{main|Микрокод}}&lt;br /&gt;
В некоторых [[Архитектура компьютера|компьютерных архитектурах]] поддержка машинного кода реализуется ещё более низкоуровневым слоем программ, называемых [[Микрокод|микропрограммами]]. Это позволяет обеспечить единый интерфейс машинного языка у всей линейки или семейства компьютеров, которые могут иметь значительные структурные отличия между собой, и облегчает перенос программ в машинном коде между разными моделями компьютеров. Примером такого подхода является семейство компьютеров [[IBM System/360]] и их преемников: несмотря на разные [[Шина (компьютер)|шины]] шириной от 8 до 64 бит и выше, тем не менее, у них общая архитектура на уровне машинного языка.&lt;br /&gt;
&lt;br /&gt;
Использование слоя микрокода для реализации [[Эмуляция|эмулятора]] позволяет компьютеру представлять архитектуру совершенно другого компьютера. В линейке System/360 это использовалось для переноса программ с более ранних машин IBM на новое семейство — например, эмулятор IBM 1401/1440/1460 на IBM S/360 model 40.&lt;br /&gt;
&lt;br /&gt;
== Абсолютный и позиционно-независимый код ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Абсолютный код&amp;#039;&amp;#039;&amp;#039; ({{lang-en|absolute code}}) — программный код, пригодный для прямого выполнения процессором&amp;lt;ref name=&amp;quot;Dict&amp;quot;/&amp;gt;, то есть код, не требующий дополнительной обработки (например, [[компоновщик|разрешения ссылок]] между различными частями кода или привязки к адресам в памяти, обычно выполняемой [[Загрузчик программ|загрузчиком программ]]). Примерами абсолютного кода являются исполнимые файлы в формате [[.COM]] и загрузчик ОС, располагаемый в [[MBR]]. Часто абсолютный код понимается в более узком смысле как позиционно-зависимый код (то есть код, привязанный к определённым адресам памяти).&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Позиционно-независимый код&amp;#039;&amp;#039;&amp;#039; ({{lang-en|position-independent code}}) — программа, которая может быть размещена в любой области памяти, так как все ссылки на ячейки памяти в ней относительные (например, относительно [[Счётчик команд|счётчика команд]]). Такую программу можно переместить в другую область памяти в любой момент, в отличие от &amp;#039;&amp;#039;перемещаемой программы&amp;#039;&amp;#039;, которая хотя и может быть загружена в любую область памяти, но после загрузки должна оставаться на том же месте&amp;lt;ref name=&amp;quot;Dict&amp;quot;/&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Возможность создания позиционно-независимого кода зависит от архитектуры и системы команд целевой платформы. Например, если во всех инструкциях перехода в системе команд должны указываться абсолютные адреса, то код, требующий переходов, практически невозможно сделать позиционно-независимым. В архитектуре [[x86]] непосредственная адресация в инструкциях работы с данными представлена только абсолютными адресами, но поскольку адреса данных считаются относительно [[сегментный регистр|сегментного регистра]], который можно поменять в любой момент, это позволяет создавать позиционно-независимый код со своими ячейками памяти для данных. Кроме того, некоторые ограничения набора команд могут сниматься с помощью [[Самомодифицирующийся код|самомодифицирующегося кода]] или нетривиальных последовательностей инструкций.&lt;br /&gt;
&lt;br /&gt;
== Программа «Hello, world!» ==&lt;br /&gt;
Программа «[[Hello, world!]]» для процессора архитектуры [[x86]] (ОС [[MS DOS]], вывод при помощи [[BIOS]] прерывания int 10h) выглядит следующим образом (в [[Шестнадцатеричная система счисления|шестнадцатеричном]] представлении):&lt;br /&gt;
: {{color|green|BB 11 01}} {{color|blue|B9 0D 00}} {{color|green|B4 0E}} {{color|blue|8A 07}} {{color|green|43}} {{color|blue|CD 10}} {{color|green|E2 F9}} {{color|blue|CD 20}} {{color|magenta|48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21}}&lt;br /&gt;
&lt;br /&gt;
Данная программа работает при её размещении по смещению 100&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;. Отдельные инструкции выделены цветом:&lt;br /&gt;
* {{color|green|BB 11 01}}, {{color|blue|B9 0D 00}}, {{color|green|B4 0E}}, {{color|blue|8A 07}} — команды присвоения значений регистрам.&lt;br /&gt;
* {{color|green|43}} — [[инкремент]] регистра BX.&lt;br /&gt;
* {{color|blue|CD 10}}, {{color|blue|CD 20}} — вызов программных [[Прерывание|прерываний]] 10&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt; и 20&amp;lt;sub&amp;gt;16&amp;lt;/sub&amp;gt;.&lt;br /&gt;
* {{color|green|E2 F9}} — команда для организации цикла.&lt;br /&gt;
* {{color|magenta|Малиновым}} показаны данные (строка «Hello, world!»).&lt;br /&gt;
Тот же код [[Язык ассемблера|ассемблерными командами]]:&lt;br /&gt;
 XXXX:0100 {{color|  green|    mov     bx, 0111h}}       ; поместить в bx смещение строки HW&lt;br /&gt;
 XXXX:0103 {{color|   blue|    mov     cx, 000Dh}}       ; поместить в cx длину строки HW&lt;br /&gt;
 XXXX:0106 {{color|  green|    mov     ah, 0Eh}}         ; поместить в ah номер функции прерывания 10h&lt;br /&gt;
 XXXX:0108 {{color|   blue|    mov     al, [bx]}}        ; поместить в al значение ячейки памяти, адрес которой находится в bx&lt;br /&gt;
 XXXX:010A {{color|  green|    inc     bx}}              ; перейти к следующему байту строки (увеличить смещение на 1)&lt;br /&gt;
 XXXX:010B {{color|   blue|    int     10h}}             ; вызов прерывания 10h&lt;br /&gt;
 XXXX:010D {{color|  green|    loop    0108}}            ; уменьшить cx на 1 и, если результат≠0, то перейти по адресу 0108&lt;br /&gt;
 XXXX:010F {{color|   blue|    int     20h}}             ; прерывание 20h: завершить программу&lt;br /&gt;
 XXXX:0111 {{color|magenta|HW  db      &amp;#039;Hello, World!&amp;#039;}} ; строка, которую требуется напечатать&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Язык ассемблера]]&lt;br /&gt;
* [[JIT-компиляция]]&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
{{ВС}}&lt;br /&gt;
{{Выполнение программы}}&lt;br /&gt;
{{нет ссылок|дата=2022-12-11}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Машинный код| ]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Northgav</name></author>
	</entry>
</feed>