Что такое x86-64 и откуда это взялось?
Программные продукты часто снабжаются интересными аббревиатурами, значение которых знают далеко не все. Например, напротив той же 1С: Бухгалтерии в прайсе можно обнаружить приписку x86-64. И вроде как не сложно догадаться, что речь идёт об использовании программного обеспечения, адаптированного для многоядерных процессоров. Но почему оно так странно записано? А как тогда должны быть обозначены программы для одноядерных систем (если такие, конечно же, сейчас вообще используются).
Логично было бы обозначать одноядерные процессоры и системы значком х32, как это делалось когда-то на уже устаревшем железе, ну а многоядерные системы отмечать как x64, поскольку сначала всё начиналось с двух ядер в системе. Но нет, на программном продукте мы видим именно x86-64! Такое обозначение встречается и, например, на дистрибутивах операционных систем. Если скачивать Линукс, то обязательно увидите множество самых разных версий, в том числе и обозначенную выше.
Всё начинается с разрядности. Для того, чтобы понимать о чём вообще идёт речь, нужно в первую очередь ориентироваться на то, чем является разрядность операционной системы.
В информатике разрядность – это количество битов, которые могут быть одновременно обработаны данным устройством (в нашем случае ОС). На сегодняшний день существуют только две разрядности операционной системы. Логично предположить, что это х32 и х64. Тогда откуда берется странная запись х86…Оно и на 32 не делится, и на 64 тоже.
x86 — это не разрядность, а архитектура процессора. Под архитектурой понимается способность аппаратного выполнения набора команд. Ведь мы помним, что любой процессор по сути дела – это набор цепей из полупроводниковых транзисторов. Цепь – это некоторая логическая последовательность, которая на выходе даст определенный результат.
Само собой, что аппаратная специфика конструкции процессора, то есть его архитектура, влияют на методику программирования и выбор подхода. x86 может работать как с 32-битной версией, так и с 64-битной версией. Но чаще всего указание на х86 ассоциируется именно с 32-разрядной системой. Правда корректно было бы указывать ещё и разрядность.
Сама маркировка x86 пошла от названия первого процессора от компании Intel i8086 и более новых моделей.
Правильный вариант обозначения через архитектуру выглядел бы примерно так:
- для 32 разрядной операционной системы x86-32bit
- для 64 битной x86-64bit
Ничего не напоминает последняя запись? Это та самая запись, которую мы обозначили в заголовке заметки и со смыслом которой пытались разобраться. x86-64 – это 64-разрядная версия набора инструкций x86. Это значит, что это версия для многоядерных процессоров, которая работает с процессорами типа х86 и при этом имеет 64-разрядную версию. Говоря ещё более простым языком – это версия для “двухъядерного процессора” и если у вас установлена операционка Windows x64, то выбирать следует именно такую версию.
ARM против x86: В чем разница между двумя архитектурами процессоров?
Вы наверняка знаете, что мир процессоров разбит на два лагеря. Если вы смотрите это видео со смартфона, то для вас работает процессор на архитектуре ARM, а если с ноутбука, для вас трудится чип на архитектуре x86.
А теперь еще и Apple объявила, что переводит свои Mac на собственные процессоры Apple Silicon на архитектуре ARM. Мы уже рассказывали, почему так происходит. А сегодня давайте подробно разберемся, в чем принципиальные отличия x86 и ARM. И зачем Apple в это все вписалась?
Итак, большинство мобильных устройств, iPhone и Android’ы работают на ARM’е. Qualcomm, HUAWEI Kirin, Samsung Exynos и Apple A13/A14 Bionic — это все ARM-процессоры.
А вот на компьютере не так — там доминирует x86 под крылом Intel и AMD. Именно поэтому на телефоне мы не можем запустить Word с компьютера.
x86 — так называется по последним цифрам семейства классических процессоров Intel 70-80х годов.

