Размеры слов и их показания

См. ниже вопрос о размерах слов в различных архитектурах наборов команд и о том, как это связано с языками ассемблера. Спасибо за любую помощь.

Сначала несколько фактов (пожалуйста, поправьте меня, если что-то из этого не так). Размер слова архитектуры процессора указывает (РЕДАКТИРОВАТЬ: некоторые из них были неправильными, см. сообщение Севы ниже):

  1. Максимальный размер каждого регистра
  2. Наибольший размер каждого адреса памяти (объем памяти, который может быть адресован)
  3. Наибольшее целое число, которое ЦП может обработать за одну инструкцию.
  4. Самый большой фрагмент данных, который может быть передан в рабочую память и из нее за одну операцию

А теперь начинается действительно странная вещь: в языке ассемблера для IA-32 слово имеет длину 16 бит. IA-32 относится ко всем версиям x86, поддерживающим 32-разрядные вычисления (т. е. слово должно иметь длину 32 разряда).

Это просто разваливает все мое понимание слов и того, что они обозначают (список выше).

Спасибо, что помогли мне разобраться в этом,

Магнус

РЕДАКТИРОВАНИЕ 2. Ниже приведены две полезные ссылки по архитектуре x86.

  1. Как написал altie ниже: http://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture
  2. Я наткнулся на простое руководство по x86: http://www.swansontec.com/sintel.html.

person Magnus    schedule 11.12.2013    source источник
comment
Размер слова архитектуры процессора указывает размер каждой инструкции Не совсем так. Например, x86 использует инструкции переменной длины.   -  person Michael    schedule 11.12.2013
comment
Извините, пропустил это. Обновлю свой пост.   -  person Magnus    schedule 11.12.2013
comment
x86, вероятно, является худшим примером для определения слова.   -  person harold    schedule 11.12.2013


Ответы (2)


У всех этих предположений есть контрпримеры.

Размер каждой инструкции

У Intel x86 были инструкции переменной длины с незапамятных времен. То же самое делает ARM в режиме Thumb-2.

Максимальный размер каждого регистра

Вы имеете в виду - целочисленные регистры, верно? Регистры с плавающей запятой в Intel имеют длину, например, 10 байт. Этот самый близкий. Но Intel x86 является заметным исключением — его определение «слова» было исправлено во времена 16-разрядных процессоров; по мере продвижения ISA определение закрепилось.

Точно так же в контексте набора инструкций ARM AArch64 «слово» означает «32 бита», тогда как регистры общего назначения являются 64-битными. Определение «слово» было исправлено в период расцвета 32-разрядных технологий ARM и осталось с тех пор.

Наибольший размер каждого адреса памяти

Явно неправильно. 16-битный Intel 286 имел 24-битное адресное пространство. Это выполняется через блок управления памятью (MMU) — адрес пользовательского уровня в регистре не совпадает с физическим адресом, который входит в подсистему памяти. То же самое с PAE на последних процессорах Intel. Раньше у Intel x86 линейный 20-битный адрес состоял из 16-битного сегмента и смещения.

Наибольшее целое число, которое ЦП может обработать за одну инструкцию.

Это близко - но опять же, с исключениями. Здесь и там есть двухрегистровые команды. В MIPS есть hi:lo — выделенная пара 32-битных регистров, которые могут действовать как один 64-битный. У Intel есть команды, которые работают с парой xDX:xAX. И не заводи меня на SIMD.

Самый большой фрагмент данных, который может быть передан в рабочую память и из нее за одну операцию

У ARM есть команды «загрузить несколько» и «сохранить несколько», которые могут хранить до 16 регистров за один раз. У Intel есть PUSHA/POPA. На физическом уровне шины памяти также различаются.

Грязная маленькая правда состоит в том, что не существует единственного истинного определения слова вне контекста книги, в которой оно встречается, и ассемблера, который его использует. В Intel «слово» с незапамятных времен использовалось для обозначения 16-битного фрагмента; поскольку процессоры стали 32-битными и 64-битными, они сохранили определение, теперь мы говорим о DWORD и QWORD. Регистры современных 64-разрядных процессоров Intel имеют размер QWORD. Windows API, который больше не является строго Intel, родился на 16-битной Intel и до сих пор сохраняет типы данных. WORD определяется в windows.h как беззнаковое короткое (2 байта), и они никогда не могут его изменить - это нарушит макеты структур, следовательно, двоичные форматы для всех и везде.

