Більша частина змісту цієї відповіді спочатку походила з цієї відповіді (написана до цього іншого питання була позначена як дублікат). Тож я обговорюю використання 8-бітових значень (хоча це питання задавало 32-бітні значення), але це нормально, оскільки 8-бітні значення простіше зрозуміти концептуально, і ті ж самі поняття застосовуються до великих значень, таких як 32-бітна арифметика.
Коли ви додасте два числа, які є 8 бітними, найбільше число ви можете отримати (0xFF + 0xFF = 1FE). Насправді, якщо ви помножите два числа, які є 8-бітними, то найбільше число, яке ви можете отримати (0xFF * 0xFF = 0xFE01), це все-таки 16 біт, вдвічі більше 8-розрядних.
Тепер ви можете припускати, що x-бітовий процесор може відслідковувати лише x-біти. (Наприклад, 8-бітний процесор може відслідковувати лише 8 біт.) Це не точно. 8-бітний процесор отримує дані 8-бітними фрагментами. (Ці "шматки" зазвичай мають формальний термін: "слово". На 8-бітовому процесорі використовуються 8-бітні слова. На 64-бітному процесорі можна використовувати 64-бітні слова.)
Отже, коли ви надаєте комп'ютеру 3 байти:
Байт №1:
Байт інструкції MUL №2: байти високого порядку (наприклад, 0xA5)
Байт №3: байти нижнього порядку (наприклад, 0xCB)
Комп'ютер може генерувати результат, який більше 8 біт. Процесор може генерувати такі результати:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Тепер дозвольте мені інтерпретувати, що для вас:
0x означає, що наступні цифри є шістнадцятковими.
Я коротко детально обговорю "40".
82 є частиною регістра "А", який представляє собою серію з 8 біт.
xx і xx є частиною двох інших регістрів, названих регістром "B" та регістром "C". Причиною того, що я не заповнив ці біти нулями або одиницями, є те, що вказівка "ADD" (надіслана до процесора) може призвести до того, що ці біти не змінюються інструкцією (тоді як більшість інших бітів, які я використовую в цьому прикладі, можуть змінити, за винятком деяких бітів прапора).
D7 помістився б у декількох бітах, названих регістром "D".
Реєстр - просто частинка пам'яті. Реєстри вбудовані в процесори, тому процесор може отримати доступ до регістрів, не потребуючи взаємодії з пам'яттю на RAM-накопичувачі.
Тож математичний результат 0xA5 разів 0xCB дорівнює 0x82D7.
Тепер, чому біти розбилися на регістри A і D замість регістрів A і B, або регістри C і D? Ну, ще раз, це зразковий сценарій, який я використовую, мав бути досить схожим за концепцією на реальній мові збірки (Intel x86 16-розрядний, як це використовуються Intel 8080 та 8088 та багато новіших процесорів). Можливо, існують деякі загальні правила, такі як регістр "C", який зазвичай використовується як індекс для підрахунку операцій (типовий для циклів), а регістр "B" використовується для відстеження зрушень, які допомагають визначити місця пам'яті. Отже, "A" і "D" можуть бути більш поширеними для деяких загальних арифметичних функцій.
Кожна інструкція щодо процесора повинна мати певну документацію, яку використовують люди, які програмують в Асамблеї. Ця документація повинна визначати, які регістри використовуються кожною інструкцією. (Отже, вибір щодо того, які регістри використовувати, часто визначають дизайнери ЦП, а не програмісти мови Асамблеї. Хоча, може бути певна гнучкість.)
Тепер, повертаючись до "40" у наведеному вище прикладі: це серія бітів, яку часто називають "регістром прапорів". Кожен біт у реєстрі прапорів має назву. Наприклад, є біт "переповнення", який CPU може встановити, якщо отриманий результат більший за простір, який може зберігати один байт результатів. (Біт "переповнення" часто може називатися скороченою назвою "OF". Це велика літера, а не нуль.) Програмне забезпечення може перевірити значення цього прапора і помітити "проблему". Робота з цим бітом часто непомітно обробляється мовами вищого рівня, тому початківці програмісти часто не дізнаються про те, як взаємодіяти з прапорцями CPU. Однак програмісти по збірці можуть зазвичай отримувати доступ до деяких цих прапорів таким чином, що дуже схожий на інші змінні.
Наприклад, у вас може бути кілька інструкцій щодо додавання. Одна інструкція ADD може зберігати 16 бітів результатів в регістрі A і D-регістрі, тоді як інша інструкція може просто зберігати 8 низьких бітів в регістрі A, ігнорувати D-регістр і вказувати біт переповнення. Потім, пізніше (після збереження результатів реєстру A в основній оперативній пам’яті), ви можете використовувати іншу інструкцію ADD, яка зберігає в реєстрі лише 8 високих розрядів (можливо, регістр A). Чи потрібно вам використовувати прапор переповнення залежить лише від того, яку інструкцію щодо множення ви використовуєте.
(Існує також звичайний прапор "під", якщо ви віднімаєте занадто багато, щоб підходити до бажаного результату.)
Тільки для того, щоб показати вам, наскільки складні речі:
Intel 4004 був 4-бітним процесором
. Intel 8008 - це 8-розрядний процесор. Він мав 8-бітні регістри з назвою A, B, C та D.
Intel 8086 був 16-бітним процесором. Він мав 16-бітні регістри з назвою AX, BX, CX і DX.
Intel 80386 був 32-розрядним процесором. Він мав 32-бітні регістри з назвою EAX, EBX, ECX та EDX.
Процесори Intel x64 мають 64-бітні регістри з назвою RAX, RBX, RCX і RDX. Чіпи x64 можуть працювати з 16-бітовим кодом (у деяких режимах роботи) та можуть інтерпретувати 16-бітні інструкції. При цьому біти, що складають регістр AX, - це половина бітів, що складають регістр EAX, - це половина бітів, що складають регістр RAX. Отже, щоразу, коли ви змінюєте значення AX, ви також змінюєте EAX і RAX, тому що ті біти, які використовує AX, є частиною бітів, які використовуються RAX. (Якщо ви зміните EAX на значення, кратне 65536, то низькі 16 біт не змінюються, щоб AX не змінився. Якщо ви зміните EAX на значення, яке не є кратним 65,536, то це також вплине на AX .)
Є більше прапорів та регістрів, ніж лише ті, про які я згадав. Я просто обрав кілька часто використовуваних, щоб надати простий концептуальний приклад.
Тепер, якщо ви користуєтесь 8-бітним процесором, коли ви пишете в пам'ять, ви можете виявити деякі обмеження щодо можливості посилатися на адресу 8-бітних, а не на адресу 4-бітових або 16-бітних. Деталі залежать від ЦП, але якщо у вас є такі обмеження, то CPU може мати справу з 8-бітовими словами, саме тому CPU найчастіше називають "8-бітним процесором".