Чем же они отличаются?
Есть два ключевых отличия.
Первое — это набор инструкций, то есть язык который понимает процессор
x86 процессоры используют сложный набор инструкций, который называется CISC — Complex Instruction Set Computing.
ARM процессоры наоборот используют упрощенный набор инструкций — RISC — Reduced Instruction Set Computing.
Кстати ARM расшифровывается как Продвинутые RISC машины — Advanced RISC Machines.
Наборы инструкций ещё принято назвать архитектурой или ISA — Instruction Set Architecture.
Второе отличие — это микроархитектура. Что это такое?
От того на каком языке говорят процессоры, зависит и то, как они проектируются. Потому как для выполнения каждой инструкции на процессоре нужно расположить свой логический блок. Соответственно, разные инструкции — разный дизайн процессора. А дизайн — это и есть микроархитектура.
- x86 — CISC
- ARM — RISC
Но как так произошло, что процессоры стали говорить на разных языках?
История CISC

Памятка программиста, 1960-е годы. Цифровой (машинный) код «Минск-22».
Всё началось в 1960-х. Поначалу программисты работали с машинным кодом, то есть реально писали нолики и единички. Это быстро всех достало и появился Assembler. Низкоуровневый язык программирования, который позволял писать простые команды типа сложить, скопировать и прочее. Но программировать на Assembler’е тоже было несладко. Потому как приходилось буквально “за ручку” поэтапно описывать процессору каждое его действие.
Поэтому, если бы вы ужинали с процессором, и попросили передать его вам соль, это выглядело бы так:
- Эй процессор, посмотри в центр стола.
- Видишь соль? Возьми её.
- Теперь посмотри на меня.
- Отдай мне соль. — Ага, спасибо!
- А теперь снова возьми у меня соль.
- Поставь её откуда взял
- Спасибо большое! Продолжай свои дела.
- Кхм… Процессор, видишь перец?
- И так далее.
Этот подход стал настоящим спасением как для разработчиков, так и для бизнеса. Захотел клиент новую инструкцию — не проблема, были бы деньги — мы сделаем. А деньги у клиентов были.
Недостатки CISC
Но был ли такой подход оптимальным. С точки зрения разработчиков — да. Но вот микроархитектура страдала.
Представьте, вы купили квартиру и теперь вам нужно обставить её мебелью. Площади мало, каждый квадратный метр на счету. И вот представьте, если бы CISC-процессор обставил мебелью вам гостиную, он бы с одной стороны позаботился о комфорте каждого потенциального гостя и выделил бы для него своё персональное место.
С другой стороны, он бы не щадил бюджет. Диван для одного человека, пуф для другого, кушетка для третьего, трон из Игры Престолов для вашей Дейенерис. В этом случае площадь комнаты бы очень быстро закончилась. Чтобы разместить всех вам бы пришлось увеличивать бюджет и расширять зал. Это не рационально. Но самое главное, CISC-архитектура существует очень давно и те инструкции, которые были написаны в 60-х годах сейчас уже вообще не актуальны. Поэтому часть мебели, а точнее исполнительных блоков, просто не будут использоваться. Но многие из них там остаются. Поэтому появился RISC…
Преимущества RISC
С одной стороны писать на Assembler’е под RISC процессоры не очень-то удобно. Если в лоб сравнивать код, написанный под CISC и RISC процессоры, очевидно преимущество первого.
Так выглядит код одной и той же операции для x86 и ARM.
x86
- MOV AX, 15; AH = 00, AL = 0Fh
- AAA; AH = 01, AL = 05
- RET
- MOV R3, #10
- AND R2, R0, #0xF
- CMP R2, R3
- IT LT
- BLT elsebranch
- ADD R2. #6
- ADD R1. #1
- elsebranch:
- END
Представьте, что вы проектируете процессор. Расположение блоков на х86 выглядело бы так.

Каждый цветной квадрат — это отдельные команды. Их много и они разные. Как вы поняли, здесь мы уже говорим про микроархитектуру, которая вытекает из набора команд. А вот ARM-процессор скорее выглядит так.

