Размери на думите и техните указания

Моля, вижте по-долу въпрос относно размерите на думите в различни архитектури на набори от инструкции и как това се свързва с асемблерните езици. Благодаря ви за всяка помощ.

Първо няколко факта (моля, поправете ме, ако някой от тях е грешен). Размерът на думата на архитектурата на процесора показва (РЕДАКТИРАНЕ: Някои от тях са грешни, моля, вижте публикацията на Seva по-долу):

  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 дефиницията остана.

По същия начин, в контекста на набора от инструкции AArch64 на ARM, "дума" означава "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 като unsigned short (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
re 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