Il linguaggio macchina è sempre binario? [duplicare]

22

Non conosco assolutamente nulla nelle cose di basso livello, quindi questa sarà una domanda da principianti. Per favore, scusa la mia ignoranza.

Il linguaggio macchina - la serie di numeri che dice al computer fisico esattamente cosa fare - sempre binario? Cioè composto sempre di soli zero uno? Oppure potrebbe anche essere composto da numeri come 101, 242, 4 ecc.?

    
posta Aviv Cohn 20.04.2014 - 02:42
fonte

6 risposte

47

Tutto in un computer (per essere precisi, in un tipico computer contemporaneo) è binario, ad un certo livello. "1s e 0s" è un'astrazione, un'idea che usiamo per rappresentare un modo di distinguere tra due valori. Nella RAM, ciò significa maggiore e minore tensione. Sul disco rigido, ciò significa stati magnetici distinti e così via. Usando la logica booleana e un sistema di numeri di base 2, una combinazione di 1 e 0 può rappresentare qualsiasi numero, e altre cose (come lettere, immagini, suoni, ecc.) Possono essere rappresentati come numeri.

Ma non è quello che le persone intendono quando dicono "codice binario". Questo ha un significato specifico per i programmatori: il codice "binario" è un codice che non è in forma di testo. Il codice sorgente esiste come testo; sembra un sistema altamente formalizzato di simboli inglesi e matematici. Ma la CPU non capisce l'inglese o la notazione matematica; comprende i numeri. Quindi il compilatore traduce il codice sorgente in un flusso di numeri che rappresentano le istruzioni della CPU che hanno lo stesso significato di base del codice sorgente. Questo è correttamente noto come "codice macchina", ma molte persone lo chiamano "binario".

    
risposta data 20.04.2014 - 03:01
fonte
23

Diamo un'occhiata a una vera e propria istruzione della macchina. Supponiamo di avere una CPU ARM e vogliamo aggiungere 143 al valore nel registro 2, posizionando il risultato nel registro 1. Nel linguaggio assembly ARM scritto

ADD  R1, R2, #143

Questa istruzione di assemblaggio può essere codificata come singola istruzione macchina. La specifica di come è fatto nella pagina fisica 156 del BRACCIO ARM , in modo divertente- denominato Manuale di riferimento sull'architettura della macchina RISC di Acorn. È anche necessario guardare la definizione di "shifter operando", che inizia sulla pagina fisica 444.

 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
|    Cond   | 0  0  I  0  1  0  0  S|     Rn    |     Rd    |          shifter operand          |

Come sembra che tu abbia già capito, le istruzioni della macchina sono numeri e, sul ARM, sono numeri di una dimensione fissa: 32 bit, suddivisi in diversi campi. Per codificare l'ADD sopra, compiliamo i campi in questo modo:

| cond | fmt | I | opcode | S | Rn | Rd | rot | imm |
|    E |  00 | 1 |  0100  | 0 | 2  | 1  | 0   | 143 |

(Il "shifter operand" è stato diviso in "rot" e "imm" perché ho impostato I = 1.) Ora, per farlo in un singolo numero a 32 bit, dobbiamo espanderlo in binario, perché molti dei campi non sono in ordine numeri di bit lunghi:

 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
  1  1  1  0  0  0  1  0  1  0  0  0  0  0  1  0  0  0  0  1  0  0  0  0  1  0  0  0  1  1  1  1

Per gli umani è una grande sfocatura; esadecimale è più facile per noi capire:

1110  0010  1000  0010  0001  0000  1000  1111
   E     2     8     2     1     0     8     F

E così di solito, in comunicazione con altri umani, diciamo che la "istruzione macchina" corrispondente a ADD R1, R2, #143 è il numero esadecimale E282 108F . Noi potremmo dire ugualmente che è il decimale numero 3.800.174.735, ma che oscura il modello dei campi più di quello esadecimale. (Qualcuno con molta pratica di debug sul bare metal su ARM sarebbe in grado di selezionare il codice di condizione E, i registri di origine e destinazione 2 e 1, l'operando immediato 8F = 143 su E282 108F con relativa facilità.)

Tutte le rappresentazioni di cui sopra codificano la stessa istruzione della macchina! Ho solo cambiato il modo in cui l'ho scritto.

