Х86 сколько это бит: 32 разрядная это x64 или x86?
32 разрядная это x64 или x86?
Для многих пользователей операционной системы Windows не секрет, что существует две ее версии по типу разрядности. Это 32 битная и 64. Знать разрядность своей операционной системы нужно каждому, ведь при поиске и скачивании драйверов, программ и игр она учитывается.
Но с обозначениями разрядности системы, а также драйверов и программ существует некоторая путаница. Есть три обозначения двух разрядностей – x32, x64 и x86. По этой причине часто возникает вопрос 32 разрядная версия это x64 или x86?
Ответ на данный вопрос вы найдете в этой статье.
Второе обозначение 32 разрядной версии ПО
Чтобы впредь исключить путаницу обозначений разрядности программного обеспечения, к которому относится операционная система, драйвера, программы и игры, запомните, что существует две основные версии разрядности ПО – это 32 бита и 64 бита. 64 битная версия может обозначаться только как x64, а вот 32 битная может обозначаться как x32, так и x86.
Вот пример обозначения 64 битной версии драйвера для ноутбука на его официальном сайте:
Обозначение разрядности на сайте с драйверами
А вот возможные варианты обозначения 32 битной версии:
Обозначение разрядности на сайте с драйверами
Обозначение разрядности в описании программы
Из всего вышеописанного можно сделать вывод, что 32 разрядная версия ПО это x86.
x64 обозначается 64 битная версия какого – либо программного обеспечения. Учтите это при подборе версии драйверов и любых других программ.
Для того, чтобы просмотреть какая у вас разрядность операционной системы, достаточно нажать правой кнопкой мыши по значку “Компьютер” на рабочем столе и выбрать “Свойства”.
Заходим в свойства компьютера
В открывшемся окне будет отображена разрядность вашего Windows. И не забудьте x86 это 32 бита, а x64 – 64 бита.
Просмотр разрядности Windows
X64 Или X32 (x86). Как Её Узнать?
Не многие знают, что в Windows есть такое понятие как разрядность — x32 (x86), x64. В этой короткой заметке мы объясним что это такое на пальцах. Тут нет ничего сложного и знать это нужно, потому что это важный момент.
Разрядность операционной системы – грубо и очень приближённо, это количество мельчайших единиц информации (бит), которое процессор способен обработать за один такт (герц). В современном мире существует два варианта разрядности: 32-бит или 64-бит. 32-битные системы называют также x86: это неверное обозначение, зато распространённое. Других вариантов практически нет – разве что доисторические 16-разрядные программы эпохи MS-DOS и Win98.
Чем отличаются Window 32 и 64 на практике? Не скоростью работы – это точно. Грубоватый пример – на задней оси грузовиков бывают и 2 шины, и 4. Наличие 4х шин не делает фуру быстрее или мощнее – но в некоторых случаях многоколёсная конфигурация удобнее: скажем, при перевозке особо тяжёлого груза. Так и с 64-битной версией Windows: быстрее система не станет, но…
Сзади у грузовика 4 колеса, по 2 шины на каждую сторону. Это как в случае с 64-битной ОС: иногда лучше, но точно не быстрее и не медленнее.
Но старые 32-битные Windows способны работать не более чем с 4 гигабайтами ОЗУ, а это мало для современных программ. Даже если физической памяти в компьютер установлено 8 или 16 Гб, ОС способна работать лишь с 3,5-3,8 гигабайтами из них, а остальной объём висит мёртвым грузом. Существуют нестандартные способы заставить «Винду» видеть более 4 гигов, но работают они через раз, да и то, скорее, для косметического эффекта.
64-битная версия Windows уверенно работает с любым объёмом ОЗУ (до 32ГБ).
Различия коротко и понятно:
- x64 — работает с оперативной памятью до 32ГБ. Может запускать 32 и 64-битные программы.
- x32 — работает с оперативной памятью до 4ГБ. Может запускать только 32-битные программы для которых доступно 3 ГБ оперативки.
Есть и другие различия. Но это уже «железные дела» и нам с вами их знать совсем не обязательно, потому что «Меньше знаешь — крепче спишь»…
Разрядность у программ и драйверов
Разрядность может иметь не только система, но и программы, и драйвера. Большинство программ создавалось именно под 32-битные операционки. 32-разрядные приложения отлично работают и в 64-битной среде. Наоборот – не работает никак: истинно 64-битные проги не способны запуститься в 32-разрядой Windows.
Как узнать какая разрядность у вашей Windows?
Если у вас возник такой вопрос, то скорее всего у вас 32-разрядная система — она более популярна и всегда ставиться по умолчанию. 64-разрядную систему как правило устанавливают осознанно и намеренно.
Понять какая разрядность у вашей ОС очень просто.
Windows 8, 10
Нажмите правой кнопкой на Пуск и выберите пункт «Система«. В появившемся окне будет написана разрядность.
Windows 7
Найдите иконку «Мой компьютер» кликните по ней правой кнопкой и выберите «Свойства«.
Windows XP
Пуск > Мой компьютер > Свойства > вкладка «Общие» > Смотрим в раздел Система: если написано 64-битная версия, или 64-bit Edition, 64-бит. Если этого нет но есть что-то вроде Service Pack 3, то 32-разрядная.
Стоит ли переходить на 64-разрядную систему?
Уже, стоооит! Исключения — это пожалуй офисные компьютеры со старыми процами и 1-3 гагами памяти на борту, где не нужны никакие навороты.
Минус: x64 имеет, пожалуй, единственный минуc, из-за которого можно подумать о переходе — не все производители выпустили драйвера для 64-разрядных систем. Но, на сегодня, абсолютно все популярные программы умеют работать с x64, также как и все современные драйвера. Поэтому в 95% случаев это не будет проблемой.
Плюсов куча: более быстрые программы, улучшенная производительность для многоядерных процессоров, поддержка большого объема оперативной памяти.
Технологии развиваются и если пару лет назад никто толком не знал о 64-разрядных системах, то сегодня технологии стремятся полностью перейти на них и это лишь вопрос времени.
Вердикт? В 90% случаев стоит переходить на x64!
x86 это 32 или 64 битная Windows? — История CPU
Всем доброго времени суток дорогие посетители блога айтишнега… У меня довольно часто интересуются — x86 это 32 или 64 битная Windows? Поддаваясь логике — можно предположить что x86 явно больше чем x64, но на практике оказывается что x86 равно x32… но тогда почему так пишут и кому надо ударить по голове, чтобы такой путаницы не было?
А теперь давайте я просто взорву вам мозг — x86 равно x32, и внимание, равна x64 — вы были к такому готовы? — думаю нет… теперь давайте разбираться что, как и куда! Чтобы ответить на этот не самый простой вопрос нам нужно вернуться на несколько десятилетий назад, именно оттуда и идет вся эта заварушка.
По голове надо настучать авторам, которые пишут в требованиях к компьютеру x86 и x64 в связке. Писать такое — грубая ошибка, но этим грешат все… x86 — это архитектура процессора, которая отлично себя чувствует и на 64 битных процессорах и на 32 битных! Маркировка x86 пошла от названия первого процессора от компании Intel i8086 и более новых моделей. Потом первые цифры менялись и сокращенно их объединяли x86 на конце модели — этакая линейка процессоров. Конечно же это было очень давно и процессоры маркируются совершенно по другому, но x86 прочно засела в документации и частенько вводит людей в путаницу… которые особо то не интересовались архитектурой процессоров и не вникали в историю их создания
x86 это 32 или 64 битная Windows?
x86 — это не разрядность, а архитектура… но как показала практика — x86 приравняли к 32 битной операционной системе. Если пренебречь всеми правилами, то можно сказать да, x86 равна 32 битной системе в большинстве случаев.
Правильный вариант обозначения выглядел бы примерно так для 32 разрядной операционной системы (OS_WINDOWS_x86_32bit) или так для 64 битной (OS_WINDOWS_x86_64bit), но у нас все поперепутали!
Тут еще нюанс в том, что 32 битные процессоры уже очень и очень продолжительное время были единственными на рынке, и они были архитектуры x86… а когда вышли 64 разрядные — их стали обозначать x64, а для 32 биток оставили все как есть!
x32 или x64 — Что лучше?
В плане производительности конечно же 64 разрядная операционная система имеет явное преимущество, а вот 32 разрядная ОС очень ужата в ресурсах оперативной памяти. 32 битка не может адресовать более 4 гигабайт оперативной памяти, но по факту она видит не более 3,25 гигабайт из четырех! Однако некоторые приложения могут не запуститься на 64 битной WIndows — что и является сдерживающим фактором перехода но новую ОС.
x86 это 32 или 64 битная Windows? — теперь вы можете сами ответить на этот вопрос… главное знать что и куда, а применить знания можно уже в конкретном случае — тут правильность вашего видения может оказаться ошибочным…
Вконтакте
Одноклассники
Google+
как узнать битность системы Windows и разница x86 и x64
Последнее обновление — 15 июня 2020 в 20:52
Узнать, является ваша версия Windows 32-битной или 64-бит очень просто. Если вы еще до сих пор используете Windows XP, то скорее всего у вас 32-разрядная версия. Так же 32-битные системы имеют обозначение x86. Если у вас установлена Windows 10, 8, 7 или Vista, то вероятнее всего вы используете 64-разрядную версию или x64.
Если вы не знаете, какая Виндовс у вас стоит, то в статье «Как узнать какая версия Windows установлена на вашем компьютере и номер ее сборки» все прекрасно рассказано.
Давайте не будем гадать и перейдем к конкретным действиям, для определения битности (разрядности) установленной ОС.
Знание того, является ли ваша Windows 32-х разрядной или 64-х разрядной, очень важно при выборе версий драйверов, для их дальнейшей загрузки под ваше оборудование и выборе программного обеспечения.
Если с установкой 32-битных версий программ и драйверов на 64 разрядную систему проблем не будет (скорее всего вы только потеряете в скорости работы), то 64 битное ПО и драйвера вы просто не сможете поставить на 32 разрядную операционку. Отнеситесь к этому моменту очень внимательно при скачивании драйверов, покупке и загрузке программного обеспечения.
Лучший и быстрый способ определить, работает у вас 32-разрядная или 64-разрядная версия Виндовс, это просмотреть информацию об установленной ОС в панели управления.
Еще один способ узнать разрядность Windows — проверить наличие различных папок «Program Files». Об этом в конце статьи.
Как посмотреть битность системы windows 10 и 8?
- Открываем панель управления Виндовс. Данная вкладка находиться в папке «Служебные — Windows». Обычно эта папка находиться почти в самом низу списка.
- Кликаем по «Система и безопасность» в панели управления.
- После открытия окна «Система и безопасность» выбираем «Система».
- В открытом апплете «Система» с названием «Просмотр основных сведений о вашем компьютере» найдите пункт «Система», расположенную ниже логотипа Windows. Тип системы будет называться 64-разрядная операционная система или 32.
Так же там указывается тип используемого процессора — x64 или x86. Если процессор 64-битный, то x64, если процессор 32-битный, то x86.
Это аппаратная архитектура. Она пошла от моделей процессоров Intel. В те времена были только 32-х разрядные процессоры (80286, 80386 или 80486). Чтобы было короче, прижилось обозначение по последним двум цифрам — x86.
32-разрядную версию Windows можно установить на x86 или x64 архитектуру, но 64-разрядная Виндовс может быть установлена только на оборудовании x64.
Как узнать битность системы windows 7 и Vista
- Зайдите в Пуск > Панель управления.
- Далее жмем «Система и безопасность»
- Выбираем «Система»
- В пункте «Система» найдите «Тип системы». В нем показано 32-разрядная или 64-разрядная у вас операционная система.
Windows 7 Начальная (Starter Edition) 64-разрядной версии не имеет, только 32-бит.
Для Виндовс Vista все то же самое, только вместо апплета «Система и безопасность» надо зайти в «Система и обслуживание».
64-разрядная версия Windows Vista Starter Edition (Начальная) отсутствует.
Как узнать разрядность системы windows XP
- Нажмите «Пуск» и выберите «Панель управления»
- Далее кликните по «Производительность и обслуживание»
- Выберите «Система»
- Найдите основную информацию о версии Windows XP, установленной на вашем компьютере справа от логотипа Виндовс на вкладке «Общие» в свойствах системы.
Версия Microsoft Windows XP Professional означает, что вы используете 32-разрядную версию Windows XP.
Microsoft Windows XP Professional x64 Edition означает, что вы используете 64-разрядную версию Windows XP.
64-разрядных версий Windows XP Home или Windows XP Media Center Edition не существует. Если вы определили, что у вас установлены именно они, то вы используете 32-разрядную ОС.
Сколько у вас папок «Program Files»
Этот метод не так прост для понимания, как использование панели управления, но он обеспечивает быстрый способ проверки того, используете вы 64-разрядную или 32-разрядную версию Виндовс.
Если ваша версия Windows является 64-разрядной, вы можете устанавливать как 32-разрядные, так и 64-разрядные программы и на вашем компьютере есть две разные папки — Program Files и Program Files (x86).
32-разрядные версии Виндовс имеют только одну папку, поскольку в ней можно устанавливать только 32-разрядные программы.
В 64-разрядной версии Windows существуют две программные папки ⇒
- Для 32-разрядных приложений: C:\Program Files (x86)\
- Для 64-разрядных приложений: C:\Program Files\
32-разрядные версии Windows имеют только одну папку ⇒
- Для 32-разрядных приложений: C:\Program Files\
Теперь вы знаете, используете ли вы 64-х или 32-битную версию Windows.
Мне нравитсяНе нравится
Александр
Увлечен компьютерами и программами с 2002 года. Занимаюсь настройкой и ремонтом настольных ПК и ноутбуков.
Задать вопрос
Чем отличается x64 бит Windows от 86-bit (x32), Какая система Виндоус лучше
Отличия х32 от 64 битной системы Windows.
В этой небольшой статье мы как можно проще постараемся объяснить вам в чём основные отличия между Windows 32 битной системы и Windows 64 бита. Ну и естественно поможем выбрать между 64-х и 86-х.
Итак как правильно выбрать разрядность ОС — операционной системы?
Для начала вот вам некоторые сведения:
- x86 – это архитектура соответствующая 32-битной разрядности.
- x64 – это архитектура соответствующая 64-битной разрядности.
На разницу архитектуры операционной системы влияют два основных факта:
- Разрядность процессора
- Размер оперативной памяти
Разрядность процессора – это величина, которая определяет размер машинного слова, то есть количество информации, которой процессор обменивается с оперативной памятью (ОЗУ) компьютера.
Первым пункт можно не рассматривать, — почти все современные процессоры могут одинаково работать, как в 32-х, так и в 64-х битном режиме. Более подробно про разрядность оборудования PC читайте: Информация о x86 и x64
Что касается оперативной памяти, то стоит знать, что каждая ячейка (8 бит = 1 байт) ОЗУ имеет адрес и в 32-х битной системе он записывается в виде двоичного кода длиной в 32 символа. Из простых математических преобразований получаем 2^32=4294967296 байт = 4 ГБ.
То есть, в 32-битной системе, ячейки памяти условно расположенные за пределом 4 ГБ просто не получат адреса и не будут использоваться. А если использовать 64-х битную систему, то размер адресуемой памяти 2^64= 18446744073709551616. И это открывает большие границы для размеров вашей памяти.
Давайте теперь уточним какая ОС лучше.
В чем разница между операционными системами WINDOWS X32 и Windows x86?
В том, что почти во всех случаях ключевым фактором является размер ОЗУ:
- меньше 4 ГБ — стоит выбрать 32-разрядную,
- больше или равно 4 ГБ – 64-разрядную.
Что работает быстрее Windows x64 или Windows x86?
Очень многие говорят, что х64 работает гораздо быстрее чем х86. Вряд ли этому стоит верить.
Это скорее миф, чем правда. Увеличение скорости будет видно только в оптимизированных под x64 программах. Насколько? Да всего где-то на 3-5%. Многие этого даже не почувствуют.
Но если для вас эти 5% очень дороги, то не забывайте, что есть большая вероятность, что некоторые 32-битные приложения просто не запустятся на вашей Windows x64. И всякий раз когда вы будете искать ту или иную программку, вам стоит искать её 64 битную версию и если её нет, то искать ей замену.
На этом всё. Статья написана с помощью программиста от Vienna.
Желаем вам удачной работы с любой разрядностью в вашей операционной системы.
Как узнать разрядность процессора (x32 (x86) или x64)?
Есть не мало способов, как можно узнать разрядность своего процессора. Полную информацию о системе и железе могут предоставить специализированные программы (aid64, sandra,…), но если нужно узнать только его разрядность, то можно пойти другим путем.
1 метод
Заходим в диспетчер задач, далее кликаем на вкладку быстродействие и смотрим количество окошечек возле загрузки ЦП, если более одного, значит архитектура процессора 64 бита, то есть x64, иначе 32 битный (x32 — x86).
2 метод
Нажимаем пуск, далее выполнить и вводим cmd. В темном (или белом) консольном окне вводим команду set.
В появившемся списке находим строчку
PROCESSOR_ARCHITECTURE.
Если там стоит цифра 64 (например AMD64), значит процессор поддерживает 64 битную архитектуру, иначе только 32 битная архитектура.
3 метод
Все тоже самое как во втором способе, но в консоли прописываем команду systeminfo. Ищем строчку «тип системы» или «процессоры». В них ищем или x86 или x64.
x64 — 64 битный (разрядный)
x86 — 32 битный (разрядный)
4 метод
Программа CPUID CPU-Z
Это бесплатная программа как раз для этих целей.
Ссылка для скачивания с официального сайта CPUID CPU-Z.
На сайте справа есть ссылка для скачивания. На момент написания блога там стоит версия 1.71.1.
После установки кликаем на вкладку cpu и смотрим строчку instructions. Если там есть что то с цифрой 64, значит 64 разрядный процессор, например EM64T, как в моем случае. Другой случай, когда там красуется x86, а это значит что процессор 32 разрядный.
Чем 32-х битная Windows 7 отличается от 64-х битной | Разрядность Windows 7
Разрядность операционной системы Windows 7
Скорее всего, вы не раз замечали из сообщений на форумах, названий дистрибутивов или из текста тематических публикаций, что существуют 32-х битная и 64-х битная версия ОС Windows 7. Часто вы также можете встретить вариант написания вида Windows 7 x86 – это означает, что указываемая версия так же является 32-х битной. Определение х86 пошло от компании Intel: произведенный ей процессор в 1985 году был 32-битным и имел возможность адресовать до 4Гб оперативной памяти.
Для простого пользователя понимание отличия архитектур 32-х битной и 64-битной ОС заключается в следующем:
- 32-х битная операционная система не может адресовать (т.е. поддерживать) более 4Гб оперативной памяти. На самом деле, операционная система не предоставит вам ровно 4Гб, т.к. часть памяти будет необходима для работы периферийных устройств, установленных в вашем ПК. Установив 4Гб памяти в ваш компьютер, фактически вы получите немного меньше памяти для приложений.
- 64-х битная операционная система может поддерживать более 4Гб оперативной памяти. Технически, 64-х битная Windows 7 может поддерживать значительно больше, чем 4Гб оперативной памяти , но фактически Microsoft ввела ограничения некоторых дешевых лицензий: Windows 7 (Home Edition) в размере 16Гб и 192Гб для лицензий Windows 7 Professional или Windows 7 Ultimate. На самом же деле, 64-х битная ОС в паре с 64-х битным процессором позволяет адресовать 264 байт памяти (16 Эксабайт памяти, что в миллионы раз больше по сравнению с ограничениями в Windows 7 Home Edition).
- Для работы 64-х битной версии ОС вам потребуется процессор, позволяющий выполнять программы в 64-х разрядном режиме. Почти все современные процессоры поддерживают эту технологию (хотя у разных производителей она может называться по-разному: x86-64, x64, Intel 64, IA-32e и другие).
- Работа с 64-х битной версией ОС позволит вам выделить больше памяти для ресурсоёмких приложений, а также использовать драйвера для устройств или видеокодеки, которые в определенных задачах дают прирост производительности 10-40% относительно 32-х битных систем.
Несмотря на ограничения в 16 ГБ для младших лицензий Windows 7, этого вполне достаточно для работы с новыми программами, требующими больших объемов оперативной памяти: PhotoShop, различных 3D и видео редакторов. В то же время обычный пользователь никакого увеличения производительности не почувствует. Для работы в интернете или в программе MS Word вполне достаточно и 32-х бит.
Как узнать, скольких разрядная у вас операционная система
Остается только выяснить, как и где узнать разрядность своего компьютера или ноутбука, работающего под Windows 7. В этом нет ничего сложного. Для этой цели нужно проделать совсем простые действия.
В Windows 7 сначала нажимаем на значок «Компьютер», из меню «Пуск», и правой кнопкой мыши выбираем из контекстного меню «Свойства». Эти действия помогут пользователю попасть в меню системных свойств (рис. 1). Именно здесь, в свойствах системы, можно узнать, какая у вас разрядность ОС – 32-х или 64-х битная (рис. 2). Все очень легко и просто. Для этого не нужно проходить никаких компьютерных курсов.
Рисунок 1. Меню системных свойств.
Рисунок 2. Окно свойств системы.
Возможно, у кого-то возникнет вопрос. Если все так замечательно с 64-х битным регистром, то почему он так долго добирался до рядового пользователя? Все объясняется просто. Регистр с количеством битов 64 не пользовался спросом по той простой причине, что у этого регистра была слабая поддержка драйверов.
Это была основная причина, не позволившая 64-х битным регистрам отвоевать лидирующие позиции у 32-х битных ОС, которые и сейчас широко распространены. Почти половина пользователей во всем мире до сих пор использует Windows XP с 32-х битным регистром.
На 64-х битных операционных системах работают почти все 32-х битные приложения и программы. Для некоторых необходимо проводить апгрейд. Если и это не помогает, то лучше установить новое приложение или устройство. Например, поменять старый принтер на новый.
Компания Microsoft еще в 2001 выпустило издание Windows XP с 64-х битным регистром. Но поддержка драйверов была настолько слабой, что это издание не получило широко распространения. Хотя первый 64-х битный компьютер появился еще в 1985 году. Это был компьютер CrayUNICOS или консоль Playstation 2. Правда, в те времена считалось, что 64-х битные вычисления в первую очередь нужны для суперкомпьютеров и больших серверов.
Если использовать Windows 7 x64 с новыми приложениями и драйверами, то никаких проблем возникать в работе не будет.
Сколько там инструкций x86?
На удивление сложно дать хороший ответ (вопрос был поставлен в этой статье). Это зависит от того, как вы считаете, а детали интересны (по крайней мере, мне).
Чтобы не оставлять вас в покое: у Intel есть официальная библиотека кодировщика / декодера x86 под названием XED. Согласно Intel XED, на момент написания этой статьи существует 1503 определенных инструкции x86 («iclasses» на жаргоне XED), от AAA
до XTEST
(кстати, сюда входят и специфичные для AMD расширения).Просто, правда?
Ну, это зависит от того, что вы хотели посчитать. Например, согласно XED, ADD
и LOCK ADD
— это разные «классы команд». Многие программисты на ассемблере считают LOCK
префиксом, а LOCK ADD
дополнением с указанным префиксом, а не отдельной инструкцией, но XED с этим не согласен. Фактически, с точки зрения исполнения, то же самое и с текущими x86. Атомарное добавление делает совсем другие вещи, чем обычное добавление. Префиксная вещь возникает в другом месте: скажем, MOVSD
(копирование одного 32-битного слова) — это другой «класс инструкций» из REP MOVSD
(блочная копия нескольких 32-битных слов)? XED говорит, что да.Но он не обрабатывает все префиксы таким образом во всех контекстах. Например, префикс размера операнда ( 0x66
) превращает целочисленные инструкции, работающие с 32-битными регистрами, в эквивалентную инструкцию, работающую на их младших 16-битных половинах, но в отличие от префиксов REP
или LOCK
, XED делает не считайте их отдельными классами инструкций. Если вы не согласны с любым из этих вариантов, ваш счет будет другим.
Мнемоника
Все зависит от того, насколько точно мы определяем инструкцию.Это что-то с четкой мнемоникой? Давайте сначала посмотрим, что в цитированной выше статье говорится, что это самая распространенная инструкция x86, составляющая 33% от общего набора выборок: MOV
. Итак, давайте поищем MOV в руководствах по архитектуре Intel. И… есть 3 разных записи верхнего уровня? «MOV — перемещение», «MOV — перемещение в / из регистров управления», «MOV — перемещение в / из регистров отладки». Последние в достаточной степени отличаются от «обычного» MOV
, чтобы оценивать свои собственные страницы документации, они имеют совершенно разные кодировки инструкций (даже не в том же блоке кодирования, что и обычный MOV
), и они являются привилегированными инструкциями, что означает низкий пользователь. -mode код даже не может их выполнять.Следовательно, они также крайне редки и, вероятно, составляют примерно 0% тестовой выборки. И, конечно же, XED считает их отдельными классами инструкций ( MOV_CR
и MOV_DR
).
Таким образом, эти инструкции могут быть называться MOV
, но они странные, особые снежинки, и с точки зрения процессора это совершенно разные инструкции в другой части пространства кодирования и с другими правилами. Обозначение их MOV
, по сути, не что иное, как синтаксический сахар на официальном языке ассемблера Intel.
И по поводу синтаксического сахара: некоторые мнемоники — просто псевдонимы. Например, SAL
(сдвиг арифметики влево) — это давний псевдоним для SHL
(сдвиг влево). И то, и другое — всего лишь битовые сдвиги; нет различия между «арифметическим» и «логическим» сдвигом влево, как между арифметическим и логическим сдвигом вправо, но в руководствах Intel перечислены SAL
(с кодировкой, которая совпадает с SHL
) и все x86 ассемблеры, которые я когда-либо использовал, принимают это.Забавно, но в официальном синтаксисе Intel мы одновременно ошибаемся в другом направлении, поскольку по крайней мере две мнемоники были назначены дважды: мы уже видели «копирующий» вариант MOVSD
(который не имеет явных операндов), но есть еще и . MOVSD
как в «перемещении скалярного двойника» (который всегда имеет два явных операнда), который представляет собой совершенно другую инструкцию (XED называет ее MOVSD_XMM
для устранения неоднозначности, и та же проблема возникает с CMPSD
).
Также есть SSE для сравнения, например CMPSD
(двухоперандный!) И CMPPS
.XED считает их по одной инструкции. Но у них есть 8-битный непосредственный постоянный байт, который указывает, какой тип сравнения выполнять. Но дизассемблеры обычно не производят трудночитаемых CMPSD xmm0, xmm1, 2
; вместо этого они дизассемблируют эту инструкцию как псевдоинструкцию CMPLESD
(сравните скалярные двойные числа на предмет «меньше или равно»). Итак, CMPSD
одна инструкция (просто базовый код операции с непосредственным операндом), это 8 (для 8 различных стандартных режимов сравнения) или что-то еще?
Это становится беспорядочным.На помощь приходит синтаксис AT&T? Что ж, это решает некоторые из наших проблем, но также вводит новые. Например, AT&T добавляет суффиксы к мнемонике, чтобы различать разную ширину операций. То, что Intel называет просто ADD
, превращается в ADDB
(8-битные байты), ADDW
(16-битные «слова»), ADDL
(32-битные «длинные слова») и ADDQ
(64- битовые «четверные слова») в синтаксисе x86-64 AT&T. Считаем ли мы их отдельными? Согласно синтаксису Intel, нет. Согласно классам инструкций XED, также нет.Но, может быть, мы считаем их достаточно разными, чтобы все-таки считать по отдельности? Или, может быть, мы решим, что если наше определение зависит от выбора синтаксиса сборки, которых несколько, то, возможно, это не совсем естественный вариант. Что делает машина?
Инструкционные байты
Примечание. Я еще не указал, какая часть машины. Это тоже сложно. Мы доберемся до этого немного позже.
Но сначала байты инструкции. Давайте посмотрим на вышеупомянутый ввод вручную: «MOV — Move».Если вы заглянете на эту страницу в текущем Руководстве разработчика программного обеспечения для архитектуры Intel, вы обнаружите, что в нем перечислено не менее тридцать четыре кодировки (не все из них разные, я перейду к этому). Некоторые из них являются более специальными, привилегированными операциями со специальными кодировками (а именно, переходы в сегментные регистры и из них). На этот раз XED, похоже, не считает загрузку и сохранение сегментных регистров особенными и объединяет их в простой старый MOV
, но я считаю их отдельными, и машина считает их достаточно разными, чтобы дать им специальный байт кода операции в кодировка, которая не используется ни для чего другого, поэтому назовем их разными.
Остается 30 «обычных» ходов. Что … несколько необычно: 10 из них занимаются своими делами и включают перемещения между памятью и различными частями регистра RAX
(в 64-битном режиме), все со специальным режимом абсолютной адресации («моффы»), который показывает в этих инструкциях и, насколько мне известно, больше нигде. Эти инструкции существуют, и, опять же, их почти никто не использует. Иногда они были полезны в 16-битном режиме, но больше нет.
Эта особенность регистра аккумулятора — повторяющаяся тема в x86.« op
(AL / AX / EAX / RAX), что-то» имеет свою собственную кодировку (обычно меньшую) и различные причуды для многих инструкций, которые восходят к 8086 дням. Таким образом, даже если программист-сборщик может рассмотреть, скажем, TEST ebx, 128
и TEST eax, 128
одну и ту же инструкцию (и список классов инструкций XED здесь согласуется!), Они имеют разные коды операций и разные размеры. Таким образом, многие вещи, которые выглядят одинаково в листинге сборки, на самом деле отличаются по этой довольно случайной причине.Запомни. Но вернемся к нашему МОВ!
Остальные 20 перечисленных вариантов MOV делятся на четыре отдельные категории, каждая из которых имеет 5 записей. Эти четыре категории:
- «Load-ish» — перемещение из памяти или другого регистра такого же размера в регистр 8/16/32/64 бит.
- «Store-ish» — переход из 8/16/32/64-битного регистра в другой регистр того же размера или в память.
- «Загрузить немедленно» — загрузить целочисленную константу в 8/16/32/64-битный регистр.
- «Немедленное сохранение» — сохраняет целочисленную константу либо в 8/16/32/64-битную ячейку памяти, либо в регистр.
У всех процессоров есть эквивалент первых трех («немедленное сохранение» существует в некоторых архитектурах ЦП, но есть и многие, у которых его нет). Архитектуры загрузки / сохранения обычно имеют явные инструкции загрузки и сохранения (отсюда и название), и у каждого есть способ загрузить немедленно (большие непосредственные константы часто требуют нескольких инструкций, но не на x86) и переместить содержимое одного регистра в другой.(Хотя последняя не всегда является специальной инструкцией.) Таким образом, помимо того факта, что наши инструкции «load-ish» и «store-ish» также поддерживают «сохранение в» и «загрузку из» регистра (в частности, есть два различные способы кодирования MOV регистр-регистр), это не так уж и замечательно. Это действительно объясняет, почему MOV так распространены в коде x86: в частности, «загрузка», «сохранение» и «немедленная загрузка» являются очень распространенными инструкциями, и MOV включает их все, так что, конечно, вы видите их много.
Так или иначе, у нас есть четыре размера операндов и четыре категории.Так почему в каждой категории указано , пять кодировок? Хорошо, это немного неудобно. x86-64 имеет 16 регистров общего назначения. Вы можете получить к ним доступ как к 16 полным 64-битным регистрам. Для всех 16 регистров вы можете читать (или записывать) их младшие 32-битные половины. Запись в младшую 32-битную половину расширяет нулями (т.е. устанавливает верхнюю половину в ноль). Для всех 16 регистров вы можете читать (или записывать) их младшую 16-битную четверть. Запись в младшую 16-битную четверть регистра не расширяет нулями , а не ; остальные биты регистра сохраняются, потому что это то, что раньше делал 32-битный код, и AMD решила сохранить это поведение, когда по какой-то причине специфицировала 64-битный x86.И для всех 16 регистров вы можете читать (или записывать) их младший 8-битный восьмой (самый младший байт). Повторная запись младшего байта сохраняет все старшие байты, потому что это то, что сделал 32-битный режим. Со мной так далеко? Отлично. Потому что сейчас это становится странным. В 16-битном и 32-битном режиме вы также можете получить доступ к битам с 8 по 15 регистров A, B, C и D как AH
, BH
, CH
и DH
. И режим x86-64 по-прежнему позволяет вам это делать! Но из-за необычной кодировки это работает только в том случае, если в инструкции нет префикса REX (который используется для увеличения числа адресуемых регистров с 8 до 16).
Таким образом, x86-64 фактически имеет в общей сложности 20 адресуемых 8-битных регистров в 3 непересекающихся наборах: от AL
до DL
, которые могут использоваться в любом кодировании. AH
– DH
, доступ к которым возможен только в том случае, если в инструкции отсутствует префикс REX. И младшие 8 бит оставшихся 12 регистров, к которым можно получить доступ только при наличии префикса REX.
Из-за этой причуды Intel перечисляет все 8-битные варианты дважды: один раз без REX и один с REX, потому что они могут обращаться к немного разным частям регистрового пространства! Хорошо, но конечно, кроме этого, у нас должно быть 4 разных кода операций, верно? По одному для байта хода, слова, двойного слова, четверного слова?
Нет.Конечно нет. Фактически, в каждой из этих категорий есть два разных байта кода операции: один используется для 8-битного доступа, а другой для «больше 8-бит». Это восходит к 8086, который был 16-битной машиной: «8-битный» и «16-битный» были всем необходимым различием. Затем появился 386-й, и ему потребовался способ кодирования 32-битных адресатов, и мы получили уже упомянутый байт префикса размера операнда. В 32-битном режиме (ручное движение здесь, детали немного сложнее), инструкции, которые использовал для обозначения 16-битных, теперь по умолчанию 32-битные, а для получения реальных 16-битных инструкций требуется префикс размера операнда.И я уже упоминал, что в 64-битном режиме добавлен собственный набор префиксов (REX), и этот префикс REX используется для обновления 32-битных инструкций «word» по умолчанию до 64-битной ширины.
Таким образом, несмотря на то, что Intel перечисляет 5 различных кодировок инструкций в каждой группе, каждая из которых имеет несколько разную семантику, с ними связано только 2 кода операции: «8-битный» или «не 8-битный». Остальное обрабатывается с помощью байтов префикса. И, как мы (теперь) знаем, существует множество различных типов MOV, которые делают очень разные вещи, и все они относятся к одному и тому же «классу инструкций» XED.
Может быть, классы команд — неправильная метрика для использования? В XED есть еще одна, более тонкая вещь, называемая iforms, которая рассматривает разные подтипы инструкций отдельно. Например, для только что обсужденного MOV мы получаем следующий список:
XED_IFORM_MOV_AL_MEMb = 804, XED_IFORM_MOV_GPR8_GPR8_88 = 805, XED_IFORM_MOV_GPR8_GPR8_8A = 806, XED_IFORM_MOV_GPR8_IMMb_C6r0 = 807, XED_IFORM_MOV_GPR8_IMMb_D0 = 808, XED_IFORM_MOV_GPR8_MEMb = 809, XED_IFORM_MOV_GPRv_GPRv_89 = 810, XED_IFORM_MOV_GPRv_GPRv_8B = 811, XED_IFORM_MOV_GPRv_IMMv = 812, XED_IFORM_MOV_GPRv_IMMz = 813, XED_IFORM_MOV_GPRv_MEMv = 814, XED_IFORM_MOV_GPRv_SEG = 815, XED_IFORM_MOV_MEMb_AL = 816, XED_IFORM_MOV_MEMb_GPR8 = 817, XED_IFORM_MOV_MEMb_IMMb = 818, XED_IFORM_MOV_MEMv_GPRv = 819, XED_IFORM_MOV_MEMv_IMMz = 820, XED_IFORM_MOV_MEMv_OrAX = 821, XED_IFORM_MOV_MEMw_SEG = 822, XED_IFORM_MOV_OrAX_MEMv = 823, XED_IFORM_MOV_SEG_GPR16 = 824, XED_IFORM_MOV_SEG_MEMw = 825,
Как вы можете видеть, этот список в основном соответствует способу работы кодировки инструкций, где 8-битное что-либо считается отдельной инструкцией, а переопределение размера посредством префиксов — нет.Это в основном правило для iform XED: если это отдельная инструкция (или отдельная кодировка), она получает новый iform. Но простое изменение размера существующей инструкции (например, расширение инструкций MMX до SSE или изменение размера MOV с помощью байтов префикса) не работает.
Так сколько же инструкций x86, если мы считаем разные iform как разные? Оказывается, ровно 6000. Это все? Нет. Есть некоторые недокументированные инструкции, которые XED не включает (в дополнение к нескольким ранее недокументированным инструкциям, которые Intel в какой-то момент просто решила сделать официальными).Если вы посмотрите руководства Intel, вы найдете любопытную «UD2», определенную «Неопределенную инструкцию», которая архитектурно гарантированно создает исключение «недопустимый код операции». Как следует из названия, это не первый в своем роде. Его старший коллега «UD1» наполовину существует, но не официально. Поскольку семантика UD1 точно такая же, как если бы она никогда не была определена с самого начала. Считается ли не-инструкция, которая не определена и неофициально гарантированно не выполняется, точно так же, как если бы ее никогда не было в наборе инструкций для начала, как инструкцию x86? Если на то пошло, считается ли сама UD2, определенная неопределенная инструкция, инструкцией?
Декодеры команд
Но вернемся к iforms: 6000 инструкций, а? И все это надо обрабатывать в декодере? Это должно быть ужасно .
Ну нет. На самом деле, нет. То есть, это неприятно, но это не конец света.
Во-первых, давайте поговорим о том, как декодируется x86: все процессоры x86, с которыми вы, вероятно, будете взаимодействовать, могут декодировать (и выполнять) несколько инструкций за цикл. Подумайте, что это значит: у нас (агрессивно!) Кодирование переменной длины, и мы постоянно получаем инструкции. Эти микросхемы могут декодировать (при наличии правильного кода) 4 инструкции за такт. Как это работает? Они переменной длины! Мы можем знать, где начинается первая инструкция, на которую мы смотрим в этом цикле, но как ЦП знает, где начать декодирование второй, третьей и четвертой инструкций? Это просто, когда ваши инструкции имеют фиксированный размер, но для x86 это определенно не так.И нам – необходимо решить это быстро (в течение одного цикла), потому что, если мы займем больше времени, мы не знаем, где заканчивается последняя инструкция в нашем текущем «пакете», и мы не знаем, где возобновить декодирование. в следующем цикле !
У вас недостаточно времени в тактовом цикле 4 ГГц (все 0,25 нс) для полного декодирования 4 инструкций x86. Если на то пошло, у вас даже близко не достаточно времени для «полного декодирования
» (что именно это означает нечетко, и я не буду пытаться уточнять здесь).Два основных способа действовать: первый — просто не делайте этого! Постарайтесь избежать этого любой ценой. Храните дополнительную информацию о предкодировании (например, отметку мест, где начинаются инструкции) в кэше инструкций или вообще отдельный декодированный кеш, как кеши Intel uOp. Это работает, но не поможет вам в первый раз, когда вы запускаете код, который в настоящее время не кэшируется.
Это приводит нас ко второму варианту: разобраться с этим . И способ сделать это — в значительной степени грубая сила.Держите очередь предстоящих байтов инструкций (это связано с предсказанием цели перехода и другими вещами). Пока там достаточно места, вы просто продолжаете извлекать еще 16 (или что-то еще) байтов инструкций и бросать их в очередь.
Затем для каждой отдельной позиции байта в этой очереди , вы делаете вид, что инструкция x86 начинается с этого байта, и определяете ее длину. Просто длина. Не нужно знать, что это за инструкция. Нет необходимости знать, что это за операнды, или где хранятся байты, обозначающие эти операнды, является ли это недопустимой кодировкой или это привилегированная инструкция, которую нам не разрешено выполнять.На данном этапе все это не имеет значения. Мы просто хотим знать, «предположим, что это действительная инструкция, какова ее длина?». Но если мы добавляем в очередь 16 байтов на цикл, нам понадобится 16 из этих предкодеров параллельно, чтобы убедиться, что мы не отставаем и получаем длину инструкции для каждого возможного начального местоположения. При необходимости мы можем организовать эти предкодеры в несколько циклов; мы просто продолжаем идти вперед.
Когда наша очередь достаточно заполнена и мы знаем эту оценку размера для каждого отдельного места в ней, , затем , мы решаем, где находятся границы команд.Это этап, который отслеживает. Он захватывает 16 записей очереди (или что-то еще), начиная с места для текущей инструкции, а затем ему просто нужно «переключиться». «Первая инструкция говорит, что размер начиная с 5 байтов, хорошо; это означает, что вторая инструкция находится в байте 5, а запись в очереди говорит, что это 3 байта; хорошо, третья инструкция начинается с байта 8, 6 байтов ». Никаких вычислений на этом этапе, только «поиск по таблице» в таблице небольшого размера, на которую мы просто потратили несколько циклов вычислений.
Это один из способов сделать это.Как уже говорилось, очень много грубой силы, но работает. Однако, если вам нужно 16 предкодеров (как если бы вы поддерживали скорость выборки 16 байт / цикл), то вы действительно хотите, чтобы они были настолько простыми и тупыми, насколько это возможно. Эти вещи наверняка не заботятся о 6000 различных iform. Они просто косятся инструкции , достаточно , чтобы определить размер, а остальное оставляют на потом.
К счастью, если вы посмотрите на реальную карту кодов операций, вы увидите, что это не так уж и плохо.Существуют большие группы кодов операций, которые в основном имеют одинаковый размер и операнды, но с разными операциями, которые на данном этапе нам совершенно не нужны.
И такая закономерность существует практически везде. Например, посмотрите на этот бросающийся в глаза обычный блок целочисленных инструкций ALU в верхней части карты кодов операции. Все они выглядят (и работают) очень похоже на ЦП. Большинство из них имеют по существу одинаковые кодировки (за исключением нескольких разных битов кода операции) и одинаковые шаблоны операндов.Фактически, декодеру действительно все равно, будет ли это OR
, ADD
, CMP
или XOR
. Для программиста на ассемблере, компилятора или дизассемблера это очень разные инструкции. Для декодера инструкций ЦП это практически одна и та же инструкция: «ALU что-то-или-другое бормотание, все равно». Какая из этих операций будет выполнена, будет решено позже (и, вероятно, только после того, как эта операция попадет в сам ALU).Декодер заботится о том, будет ли это инструкция ALU с непосредственным операндом или у нее есть операнд памяти, и как выглядит этот операнд памяти. И инструкции удобно организованы в группы, где ответы на эти вопросы всегда одни и те же. Конечно, за множеством исключений, потому что это все еще x86, но, очевидно, его можно заставить работать.
Далее по трубе
Инструкции действительно не декодируются сразу, в одном большом «операторе переключения», и после этого они переходят в отдельные части микросхемы, чтобы никогда больше не встретиться.Эти штуки устроены не так. Между разными инструкциями много общего, и «понимание» того, что делает инструкция, распределено, а не централизовано.
Например, для большинства декодеров инструкций, инструкции SSE2 ADDPS
, SUBPS
, MULSD
и DIVPD
— практически одно и то же. Это инструкции FP ALU, они принимают одни и те же типы операндов, и все они находятся в одном месте.
Некоторые из этих инструкций настолько похожи, что почти наверняка никогда не будут «декодированы» полностью. Например, для чисел с плавающей запятой IEEE вычитание — это буквально просто сложение, когда знаковый бит второго операнда переворачивается. Если вы посмотрите на таблицу кодов операций, разница между кодировкой для ADDPS и SUBPS составляет ровно один перевернутый бит: этот бит очищен для ADDPS и установлен для SUBPS. Буквально все, что вам нужно сделать для поддержки обеих инструкций, — это декодировать их одинаково, обязательно взять этот один бит из инструкции, а затем передать его (вместе с исходным битом знака второго операнда) в один вентиль XOR перед сумматор FP.Это оно. Теперь вы поддерживаете как сложение, так и вычитание с плавающей запятой.
Некоторые из этих различий имеют большее значение. Например, умножения FP поступают в другой функциональный блок, чем добавляет FP, и у них другая задержка. Таким образом, для данных требуется другая маршрутизация, а задержка, скажем, для сложения и умножения отличается, что заботится о планировщиках. Если имеется загрузка памяти, то блоку загрузки необходимо знать, какой размер доступа и в какую часть сети обхода операндов отправлять результаты (целое число, с плавающей запятой / SIMD?).Таким образом, в конечном итоге вычисляется набор управляющих сигналов, которые выражают различия между всеми этими инструкциями. Но в большинстве случаев это случается очень поздно. Конечно, нигде нет большого монолитного «оператора переключения» из 6000 корпусов.
И еще есть дальнейшие различия. Например, устранение MOV. Многие x86 во многих случаях могут вообще избежать реального выполнения MOV регистр-регистр. Они просто разрешают это как часть переименования своего реестра. Точно так же обнуление регистра путем XOR с самим собой (что является автором исходной статьи, на которую я ссылался) решается путем переименования этого регистра, чтобы он указывал на жестко подключенный нулевой регистр, и аналогично фактически не требует никаких ресурсов выполнения (даже если его еще нужно расшифровать).
Как это вписывается в нашу таксономию? MOV rax, rbx
чаще всего занимает 0 циклов, но иногда требуется 1 цикл по разным причинам. Считается ли 0-тактная версия специальной инструкцией? Является ли XOR rax, rax
(который идет по магическому пути неявного обнуления и требует 0 циклов для выполнения) другой инструкцией от XOR rax, rcx
, которая кодируется по существу таким же образом? Эти две инструкции отличаются ровно на 1 бит как в исходном файле на языке ассемблера, так и в собранном объектном коде, но выполняются совершенно разными способами и с разными задержками.Должно ли это быть отдельной инструкцией или нет? Наиболее полезный ответ действительно зависит от того, какая часть конвейера вас интересует. Если вы разрабатываете ядро ЦП, они в значительной степени представляют собой отдельные инструкции. Если вы пишете дизассемблер, это не так.
В заключение…
Итак, есть ли во всем этом смысл? Я написал это, потому что считаю, что это весело, но есть ли здесь чему поучиться?
Думаю, да. Это прекрасный пример общего явления, с которым я сталкивался во множестве различных ситуаций: вопросы, на которые довольно легко дать приблизительный ответ, но это становится тем труднее, чем больше вы пытаетесь определить его.По сути, это пример «парадокса береговой линии»: чем ближе вы смотрите, тем больше деталей вы видите и тем больше меняется ответ.
Предположим, я спрашиваю вас «где я?» И могу получить ответ в пределах 10 метров или около того. Если у вас есть портативный GPS-навигатор, вы можете просто передать его мне, и если я посмотрю на дисплей, я получу ответ. Если я спрашиваю «где я, с точностью до миллиметра?», Все становится намного сложнее. Определение положения человека с точностью до метра или около того имеет смысл, но указание с точностью до миллиметра — нет.Позиция , что именно ? Мой центр тяжести? Положение моего центра тяжести, спроецированного на землю? Положение кончика носа? Центральная точка заусеницы на моем левом мизинце? Вы не можете точно ответить на этот вопрос, когда неопределенность, присущая вопросу, намного превышает уровень точности, к которому вы стремитесь.
И, кстати, я использовал здесь x86 в качестве примера, но не верю, что на второй то же самое не относится, скажем, к микросхеме ARM в вашем телефоне.Современные чипы ARM поддерживают множественных кодировок , а также ранжируют более 1000 инструкций, если считать их на том же уровне детализации, что и «iforms» XED. На самом деле довольно легко получить большое количество инструкций на любой архитектуре, как только задействован какой-либо набор векторных / SIMD-инструкций, поскольку большинство из них в основном имеют форму «создания экземпляров этих 40 инструкций для 10 различных типов данных» (с много особой магии, которая либо не имеет типа, конечно, работает только с определенными типами).И да, в кодировке x86 есть много исторических недостатков, как и ARM — многие из них демонстрируются в текущем поколении микросхем, где у производителей микросхем есть приятная задача разработать 3 различных декодера инструкций: 32-битный старый код ARM или «A32», более компактное, но с переменным размером Thumb-2 или «T32» и 64-битное кодирование с фиксированным размером «A64».
Нравится:
Нравится Загрузка …
Связанные
.
x86 — Как произвести обмен между 2 битами в байтовом номере в сборке
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
c ++ — Как определить, сколько байтов нужно целому числу?
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
c ++ — вычислить количество битов, установленных в байте
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.