Ad esempio, quando si confrontano due numeri interi come segue in un linguaggio di tipo C:
if (3 > 2) {
// do something
}
In che modo viene giudicato se 3 è maggiore di 2 (vero) o no (falso) internamente?
Ad esempio, quando si confrontano due numeri interi come segue in un linguaggio di tipo C:
if (3 > 2) {
// do something
}
In che modo viene giudicato se 3 è maggiore di 2 (vero) o no (falso) internamente?
Risposte:
Fino in fondo alla tana del coniglio, eh? OK, ci proverò.
Passaggio 1. Da C al linguaggio macchina
Il compilatore C trasforma il tuo confronto in codici operativi memorizzati nel linguaggio macchina . Il linguaggio macchina è una serie di numeri che la CPU interpreta come istruzioni. In questo caso ci sarebbero due codici operativi: "sottrai con carry" e "salta se carry". In altre parole, 2 viene sottratto da 3 in un'istruzione e l'istruzione successiva controlla se è traboccata. Questi sarebbero preceduti da due istruzioni per caricare i numeri 2 e 3 in posizioni dove possono essere confrontati.
MOV AX, 3 ; Store 3 in register AX
MOV BX, 2 ; Store 2 in register BX
SUB AX, BX ; Subtract BX from AX
JC Label ; If the previous operation overflowed, continue processing at memory location "Label"
Ognuno di questi ha una rappresentazione binaria; ad esempio, il codice per SUB
è 2D
hex o 00101101
in binario.
Passaggio 2. Codici operativi per ALU
Opcode aritmetiche piace ADD
, SUB
, MUL
, e DIV
eseguire matematica intero base usando un ALU o logico-aritmetica Unità incorporata nella CPU. I numeri sono memorizzati nei registri da alcuni codici operativi; altri codici operativi indicano al chip di chiamare l'ALU per fare matematica su tutto ciò che è memorizzato nei registri in quel momento.
Nota: a questo punto siamo ben al di là di tutto ciò di cui qualsiasi ingegnere software si preoccuperebbe se lavorasse con un 3GL come C.
Passaggio 3. L'ALU, il mezzo-sommatore e il sommatore completo
Sapevi che tutte le operazioni matematiche che conosci possono essere ridotte a una serie di operazioni NOR ? Ed è esattamente così che funziona l'ALU.
L'ALU sa solo come lavorare con i numeri binari e può eseguire solo operazioni logiche come OR, NOT, AND e XOR. L'implementazione dell'aggiunta e sottrazione binaria viene eseguita con una serie di operazioni logiche disposte in un certo modo, in un sottosistema noto come sommatore . Questi sottosistemi sono composti da una rete di "semi-adduttori" che operano su due bit e determinano la loro somma a singolo bit e un flag carry a singolo bit. Concatenandoli insieme, l'ALU può eseguire operazioni su numeri con 8, 16, 32 bit ecc.
Che dire della sottrazione? La sottrazione è solo un'altra forma di aggiunta:
A - B = A + (-B)
L'ALU calcola -B
prendendo il complemento a due di B
. Una volta convertito in negativo, l'invio del valore al sommatore comporterà un'operazione di sottrazione.
Passaggio 4: passaggio finale: transistor su chip
Le operazioni degli additivi vengono implementate usando una combinazione di componenti elettrici che interagiscono per creare "gate logici", come quelli che si trovano nella logica transitor-transistor o TTL o in CMOS . Fai clic qui per alcuni esempi per vedere come sono collegati.
Su un chip, ovviamente, questi "circuiti" sono implementati in milioni di piccoli pezzi di materiale conduttivo e non conduttivo, ma il principio è lo stesso di se fossero componenti a grandezza naturale su una breadboard. Guarda questo video che mostra tutti i transistor su un microchip attraverso l'obiettivo di un microscopio elettronico.
Alcune note aggiuntive:
Il codice che hai scritto verrebbe effettivamente precompilato dal compilatore e non eseguito in fase di esecuzione, poiché è composto esclusivamente da costanti.
Alcuni compilatori non vengono compilati in codice macchina ma introducono ancora un altro livello, come bytecode Java o linguaggio intermedio .NET. Ma alla fine tutto viene eseguito tramite linguaggio macchina.
Alcune operazioni matematiche non sono effettivamente calcolate; sono osservati in enormi tabelle su un'unità di coprocessing aritmetica o contengono una combinazione di ricerca e calcolo o interpolazione. Un esempio potrebbe essere la funzione per calcolare una radice quadrata . Le moderne CPU per PC dispongono ciascuna di un'unità di coprocessing in virgola mobile integrata in ciascun core della CPU.
CMP
verrebbe usato, non SUB
- ma poi di nuovo è più o meno un " SUB
dove il risultato viene ignorato e vengono posizionate solo le bandiere"
if
tutto , andando direttamente alla codificado something
.