Che aspetto ha il codice macchina durante l'esecuzione?


21

Quando il codice macchina viene effettivamente eseguito dall'hardware e dalla CPU, che aspetto ha?

Sembrerebbe binario, come nelle istruzioni rappresentate da uno e zeri, o sarebbe qualcosa costituito da cifre esadecimali in cui gli opcode sono byte presentati come numeri esadecimali che possono essere scomposti in numeri binari, come bytecode?


24
Quello che vedresti sono fili, cancelli e registri che tremolano sul silicio. Ad esempio, visual6502.org/JSSim
Nayuki,

4
@Nayuki Penso che questa visualizzazione sia fantastica e meriti di essere trasformata in una risposta!
nalzok,

2
A me non sembra niente
Gaius,

3
Non esiste nemmeno quando è "eseguito". È "compilato JIT" da un dispositivo (hardware!) Sulla CPU per microcodice, che in realtà istruisce la CPU!
xuq01,

2
Un modo rapido per capire come si traduce un computer è quello di costruirne uno dalle porte logiche, mi piace molto guardare quello realizzato da Ben Eater youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU
Ferrybig

Risposte:


38

La migliore risposta che posso dare è che in realtà non "assomiglia" a niente. Le istruzioni attualmente eseguite dalla CPU sono rappresentate da una serie di fili, alcuni dei quali ad alta tensione, altri a bassa tensione.

Puoi interpretare le tensioni alte e basse come zero e uno, ma puoi anche interpretare bene gruppi di tensioni alte e basse come cifre esadecimali o come un'istruzione di assemblaggio come ADD $0 $1(che è più vicina a come la CPU la interpreta). Questi stessi numeri e mnemonici sono comodità che gli umani possono leggere; internamente, non è altro che tensioni sui fili.

Tra queste opzioni, il binario è "il più vicino al metallo", in quanto gli zero e quelli si mappano direttamente alle alte e basse tensioni sui fili. Ma nessuno degli altri è errato e spesso è più utile: c'è un motivo per cui le persone guardano a dump esadecimali di eseguibili, ma quasi mai a dump binari.


Quindi, potresti aprire un programma in un editor esadecimale, e quei byte rappresentati in esadecimale si traducono in binario di codice macchina che può essere eseguito da una tensione assegnata a zero e una tensione assegnata a uno?
Tim Difficilmente il

4
@TimHardly Yep! Hex è solo più facile da leggere. Allo stesso modo, l'assemblaggio è ancora più facile da leggere, ma può essere tradotto meccanicamente in zero e in uno. Ecco perché gli assemblatori sono più facili da scrivere rispetto ai compilatori.
Draconis,

grazie, tutta questa domanda ha ampliato le mie conoscenze e chiarito la mia confusione.
Tim Difficilmente il

1
@TimHardly Un assemblatore mappa semplicemente una sequenza di caratteri come "NOP" su una serie di bit come "10010000", ripetutamente, per trasformare un file di assieme in codice macchina. Gli opcode sono determinati dalla CPU, poiché è la parte che li utilizzerà effettivamente. Tutti i computer che possono eseguire gli stessi eseguibili hanno effettivamente lo stesso set di codici operativi; il set x86 è il più comune e al giorno d'oggi è utilizzato praticamente in tutti i PC. Un altro comune è MIPS, utilizzato in diverse console di gioco.
Draconis,

1
@TimHardly Se la tua domanda è: l'assemblatore può chiedere alla CPU qual è il suo codice operativo per l'istruzione NOP, la risposta è no. L'assemblatore deve già sapere quale byte emettere per l'istruzione prima che possa funzionare. In effetti, un assemblatore può generare un programma per un processore, mentre è in esecuzione su un diverso tipo di processore.
Lister,

11

"Sembri" implica una metafora. Se prendiamo "come sarà" letteralmente, sembrerà un fantastico pezzo di silicio inciso seduto sulla sua scheda madre. Chiaramente l'obiettivo era la metafora. Per costruire la metafora, dobbiamo guardare a ciò che è veramente prima. Quindi possiamo costruire una metafora accettabile. È un po 'lungo, ma fortunatamente termina con una metafora video per te.

Il codice macchina è effettivamente memorizzato come bit. I chip di memoria sono in genere DRAM , che memorizzano quei bit come tensioni attraverso un condensatore ed elettroni. I due sono collegati: è difficile parlare delle tensioni senza gli elettroni. A volte è conveniente parlare dell'uno o dell'altro, ma capire che dove uno va, l'altro segue.