In termini di "uno e zero", se si carica un programma contenente questa istruzione nella RAM su un computer reale, da qualche parte in memoria apparirà il modello di bit 1110 0010 1000 0010 0001 0000 1000 1111 (probabilmente indietro, a causa di < a href="https://en.wikipedia.org/wiki/Endianness"> endianness ). Ma è altrettanto valido dire che da qualche parte in memoria il numero esadecimale E282 108F , o l'istruzione decodificata ADD R1, R2, #143 appare. I pattern di bit nella RAM non hanno significato in se stessi; il significato deriva dal contesto. Viceversa, quel modello di bit / numero esadecimale non è necessariamente un'istruzione! Comparirebbe anche in un programma che utilizzava il numero intero a 32 bit senza segno 3.800.174.735, o il numero in virgola mobile IEEE a precisione singola -1.199634951 × 10 21 come dati .

    
risposta data 20.04.2014 - 17:24
fonte
10

Ogni volta che qualcuno usa la frase "gli uni e gli zeri" nella maggior parte dei contesti, specialmente in questo contesto, sono, a mio avviso, significativamente travisando ciò che sta succedendo e portando così alla confusione.

Il computer non legge solo "quelli e zero" più di quando leggi un libro, leggi "le lettere". Certo, entrambi sono strettamente veri, ma quelle affermazioni stanno tralasciando un'informazione sostanziale: la struttura di ciascuno.

Nel caso dell'inglese, le lettere sono strutturate in parole e le parole formano frasi, secondo un insieme di regole. L'ordine delle lettere nelle parole e l'ordine delle parole nelle frasi possono cambiare completamente il significato.

Un processo simile è in gioco con i computer e con il linguaggio macchina. Il computer guarda gli uni e gli zeri in blocchi discreti, in byte e in gruppi di byte.

Altri poster hanno menzionato vari modi in cui i numeri possono essere codificati come singoli bit. Ci sono ints, virgola mobile, stringhe di testo, ecc. Che danno struttura al flusso di bit e byte.

In definitiva, il computer sta concettualmente guardando gruppi di bit, quindi raramente sta guardando "10101010", il suo aspetto è 101, 242 o 4, ecc. Ciò che questi numeri significano dipende dal loro contesto nel dato " frase 'fanno parte di.

    
risposta data 20.04.2014 - 06:21
fonte
5

Tutti i numeri memorizzati nella maggior parte dei computer sono archiviati tecnicamente in formato binario. A livello hardware tutto è rappresentato come una serie di segnali di alta e bassa tensione. I segnali ad alta tensione sono valori allineati / veri, i segnali di bassa tensione sono valori zeri / falsi. Questi sono i bit (abbreviazione di cifre binarie) menzionati quando si parla di macchine a 32 o 64 bit. Il numero (32,64) in questo caso si riferisce a quanti bit possono essere indirizzati dalla memoria alla volta.

Quindi nella maggior parte dei computer moderni il codice macchina è solo valori normali memorizzati in memoria, ma tutta la memoria è fatta di bit.

    
risposta data 20.04.2014 - 02:49
fonte
4

Quasi tutti i "computer" in questi giorni usano la logica binaria. Tuttavia, il significato di "computer" post-WW II è diventato un dispositivo di elaborazione con memorizzazione persistente e programmi memorizzati, piuttosto che un semplice motore di calcolo come una calcolatrice.

Alcuni esempi delle eccezioni sono:

risposta data 21.04.2014 - 06:32
fonte
1

Il linguaggio macchina non è un linguaggio universale, ma piuttosto un linguaggio strettamente connesso alla CPU, il linguaggio che la CPU comprende.

Puoi progettare una CPU con stati 42 invece di 2 stati per il più piccolo elemento di memoria . Il problema è che non si può avere un'implementazione abbastanza buona per tale CPU. In realtà, alcuni dei primi computer (incluso ENIAC) erano computer decimali che utilizzavano implicitamente un linguaggio decimale.

Il fatto che sia decimale o binario o altro valore dipende dal numero di stati che può assumere il più piccolo elemento di memoria (un bit); 2 non è stato scelto per scopi di progettazione della CPU, ma piuttosto limitato dall'implementazione elettronica: un transistor funziona molto meglio e più velocemente con solo 2 livelli di tensione anziché 10 (o qualsiasi altro numero naturale maggiore di 2).

    
risposta data 21.04.2014 - 20:17
fonte

Leggi altre domande sui tag