Ему не нужны блоки, созданные для функций, написанных 50 лет назад.
По сути, тут блоки только для самых востребованных команд. Зато таких блоков много. А это значит, что можно одновременно выполнять больше базовых команд. А раритетные не занимают место.
Еще один бонус сокращенного набора RISC: меньше места на чипе занимает блок по декодированию команд. Да, для этого тоже нужно место. Архитектура RISC проще и удобнее, загибайте пальцы:
- проще работа с памятью,
- более богатая регистровая архитектура,
- легче делать 32/64/128 разряды,
- легче оптимизировать,
- меньше энергопотребление,
- проще масштабировать и делать отладку.
Поэтому наши смартфоны, которые работают на ARM процессорах с архитектурой RISC, долго живут, не требуют активного охлаждения и такие быстрые.
Лицензирование
Но это все отличия технические. Есть отличия и организационные. Вы не задумывались почему для смартфонов так много производителей процессоров, а в мире ПК на x86 только AMD и Intel? Все просто — ARM это компания которая занимается лицензированием, а не производством.
Даже Apple приложила руку к развитию ARM. Вместе с Acorn Computers и VLSI Technology. Apple присоединился к альянсу из-за их грядущего устройства — Newton. Устройства, главной функцией которого было распознавание текста.
Даже вы можете начать производить свои процессоры, купив лицензию. А вот производить процессоры на x86 не может никто кроме синей и красной компании. А это значит что? Правильно, меньше конкуренции, медленнее развитие. Как же так произошло?

Ну окей. Допустим ARM прекрасно справляется со смартфонами и планшетами, но как насчет компьютеров и серверов, где вся поляна исторически поделена? И зачем Apple вообще ломанулась туда со своим Apple Silicon.
Что сейчас?
Допустим мы решили, что архитектура ARM более эффективная и универсальная. Что теперь? x86 похоронен?
На самом деле, в Intel и AMD не дураки сидят. И сейчас под капотом современные CISC-процессоры очень похожи на RISC. Постепенно разработчики CISC-процессоров все-таки пришли к этому и начали делать гибридные процессоры, но старый хвост так просто нельзя сбросить.

Но уже достаточно давно процессоры Intel и AMD разбивают входные инструкции на более мелкие микро инструкции (micro-ops), которые в дальнейшем — сейчас вы удивитесь — исполняются RISC ядром.
Да-да, ребята! Те самые 4-8 ядер в вашем ПК — это тоже RISC-ядра!
Надеюсь, тут вы окончательно запутались. Но суть в том, что разница между RISC и CISC-дизайнами уже сейчас минимальна.
А что остается важным — так это микроархитектура. То есть то, насколько эффективно все организовано на самом камне.
Ну вы уже наверное знаете, что Современные iPad практически не уступают 15-дюймовым MacBook Pro с процессорами Core i7 и Core i9.

А что с компьютерами?
Недавно компания Ampere представила свой 80-ядерный ARM процессор. По заявлению производителя в тестах процессор Ampere показывает результат на 4% лучше, чем самый быстрый процессор EPYC от AMD и потребляет на 14% меньше энергии.


Компания Ampere лезет в сегменты Cloud и Workstation, и показывает там отличные цифры. Самый быстрый суперкомпьютер в мире сегодня работает на ARM ISA. С обратной стороны, Intel пытается все таки влезть в сегмент low power и для этого выпускает новый интересный процессор на микроархитектуре lakefield.
Пока у ноутбуков и процессоров от Intel есть одно неоспоримое достоинство — (охлаждение и) единство архитектуры. Пока на рынке ARM-процессоров существуют Qualcomm, Samsung, MediaTek, в мире x86 творится монополия и разработчикам сильно легче делать софт и игры под “взрослые” процессоры.
И Apple та компания, которая способна мотивировать достаточное количество разработчиков пилить под свой ARM. Но суть этого перехода скорее не в противостоянии CISC и RISC. Поскольку оба подхода сближаются, акцент смещается на микроархитектуру, которую делает Apple для своих мобильных устройств. И судя по всему микроархитектура у них крута. И они хотели бы ее использовать в своих компьютерах.
И если бы Intel лицензировал x86 за деньги другим людям, то вероятно Apple просто адаптировали свою текущую микроархитектуру под x86. Но так как они не могут этого сделать, они решили просто перейти на ARM. Проблема для нас с микроархитектурой в том, что она коммерческая тайна. И мы про нее ничего не знаем.
Итоги

