Всички тези предположения имат контрапримери.
Размерът на всяка инструкция
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