Come funziona il confronto dei numeri interi internamente?

18

es. quando si confrontano due interi come segue in un linguaggio simile a C:

if (3 > 2) {
    // do something
}

Com'è il giudizio se 3 è maggiore di 2 (vero) o no (falso) fatto internamente?

    
posta Niek 05.08.2017 - 04:10
fonte

1 risposta

60

Fino in fondo alla tana del coniglio, eh? OK, ci proverò.

Passaggio 1. Da C alla lingua della macchina

Il compilatore C trasforma il tuo confronto in opcode memorizzati nella lingua della macchina . Il linguaggio macchina è una serie di numeri che la CPU interpreta come istruzioni. In questo caso ci sarebbero due opcode: "sottrarre con carry" e "jump se carry". In altre parole, 2 viene sottratto da 3 in una istruzione e l'istruzione successiva verifica se è in overflow. Questi sarebbero preceduti da due istruzioni per caricare i numeri 2 e 3 in posizioni in cui 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"

Ciascuno di questi ha una rappresentazione binaria; ad esempio, il codice per SUB è 2D hex, o 00101101 in binario.

Passaggio 2. Opcode a ALU

Gli opcode aritmetici come ADD , SUB , MUL e DIV eseguono calcoli matematici interi di base usando un ALU o Unità logica aritmetica integrata nella CPU. I numeri sono memorizzati in registri da alcuni opcode; altri opcode indicano al chip di chiamare l'ALU per fare matematica su qualsiasi cosa sia memorizzata nei registri al momento.

Nota: a questo punto siamo ben al di là di qualsiasi cosa che qualsiasi ingegnere del software si preoccupi se lavori con un 3GL come C.

Passaggio 3. L'ALU, mezzo-adder e full-adder

Sapevi che tutte le operazioni matematiche che conosci possono essere ridotte a una serie di operazioni NOR ? E questo è esattamente come 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 di addizione e sottrazione binaria viene eseguita con una serie di operazioni logiche disposte in un certo modo, in un sottosistema noto come addizionatore . Questi sottosistemi sono composti da una rete di "mezzi sommatori" che operano su due bit e determinano la loro somma a bit singolo e un flag di carry a singolo bit. Collegando questi insieme, l'ALU può eseguire operazioni su numeri con 8, 16, 32 bit ecc.

Eriguardoallasottrazione?Lasottrazioneèsoloun'altraformadiaggiunta:

A-B=A+(-B)

L'ALUcalcola-Bprendendoil 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 on-chip

Le operazioni dei sommatori sono implementate usando una combinazione di componenti elettrici che interagiscono per creare "porte logiche", come quelle che si trovano in transitor-transistor logic o TTL, o in CMOS . Fai clic qui per alcuni esempi per vedere come sono cablati.

Su un chip, ovviamente, questi "circuiti" sono implementati in milioni di minuscoli bit di materiale conduttivo e non conduttivo, ma il principio è lo stesso di se fossero componenti di dimensioni complete su una breadboard. Guarda questo video che mostra tutti i transistor su un microchip attraverso l'obiettivo di un microscopio elettronico.

Alcune note aggiuntive:

  1. Il codice che hai scritto verrebbe effettivamente precalcolato dal compilatore e non eseguito in fase di esecuzione, perché è composto esclusivamente da costanti.

  2. Alcuni compilatori non compilano il codice macchina ma introducono ancora un altro livello, ad esempio bytecode Java o linguaggio intermedio .NET. Ma alla fine viene eseguito tutto tramite il linguaggio macchina.

  3. Alcune operazioni matematiche non sono in realtà calcolate; vengono cercati in enormi tabelle su un'unità di elaborazione aritmetica o contengono una combinazione di ricerca, calcolo o interpolazione. Un esempio potrebbe essere la funzione per calcolare una radice quadrata . Le moderne CPU per PC hanno ciascuna un'unità di coprocessing in virgola mobile integrata in ciascun core della CPU.

risposta data 05.08.2017 - 04:30
fonte

Leggi altre domande sui tag