Il viaggio del codice macchina inizia con un "recupero". Un particolare schema di tensioni viene applicato ai fili del chip RAM indicando che questo particolare insieme di bit deve essere inviato alla CPU. Perché? Non so non importa. In genere quel segnale viene inviato perché la CPU ha terminato l'ultima istruzione e ne chiede una nuova come risposta istintiva, come un cane che chiede una seconda sorpresa dopo che le hai dato la prima. Questo processo inizia con un calcio primordiale nei pantaloni causato da una naturale instabilità nella CPU. Quando un alimentatore applica una tensione costante al chip, gli aumenti di tensione alla fine portano alla CPU a mettere le tensioni corrette sui chip RAM per ottenere le prime istruzioni (sto un po 'a mano il livello del BIOS, perché non è importante alla storia. Cercare).

La memoria moderna trasmette i dati in parallelo. Ciò significa che i bit che compongono il codice macchina sono suddivisi in "corsie" (32 o 64 sono comuni) che è il modo logico di dire i fili 32/64 dalla RAM alla CPU. La tensione su tali linee viene aumentata e ridotta in base alle necessità per trasmetterla nella CPU.

Una volta che è nella CPU può andare a fare il suo lavoro. Questo è il regno della microarchitettura e può complicarsi perché si tratta letteralmente di un settore da miliardi di dollari. Tali tensioni influiscono sui transistor, che influenzano altre tensioni, in modi che potremmo descrivere come "aggiunta di bit" o "moltiplicazione". Sono davvero solo tensioni che rappresentano quei bit, allo stesso modo potremmo scarabocchiare la stringa di 5 caratteri "2 + 2 = 4" su un pezzo di carta e dire che abbiamo fatto matematica. La grafite a matita non è il numero due. È solo la rappresentazione fisica che stiamo usando per quel numero.

Questo è ciò che fa il sistema reale, a un livello tremendamente alto. Ho saltato bene ... praticamente tutto ... ma è abbastanza decente da poter tornare alla tua vera domanda. Come sarebbe [metaforicamente]?

A quanto pare, penso che Martin Molin abbia costruito la migliore metafora, con la sua macchina per marmo . Il codice macchina è codificato (a mano) su alcune strisce Lego Technics nel mezzo come pioli, piuttosto che tensioni su un condensatore. È più simile alla EPROM che alla DRAM, ma entrambi contengono dati. I marmi sono come gli elettroni, essendo mossi da tensioni (o gravità, nel caso dei marmi). E mentre gli elettroni si muovono, applicano la forza alle porte che fanno le cose.

La sua macchina è semplice, rispetto a una CPU moderna, ma non è poi così male, per quanto riguarda le metafore. Ed è orecchiabile!


1
La macchina di marmo è troppo semplice per questo nel video. È necessario uno stato della CPU.
Thorbjørn Ravn Andersen,

@ ThorbjørnRavnAndersen True. Suppongo che se la macchina in marmo avesse qualche cancello che le permettesse di lanciare automaticamente le leve invece che Marin le debba ribaltare, sarebbe più vicino.
Cort Ammon - Ripristina Monica il

Grazie! Simile alla domanda che avevo posto sulla risposta sopra questa, il codice assemblato assemblato sarebbe considerato un codice macchina che viene tradotto in tensioni e cose?
Tim Difficilmente il

@TimHardly Usando gli unici significati di "assemblato", "Assemblaggio" e "Codice macchina", il prodotto dell'assemblaggio Assemblaggio è definito come codice macchina (quindi sì, può essere considerato che =)). Qualcosa che potrebbe aiutare è che sia l'assemblaggio che il codice macchina sono considerati concetti "logici", più vicini al concetto matematico di "2 + 2 = 4" e più lontano dalla grafite sul foglio su cui è scritta quell'equazione. Il codice assembly / machine è il codice assembly / machine indipendentemente dal fatto che sia memorizzato su un disco magnetico, scritto su un pezzo di carta o memorizzato in condensatori in DRAM.
Cort Ammon - Ripristina Monica il

1
Se cerco filosofico, il codice macchina è codice macchina perché lo trattiamo come codice macchina. Lo pensiamo come codice macchina. Posso indicare una CPU ai byte che descrivono un suono in formato .wav e li eseguirà effettivamente come codice macchina. È probabile che l'esecuzione risultante non faccia nulla di utile (perché il suono non è stato costruito per essere un codice macchina) e potrebbe arrestarsi, ma potrebbe essere eseguito.
Cort Ammon - Ripristina Monica il