Спрос на ARM в итоге вырастет. Для индустрии это не просто важный шаг, а архиважный. Линус Торвальдс говорил, что пока рабочие станции не станут работать на ARM — на рынке серверов будут использовать x86.
И вот это случилось — в перспективе это миллионы долларов, вложенных в серверные решения. Что, конечно, хорошо и для потребителей. Нас ждет светлое будущее и Apple, действительно, совершила революцию!
Редактор материала: Антон Евстратенко. Этот материал помогли подготовить наши зрители Никита Куликов и Григорий Чирков. Спасибо ребята!
- Блог компании Droider.Ru
- Программирование
- Смартфоны
- Ноутбуки
- Процессоры
Архитектуры х64 и х86: в чем разница
![]()
Архитектуры х64 и х86 являются одними из наиболее широко используемых типов архитектур системы команд (АСК или ISA – Instruction Set Architecture), созданными Intel и AMD. ISA определяет поведение машинного кода и то, как программное обеспечение управляет процессором.
ISA – это аппаратный и программный интерфейс, определяющий, что и как может делать ЦП.
Прочитав эту статью, вы узнаете разницу между архитектурами х64 и х86.
Что из себя представляет архитектура х86?
х86 – это тип ISA для компьютерных процессоров, разработанный Intel в 1978 году. Архитектура х86 основана на микропроцессоре Intel 8086 (отсюда и название) и его модификации 8088. Изначально это была 16-битная система команд для 16-битных процессоров, а позже она выросла до 32-битной системы команд.
Количество битов показывает, сколько информации ЦП может обработать за цикл. Так, например, 32-разрядный ЦП передает 32 бита данных за тактовый цикл.
Благодаря своей способности работать практически на любом компьютере, от обычных ноутбуков до домашних ПК и серверов, архитектура х86 стала достаточно популярной среди многих производителей микропроцессоров.
Наиболее значительным ограничением архитектуры х86 является то, то она может обрабатывать максимум 4096 Мб ОЗУ. Поскольку общее количество поддерживаемых комбинаций равно 2 32 (4 294 967 295), то 32-разрядный процессор имеет 4,29 миллиарда ячеек памяти. В каждой ячейке хранится 1 байт данных, а в сумме это примерно 4 Гб доступной памяти.
На сегодняшний день термин х86 обозначает любой 32-разрядный процессор, способный выполнять систему команд х86.
Что из себя представляет архитектура х64?
х64 (сокращение от х86-64) – это архитектура системы команд, расширенная до 64-битного кода. В ее основе лежит архитектура х86. Впервые она была выпущена в 2000 году. Она представляла два режима работы – 64-битный режим и режим совместимости, который позволяет пользователям запускать 16-битные и 32-битные приложения.
Поскольку вся система команд х86 остается в х64, то старые исполняемые файлы работают практически без потери производительности.
Архитектура х64 поддерживает гораздо больший объем виртуальной и физической памяти, чем архитектура х86. Это позволяет приложениям хранить в памяти большие объемы данных. Кроме того, х64 увеличивает количество регистров общего назначения до 16, обеспечивая тем самым дополнительную оптимизацию использования и функциональность.
Архитектура х64 может использовать в общей сложности 2 64 байта, что соответствует 16 миллиардам гигабайт (16 эксабайт) памяти. Гораздо большее использование ресурсов делает эту архитектуру пригодной для обеспечения работы суперкомпьютеров и машин, которым требуется доступ к огромным ресурсам.
Архитектура х64 позволяет ЦР обрабатывать 64 бита данных за тактовый цикл, что намного больше, чем может себе позволить архитектура х86.
х86 VS х64
Несмотря на то, что оба эти типа архитектуры основаны на 32-битной системе команд, некоторые ключевые отличия позволяют их использовать для разных целей. Основное различие между ними заключается в количестве данных, которые они могут обрабатывать за каждый тактовый цикл, и в ширине регистра процессора.
Процессор сохраняет часто используемые данные в регистре для быстрого доступа. 32-разрядный процессор на архитектуре х86 имеет 32-битные регистры, а 64-разрядный процессор – 64-битные регистры. Таким образом, х64 позволяет ЦП хранить больше данных и быстрее к ним обращаться. Ширина регистра также определяет объем памяти, который может использовать компьютер.
В таблице ниже продемонстрированы основные различия между системами команд архитектур х86 и х64.
Архитектура x86
Процессор Intel x86 использует сложную архитектуру компьютера с набором инструкций (CISC), что означает, что существует небольшое количество специальных регистров вместо большого количества регистров общего назначения. Это также означает, что будут преобладать сложные специальные инструкции.
Процессор x86 отслеживает свое наследие, по крайней мере, еще до 8-разрядного процессора Intel 8080. Многие особенности набора инструкций x86 обусловлены обратной совместимостью с этим процессором (и с его вариантом Zilog Z-80).
Microsoft Win32 использует процессор x86 в 32-разрядном неструктурированном режиме. В этой документации основное внимание уделяется только плоскому режиму.
Регистров
Архитектура x86 состоит из следующих непривилегированных целых регистров.
Eax
Ebx
ecx
Edx
Регистр данных — можно использовать для доступа к портам ввода-вывода и арифметических функций.
Esi
Регистр исходного индекса
Edi
Регистр целевого индекса
Ebp
Регистр базового указателя
Esp
Все целочисленные регистры являются 32-разрядными. Однако многие из них имеют 16-разрядные или 8-разрядные подрегистры.
ax
Низкий 16 бит eax
Bx
Низкий 16 бит ebx
Cx
Низкий 16 бит ecx
dx
Низкий 16 бит edx
si
Низкий 16 бит esi
di
Низкий 16 бит edi
Bp
Низкий 16 бит ebp
sp
Низкий 16 бит esp
Аль
Низкий 8 бит eax
ah
Высокий 8 бит топор
Bl
Низкий 8 бит ebx
Bh
Высокие 8 бит bx
Cl
Низкий 8 бит ecx
ch
Высокие 8 бит cx
Dl
Низкий 8 бит edx
Dh
High 8 bits of dx
Работа с подрегистром влияет только на подрегистр и ни на одну из частей за пределами подрегистра. Например, сохранение в регистре оси оставляет высокие 16 бит регистра eax без изменений.
При использовании ? (Вычисление выражения) команда , регистры должны иметь префикс со знаком «at» ( @ ). Например, следует использовать ? @ax , а не ?ax. Это гарантирует, что отладчик распознает топор как регистр, а не символ.
Однако (@) не требуется в команде r (Registers). Например, r ax=5 всегда будет интерпретироваться правильно.
Два других регистра важны для текущего состояния процессора.
Eip
flags
Указатель инструкции — это адрес выполняемой инструкции.
Реестр флагов представляет собой коллекцию однобитовых флагов. Многие инструкции изменяют флаги, чтобы описать результат инструкции. Затем эти флаги можно проверить с помощью инструкций условного перехода. Дополнительные сведения см. в разделе Флаги x86 .
Соглашения о вызовах
Архитектура x86 имеет несколько различных соглашений о вызовах. К счастью, все они следуют тем же правилам сохранения регистра и возврата функций:
- Функции должны сохранять все регистры, кроме eax, ecx и edx, которые могут быть изменены в вызове функции, и esp, которые должны обновляться в соответствии с соглашением о вызовах.
- Регистр eax получает возвращаемые значения функции, если результат равен 32 бита или меньше. Если результат равен 64 битам, результат сохраняется в паре edx:eax .
Ниже приведен список соглашений о вызовах, используемых в архитектуре x86.
- Win32 (__stdcall) Параметры функции передаются в стек, отправляются справа налево, а вызываемый очищает стек.
- Вызов собственного метода C++ (также известный как thiscall) Параметры функции передаются в стек, отправляются справа налево, указатель «this» передается в регистр ECX , а вызываемый очищает стек.
- COM (__stdcall для вызовов методов C++) Параметры функции передаются в стек, отправляются справа налево, затем указатель this помещается в стек, а затем вызывается функция. Вызываемый объект очищает стек.
- __fastcall Первые два аргумента DWORD или меньше передаются в регистры ecx и edx . Остальные параметры передаются в стек и отправляются справа налево. Вызываемый объект очищает стек.
- __cdecl Параметры функции передаются в стек, помещаются справа налево, а вызывающий объект очищает стек. Соглашение о вызовах __cdecl используется для всех функций с параметрами переменной длины.
Отображение регистров и флагов отладчика
Ниже приведен пример отображения регистра отладчика:
eax=00000000 ebx=008b6f00 ecx=01010101 edx=ffffffff esi=00000000 edi=00465000 eip=77f9d022 esp=05cffc48 ebp=05cffc54 iopl=0 nv up ei ng nz na po nc cs=001b ss=0023 ds=0023 es=0023 fs=0038 gs=0000 efl=00000286
При отладке в пользовательском режиме можно игнорировать iopl и всю последнюю строку отображения отладчика.
Флаги x86
В предыдущем примере двухбуквенный код в конце второй строки — это флаги. Это одноразрядные регистры и имеют различные способы использования.
В следующей таблице перечислены флаги x86:
| Код флага | Имя флага | Значение | Состояние флага | Описание |
|---|---|---|---|---|
| из | Флаг переполнения | 0 1 | nvov | Без переполнения — переполнение |
| df | Флаг направления | 0 1 | updn | Направление вверх — направление вниз |
| if (если); | Флаг прерывания | 0 1 | diei | Прерывания отключены — прерывания включены |
| Sf | Флаг подписи | 0 1 | г. | Положительный (или нулевой) — отрицательный |
| Zf | Нулевой флаг | 0 1 | nzzr | Ненулевое — ноль |
| Af | Флаг вспомогательной переноски | 0 1 | naac | Вспомогательная переноска отсутствует — Вспомогательная переноска |
| pf | Флаг четности | 0 1 | pepo | Нечетный четность — четность |
| Cf | Перенос флага | 0 1 | nccy | Без перевозки — Carry |
| Tf | Флаг ловушки | Если значение tf равно 1, процессор вызовет исключение STATUS_SINGLE_STEP после выполнения одной инструкции. Этот флаг используется отладчиком для реализации одношаговой трассировки. Его не следует использовать другими приложениями. | ||
| iopl | Уровень привилегий ввода-вывода | Уровень привилегий ввода-вывода— это двух битовое целое число со значениями от нуля до 3. Он используется операционной системой для управления доступом к оборудованию. Он не должен использоваться приложениями. |
Когда регистры отображаются в результате выполнения какой-то команды в окне Команда отладчика, отображается состояние флага . Однако если вы хотите изменить флаг с помощью команды r (Registers), на него следует ссылаться в коде флага.
В окне Регистры WinDbg код флага используется для просмотра или изменения флагов. Состояние флага не поддерживается.
Ниже приведен пример. В предыдущем отображении регистра отображается состояние флага ng . Это означает, что флаг знака в настоящее время имеет значение 1. Чтобы изменить это, используйте следующую команду:
r sf=0
При этом флаг знака будет равен нулю. При выполнении другого отображения регистра код состояния ng не будет отображаться. Вместо этого будет отображаться код состояния pl .
Флаг подписи, нулевой флаг и флаг переноса являются наиболее часто используемыми флагами.
Условия
Условие описывает состояние одного или нескольких флагов. Все условные операции в x86 выражаются с точки зрения условий.
Для представления условия ассемблер использует сокращение из одной или двух букв. Условие может быть представлено несколькими сокращениями. Например, AE («выше или равно») является тем же условием, что и NB («не ниже»). В следующей таблице перечислены некоторые распространенные условия и их значение.
Результат последней операции равен нулю.
Результат последней операции не равен нулю.
Последняя операция требовала переноса или заимствования. (Для целых чисел без знака это означает переполнение.)
Последняя операция не требовала переноса или заимствования. (Для целых чисел без знака это означает переполнение.)
Результат последней операции имеет высокий бит.
Результат последней операции имеет высокий бит ясности.
При обработке как целочисленной операции со знаком последняя операция вызывала переполнение или недополук.
При обработке как целочисленная операция со знаком последняя операция не приводила к переполнению или недополуку.
Условия также можно использовать для сравнения двух значений. Инструкция cmp сравнивает два операнда, а затем устанавливает флаги, как если бы вычитал один операнд из другого. Для проверка результата cmpvalue1, value2 можно использовать следующие условия.