У всех этих предположений есть контрпримеры.
Размер каждой инструкции
У 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