Większość treści tej odpowiedzi pochodziła pierwotnie z tej odpowiedzi (napisanej przed tym innym pytaniem oznaczonym jako duplikat). Omawiam więc używanie wartości 8-bitowych (nawet jeśli to pytanie dotyczyło wartości 32-bitowych), ale jest to w porządku, ponieważ wartości 8-bitowe są łatwiejsze do zrozumienia koncepcyjnego, a te same pojęcia dotyczą większych wartości, takich jak arytmetyka 32-bitowa.
Po dodaniu dwóch liczb, które są 8-bitowe, największa liczba, jaką można uzyskać (0xFF + 0xFF = 1FE). W rzeczywistości, jeśli pomnożymy dwie liczby, które są 8-bitowe, największa liczba, jaką można uzyskać (0xFF * 0xFF = 0xFE01) to nadal 16 bitów, dwa razy 8-bitów.
Teraz możesz założyć, że procesor x-bit może śledzić tylko x-bit. (Na przykład 8-bitowy procesor może śledzić tylko 8 bitów.) To nie jest dokładne. 8-bitowy procesor odbiera dane w 8-bitowych porcjach. (Te „fragmenty” zazwyczaj mają formalny termin: „słowo”. W 8-bitowym procesorze używa się 8-bitowych słów. W 64-bitowym procesorze można użyć 64-bitowych słów.)
Tak więc, gdy podajesz komputerowi 3 bajty:
Bajt nr 1: instrukcja MUL
Bajt nr 2: bajty wyższego rzędu (np. 0xA5)
Bajt nr 3: bajty niższego rzędu (np. 0xCB)
Komputer może wygenerować wynik, który ma więcej niż 8 bitów. Procesor może generować takie wyniki:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Teraz pozwól mi zinterpretować, że dla ciebie:
0x oznacza tylko, że następujące cyfry są szesnastkowe.
Omówię chwilę „40” bardziej szczegółowo.
82 jest częścią rejestru „A”, który jest serią 8 bitów.
xx i xx są częścią dwóch innych rejestrów, nazwanych rejestrem „B” i rejestrem „C”. Powodem, dla którego nie wypełniłem tych bitów zerami lub zerami jest to, że instrukcja „DODAJ” (wysłana do procesora) może spowodować, że te bity pozostaną niezmienione przez instrukcję (podczas gdy większość innych bitów, których używam w tym przykładzie, może zmienić się, z wyjątkiem niektórych bitów flagi).
D7 zmieściłoby więcej bitów, zwanych rejestrem „D”.
Rejestr to tylko pamięć. Rejestry są wbudowane w procesory, więc procesor może uzyskiwać dostęp do rejestrów bez konieczności interakcji z pamięcią na karcie pamięci RAM.
Zatem wynik matematyczny 0xA5 razy 0xCB to 0x82D7.
Dlaczego bity zostały podzielone na rejestry A i D zamiast rejestrów A i B lub rejestrów C i D? Cóż, po raz kolejny to przykładowy scenariusz, którego używam, który miał być raczej podobny do prawdziwego języka asemblera (16-bitowy Intel x86, używany przez Intel 8080 i 8088 i wiele nowszych procesorów). Mogą istnieć pewne wspólne reguły, takie jak rejestr „C” zwykle używany jako indeks operacji zliczania (typowy dla pętli) oraz rejestr „B” używany do śledzenia przesunięć, które pomagają określić lokalizacje pamięci. Zatem „A” i „D” mogą być bardziej powszechne w przypadku niektórych typowych funkcji arytmetycznych.
Każda instrukcja CPU powinna zawierać dokumentację, z której mogą korzystać osoby, które programują w asemblerze. Dokumentacja ta powinna określać, z których rejestrów korzysta każda instrukcja. (Tak więc wybór rejestru, którego należy użyć, jest często określany przez projektantów procesora, a nie programistów w języku asemblera. Chociaż istnieje pewna elastyczność.)
Teraz wracając do „40” w powyższym przykładzie: jest to seria bitów, często nazywana „rejestrem flag”. Każdy bit w rejestrze flag ma nazwę. Na przykład istnieje bit „przepełnienia”, który procesor może ustawić, jeśli wynik jest większy niż miejsce, w którym można zapisać jeden bajt wyników. (Do bitu „przepełnienia” często może odnosić się skrócona nazwa „OF”. To duża litera, a nie zero.) Oprogramowanie może sprawdzić wartość tej flagi i zauważyć „problem”. Praca z tym bitem jest często obsługiwana niewidocznie przez języki wyższego poziomu, więc początkujący programiści często nie uczą się, jak wchodzić w interakcje z flagami procesora. Jednak programiści asemblera mogą często uzyskiwać dostęp do niektórych z tych flag w sposób bardzo podobny do innych zmiennych.
Na przykład możesz mieć wiele instrukcji ADD. Jedna instrukcja ADD może przechowywać 16 bitów wyników w rejestrze A i rejestrze D, podczas gdy inna instrukcja może po prostu przechowywać 8 niskich bitów w rejestrze A, zignorować rejestr D i określić bit przepełnienia. Następnie, później (po zapisaniu wyników rejestru A w głównej pamięci RAM), można użyć innej instrukcji ADD, która przechowuje tylko 8 wysokich bitów w rejestrze (ewentualnie rejestr A). To, czy trzeba użyć flagi przepełnienia, może zależy od tego, jakiej instrukcji mnożenia używasz.
(Często występuje też flaga „niedomiaru”, na wypadek, gdyby odjąć za dużo, aby zmieścić się w pożądanym wyniku).
Aby pokazać, jak skomplikowane są sprawy:
Intel 4004 był 4-bitowym procesorem
Intel 8008 był 8-bitowym procesorem. Miał 8-bitowe rejestry o nazwach A, B, C i D.
Intel 8086 był 16-bitowym procesorem. Miał 16-bitowe rejestry o nazwach AX, BX, CX i DX.
Intel 80386 był 32-bitowym procesorem. Miał 32-bitowe rejestry o nazwach EAX, EBX, ECX i EDX.
Procesory Intel x64 mają 64-bitowe rejestry o nazwach RAX, RBX, RCX i RDX. Układy x64 mogą uruchamiać 16-bitowy kod (w niektórych trybach pracy) i mogą interpretować instrukcje 16-bitowe. Robiąc to, bity tworzące rejestr AX są połową bitów tworzących rejestr EAX, które są połową bitów tworzących rejestr RAX. Tak więc za każdym razem, gdy zmieniasz wartość AX, zmieniasz także EAX i RAX, ponieważ te bity używane przez AX są częścią bitów używanych przez RAX. (Jeśli zmienisz EAX o wartość będącą wielokrotnością 65 536, wtedy 16 niskich bitów pozostaje niezmienionych, więc AX nie zmieni się. Jeśli zmienisz EAX o wartość, która nie jest wielokrotnością 65 536, to wpłynie to również na AX .)
Jest więcej flag i rejestrów niż tylko te, o których wspomniałem. Po prostu wybrałem kilka najczęściej używanych, aby zapewnić prosty przykład koncepcyjny.
Teraz, jeśli korzystasz z 8-bitowego procesora, kiedy piszesz do pamięci, możesz napotkać pewne ograniczenia dotyczące możliwości odniesienia się do adresu 8-bitowego, a nie adresu 4-bitowego lub 16-bitowego. Szczegóły różnią się w zależności od procesora, ale jeśli masz takie ograniczenia, procesor może mieć do czynienia z 8-bitowymi słowami, dlatego procesor jest najczęściej nazywany „procesorem 8-bitowym”.