La maggior parte del contenuto di questa risposta originariamente proveniva da questa risposta (scritta prima che l'altra domanda fosse contrassegnata come duplicata). Quindi discuto l'utilizzo di valori a 8 bit (anche se questa domanda ha richiesto valori a 32 bit), ma va bene perché i valori a 8 bit sono più semplici da comprendere concettualmente e gli stessi concetti si applicano a valori più grandi come l'aritmetica a 32 bit.
Quando aggiungi due numeri a 8 bit, il numero più grande che puoi ottenere (0xFF + 0xFF = 1FE). Infatti, se moltiplichi due numeri che sono 8 bit, il numero più grande che puoi ottenere (0xFF * 0xFF = 0xFE01) è ancora 16 bit, due volte di 8 bit.
Ora, potresti supporre che un processore x-bit possa tenere traccia solo di x-bit. (Ad esempio, un processore a 8 bit può tenere traccia solo di 8 bit.) Non è esatto. Il processore a 8 bit riceve i dati in blocchi di 8 bit. (Questi "blocchi" in genere hanno un termine formale: una "parola". Su un processore a 8 bit, vengono utilizzate parole a 8 bit. Su un processore a 64 bit, è possibile utilizzare parole a 64 bit.)
Quindi, quando si danno al computer 3 byte:
Byte # 1: l'istruzione MUL
Byte # 2: i byte di ordine superiore (ad es. 0xA5)
Byte # 3: i byte di ordine inferiore (ad es. 0xCB)
Il computer può generare un risultato che è più di 8 bit. La CPU può generare risultati come questo:
0100 0000 0100 0010 xxxx xxxx xxxx xxxx 1101 0111
aka:
0x4082xxxxD7
Ora, lasciami interpretare che per te:
0x significa solo che le seguenti cifre sono esadecimali.
Discuterò i "40" in modo più dettagliato per un momento.
82 fa parte del registro "A", che è una serie di 8 bit.
xx e xx fanno parte di altri due registri, denominati registro "B" e registro "C". Il motivo per cui non ho riempito quei bit con zero o uno è che un'istruzione "ADD" (inviata alla CPU) può far sì che quei bit rimangano invariati dall'istruzione (mentre la maggior parte degli altri bit che uso in questo esempio può viene modificato, ad eccezione di alcuni dei bit di flag).
D7 si adatterebbe in più bit, chiamato registro "D".
Un registro è solo un pezzo di memoria. I registri sono integrati nelle CPU, quindi la CPU può accedere ai registri senza la necessità di interagire con la memoria su una chiavetta RAM.
Quindi il risultato matematico di 0xA5 volte 0xCB è 0x82D7.
Ora, perché i bit sono stati divisi nei registri A e D anziché nei registri A e B o nei registri C e D? Bene, ancora una volta, questo è uno scenario di esempio che sto usando, pensato per essere piuttosto simile nel concetto a un vero linguaggio Assembly (Intel x86 a 16 bit, utilizzato da Intel 8080 e 8088 e molte CPU più recenti). Potrebbero esserci alcune regole comuni, come il registro "C" in genere utilizzato come indice per le operazioni di conteggio (tipico per i loop) e il registro "B" utilizzato per tenere traccia degli offset che aiutano a specificare le posizioni di memoria. Pertanto, "A" e "D" possono essere più comuni per alcune delle comuni funzioni aritmetiche.
Ogni istruzione CPU dovrebbe avere della documentazione, usata dalle persone che programmano in Assembly. Tale documentazione dovrebbe specificare quali registri vengono utilizzati da ciascuna istruzione. (Quindi la scelta su quali registri usare è spesso specificata dai progettisti della CPU, non dai programmatori del linguaggio Assembly. Anche se può esserci una certa flessibilità.)
Ora, tornando a "40" nell'esempio sopra: si tratta di una serie di bit, spesso chiamati "flags register". Ogni bit nel registro flag ha un nome. Ad esempio, esiste un bit di "overflow" che la CPU può impostare se il risultato è maggiore dello spazio che può memorizzare un byte dei risultati. (Il bit di "overflow" può essere spesso indicato con il nome abbreviato di "OF". Questo è un maiuscolo o non uno zero.) Il software può verificare il valore di questo flag e notare il "problema". Lavorare con questo bit è spesso gestito in modo invisibile da linguaggi di livello superiore, quindi i programmatori principianti spesso non imparano come interagire con i flag della CPU. Tuttavia, i programmatori di Assembly possono accedere ad alcuni di questi flag in modo molto simile ad altre variabili.
Ad esempio, potresti avere più istruzioni ADD. Un'istruzione ADD potrebbe memorizzare 16 bit di risultati nel registro A e nel registro D, mentre un'altra istruzione potrebbe semplicemente memorizzare gli 8 bit bassi nel registro A, ignorare il registro D e specificare il bit di overflow. Quindi, in seguito (dopo aver memorizzato i risultati del registro A nella RAM principale), è possibile utilizzare un'altra istruzione ADD che memorizza solo gli 8 bit alti in un registro (possibilmente il registro A). Può essere necessario utilizzare un flag di overflow dipende da quale istruzione di moltiplicazione usi.
(C'è anche comunemente un flag "underflow", nel caso in cui si sottragga troppo per adattarsi al risultato desiderato.)
Solo per mostrarti quanto sono complicate le cose:
l'Intel 4004 era una CPU a 4 bit
L'Intel 8008 era una CPU a 8 bit. Aveva registri a 8 bit denominati A, B, C e D.
L'Intel 8086 era una CPU a 16 bit. Aveva registri a 16 bit denominati AX, BX, CX e DX.
L'Intel 80386 era una CPU a 32 bit. Aveva registri a 32 bit denominati EAX, EBX, ECX ed EDX.
Le CPU Intel x64 hanno registri a 64 bit denominati RAX, RBX, RCX e RDX. I chip x64 possono eseguire codice a 16 bit (in alcune modalità operative) e possono interpretare istruzioni a 16 bit. Nel fare ciò, i bit che compongono il registro AX sono la metà dei bit che compongono il registro EAX, che sono la metà dei bit che compongono il registro RAX. Quindi ogni volta che modifichi il valore di AX, stai anche cambiando EAX e RAX, perché quei bit usati da AX fanno parte dei bit usati da RAX. (Se si modifica EAX di un valore multiplo di 65.536, i 16 bit bassi rimangono invariati, quindi AX non cambierebbe. Se si modifica EAX di un valore che non è un multiplo di 65.536, ciò influirebbe anche su AX .)
Ci sono più bandiere e registri oltre a quelli che ho citato. Ho semplicemente scelto alcuni di quelli comunemente usati per fornire un semplice esempio concettuale.
Ora, se si utilizza una CPU a 8 bit, quando si scrive in memoria, è possibile riscontrare alcune limitazioni sulla possibilità di fare riferimento a un indirizzo di 8 bit, non a un indirizzo di 4 bit o 16 bit. I dettagli varieranno in base alla CPU, ma se si hanno tali restrizioni, è possibile che la CPU abbia a che fare con parole a 8 bit, motivo per cui la CPU viene comunemente definita "CPU a 8 bit".