10

Guarda questo video , in particolare dalle 1:00 alle 1:17. Questo è esattamente come appare quando un programma è in esecuzione su un computer. Le due file di luci mostrano il contenuto corrente del registro indirizzi e del registro dati. Il PDP-11 non ha un registro delle istruzioni, ma se ce ne fosse uno e ci fossero delle luci sul davanti per mostrare il suo contenuto, sembrerebbe praticamente lo stesso. 16 luci, alcune accese, altre spente.

Se ti sono piaciute davvero le luci lampeggianti, potresti avere più luci per mostrare il contenuto attuale dei sei registri, il puntatore dello stack, il contatore del programma ... per ulteriori 32768 luci potresti avere una luce per ogni bit della cache. Potresti anche avere una luce per ogni bit di memoria ... ma sarebbe davvero un sacco di luci.

Questo è un PDP11-70 che funziona a 15,2 MHz e ogni istruzione impiega circa 1,5 microsecondi per essere eseguita. L'occhio umano è in grado di rilevare cambiamenti fino a 1/10 di secondo e in quel momento il PDP-11 può eseguire 60.000 istruzioni. Fondamentalmente, tutto è sfocato.


Caspita, questo è un bell'esempio, ne ho visti altri come lui, qualcosa del genere in cui puoi vedere luci e altre cose. youtube.com/watch?v=yOyaJXpAYZQ
Tim Difficilmente il


6

I progettisti hardware che implementano e testano (e testano e testano) il processore usano effettivamente modelli visivi per vedere cosa stanno facendo i loro progetti. La maggior parte (se non tutti) gli strumenti di simulazione HDL producono viste d'onda di tutti i registri e i fili per consentire un facile debug. Lo screenshot seguente (preso da qui ) mostra queste onde dal simulatore VCS per un processore RISC-V che esegue alcune istruzioni.

Onde DVE per RISC-V

Questo è un esempio piuttosto semplice che mostra un piccolo sottoinsieme della logica coinvolta nella progettazione di un processore completo. È possibile aprire queste viste per l'intero processore e guardare i dati propagarsi attraverso la logica. Se vuoi vedere il codice macchina in esecuzione, come hai detto, potresti guardare le onde per il registro delle istruzioni o il bus che il processore usa per leggere le istruzioni dalla memoria. La maggior parte dei visualizzatori di onde ha opzioni di visualizzazione flessibili per bus e registri che consentono di visualizzare i loro valori come etichette binarie, esadecimali, ottali e persino come enum. In alcuni, è anche possibile definire le proprie funzioni per la mappatura dei modelli di bit per i valori visualizzati.

Vale la pena notare che questa è solo una rappresentazione di una simulazione del processore. Non è possibile ottenere questo tipo di visualizzazioni per un chip del processore già fabbricato.


2

Immagina un cieco che inciampa in un vicolo in costruzione. Ovunque ci sono buchi e fratture, quindi naturalmente dovrebbe cadere. Non questo cieco, perché ha un rotolo di carta con le istruzioni, quando aspettare, quando muoversi, dove spostarsi e come manipolare il suo ambiente per raggiungere la fine della strada. Questo è ciò che è l'assemblea, un elenco cieco di istruzioni seguite - hanno senso solo per questo vicolo e per questo cieco. In teoria puoi anche ricostruire un modello 3d solo dalle istruzioni (Decompilazione).

Ogni modifica alla piattaforma, rende necessario ricompilare le istruzioni per il cieco. Devi conoscere l'hardware (il layout del cantiere), le istruzioni dell'intenzione digitate dall'uomo (Codice di alto livello) come "Voglio che salti su tutte le recinzioni che incontri in fila fino a quando non avrai 12 recinzioni dietro di te" e il abilità dei ciechi (CPU). Ha una memoria a breve termine, la capacità di fare più cose contemporaneamente?

Prendere tutte queste informazioni e creare una pergamena di istruzioni coerente è il compito del compilatore.

Quindi posso descrivere come appare un programma? No. Ma possiamo descrivere come ci si sente a eseguirlo? Sì, sembrerebbe un salto e una corsa, come il bordo di uno specchio senza vedere qualcosa, seguendo un preciso elenco di istruzioni, ovunque ti porti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.