На ARM, с другой стороны, «слово» обозначает 32 бита, даже в контексте набора инструкций AArch64. Таким образом, есть ассемблерные команды, такие как «загрузить полуслово», которые работают с 16-битными операндами. Поэтому при написании кода на C для Windows на ARM (т. е. Windows Phone, Windows RT, Windows CE/Mobile) и при сборке одного и того же вы должны помнить о двух разных определениях. К счастью, учитывая двусмысленность, никто не думает словами — по крайней мере, не думая о реальных размерах. Кроме того, язык ассемблера ARM настоятельно рекомендует работать с 32-битными значениями, насколько это возможно, продвигая 16-битные переменные, когда это необходимо. Таким образом, даже 16-битные параметры функций передаются внутри как 32-битные регистры.

person Seva Alekseyev    schedule 11.12.2013
comment
Хммм, так что же значит, когда вы говорите, что ISA - это 32-битная ISA тогда, как не размер адресов памяти? - person Magnus; 11.12.2013
comment
Это то, что мы называем оператором, сильно зависящим от контекста :) Набор инструкций, в котором размер команды составляет ровно 32 бита (как это применимо к ARM или MIPS). ISA, в котором размер регистра по умолчанию составляет 32 бита, но его можно переопределить (как в Intel). Дьявол кроется в деталях, как обычно. - person Seva Alekseyev; 11.12.2013
comment
Раньше у ARM был режим под названием Thumb, в котором регистры и адреса по-прежнему были 32-битными, но все команды были 16-битными. Поэтому, когда они говорят о 32-битном коде и 16-битном коде ARM, они имеют в виду ванильный ARM и Thumb. Современная разновидность Thumb (Thumb-2) имеет кодировку переменной длины — 16 или 32 бита. Так что говорить о 16-битном коде уже нечестно — теперь это просто Thumb-код. - person Seva Alekseyev; 11.12.2013
comment
Сева, спасибо. Правильно ли это: 1) В ARM и MIPS инструкции имеют длину ровно 32 бита. 2) На IA-32 инструкции имеют переменную длину. 3) В ARM и MIPS размер регистра по умолчанию составляет 32 бита. 4) В IA-32 размер регистра по умолчанию составляет 32 бита, но он переопределен, чтобы разрешить регистры меньшего размера (например, EBX --> BX (16 бит) и т. д.)? - person Magnus; 11.12.2013
comment
1) Больше нет; и современные ARM, и современные MIPS имеют расширения с более короткими инструкциями. Однако в их стандартном/устаревшем наборе инструкций инструкции строго 32-битные. 2) Правда. 3) Да, в стандартном/устаревшем режиме, который не единственный. 4) Да. Однако процессоры Intel не запускаются в режиме IA-32 — они запускаются в реальном режиме с 16-битными регистрами. Примечание. Я обсудил только те процессоры, с которыми я знаком; там больше. - person Seva Alekseyev; 11.12.2013
comment
Большое спасибо. Еще пара вопросов, если можно: 1) Причина того, что язык ассемблера для IA-32 имеет размер слова 16, хотя на самом деле ISA 32-битный, заключается в том, что язык придерживается устаревшего определения слова? 2) Размер слова на ассемблере для MIPS и ARM составляет 32 бита? 3) Если современная Windows говорит, что она 32-битная или 64-битная, к чему это тогда относится? - person Magnus; 11.12.2013
comment
относительно ARM64: они сохранили «слово» для 32-битного числа. 64-битный вариант называется «двойное слово» или «расширенное слово». - person Igor Skochinsky; 11.12.2013
comment
1) Да. 2) Да, это то, что они имеют в виду в своих документах, когда говорят слово. 3) Разрядность режима, в который он переключает ЦП вскоре после запуска. Поэтому размер регистра по умолчанию и размер всех типов данных указателя. - person Seva Alekseyev; 11.12.2013
comment
Что касается самого большого фрагмента данных, который может быть передан в рабочую память и из нее за одну операцию. Я думаю, что ответ 128-бит или 256-бит. Sandy Bridge может, например, выполнять два 128-битных чтения одновременно, но только одну 128-битную запись. - person Z boson; 11.12.2013

Чтобы уточнить утверждение Севы «даже не заставляйте меня начинать с SIMD», многие инструкции x86 поддерживают множество типов операндов. См. обсуждение здесь: http://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture

В различных полях выходных данных инструкции CPUID указано, какие из этих режимов поддерживаются. Например, флаги SSE сообщат вам, доступны ли регистры XMM, а флаг AVX сообщит вам, доступны ли регистры YMM.

person Aaron Altman    schedule 11.12.2013
comment
Большое спасибо, эта ссылка очень полезна. Я добавлю эту и другую ссылку в свой основной пост. - person Magnus; 11.12.2013