Ogni microprocessore (e in generale computer) è progettato per eseguire determinate operazioni in presenza di determinate sequenze binarie che vengono lette una dopo l'altra da un'area detta memoria programma.
Queste sequenze sono binarie ovvero istruzioni in linguaggio macchina (L.M.), l'unico direttamente comprensibile dai circuiti.
Ci si riferisce ad istruzioni di questo tipo: 00100000011.
Ovvero sequenze lunghe o più o meno lunghe di 0 ed 1.
Ogni istruzione compilata seguendo le regole di questo codice esegue solamente un'operazione molto precisa: scrivere dati nella suddetta cella di memoria, saltare una cella di memoria e passare alla successiva, compiere un'operazione logico, una aritmetica e così via.
Ogni programma eseguito direttamente dalla CPU, dunque, è scritto usando una serie di istruzioni di questo genere.
Si tratta del più basso livello di rappresentazione di un programma assemblato o come un linguaggio di programmazione primitivo e strettamente dipendente dall'hardware utilizzato per eseguire le istruzioni.
Programmare usando il codice binario può essere particolarmente complesso e portare facilmente a commettere errori. Per programmare in codice macchina, infatti, si devono costantemente ricordare e calcolare gli indirizzi di memoria che si utilizzano e "maneggiare" con attenzione ogni singolo bit di informazione che è necessario al programma.
Tutti i software che utilizziamo quotidianamente sono realizzati utilizzando linguaggi di programmazione di alto livello (tipo Java, C, C++, Fortran, Cobol, Pascal, Ruby, etc) non direttamente leggibili (quindi eseguibili dal calcolatore).
Il codice sorgente del software sarà quindi tradotto in istruzioni elementari da appositi strumenti chiamati assembler o compilatori.
Fanno eccezione i programmi interpretati, nei quali il codice sorgente è eseguito direttamente (anziché essere tradotto) grazie a speciali tool detti interpreti.
Dal lato teorico la strutturazione e il funzionamento del Linguaggio Macchina sono piuttosto semplici.
Cioè questo codice si compone di lettere, parole (combinazioni di più lettere del codice binario) e frasi (combinazioni di più parole corrispondenti a una singola istruzione fornita al processore). Per quanto possa apparire semplice, questa organizzazione è alla base del funzionamento di qualunque software in circolazione, compresi i più complessi e moderni.
ESEMPIO DI PROGRAMMA
Ipotizzando di programmare in codice binario la somma di due numeri:
10111010
Muove nel registro general purpose DX il numero seguente di 16 bit,
00000010
00000000
Il numero 2 in binario. Poiché l'istruzione precedente richiede un numero a 16 bit, riempiamo di 0 gli 8 bit che non ci servono.
10111011
Muove nel registro BX il numero seguente di 16 bit.
00000011
00000000
Il numero 3 in binario. Stessa cosa di prima per via dell'istruzione che richiede un operando a 16 bit quindi si aggiungono gli 8 zero.
00000001
Istruzione di 16 bit che somma il contenuto dei registri DX ed BX.
11011010
Salva il risultato nel registro DX.
Ogni codice corrisponde all'azione che la CPU deve compiere dopo aver processato l'istruzione in ingresso.
Azione ad esempio su un prodotto o somma.
Viene ovviamente specificato anche l'indirizzo delle celle di memoria nelle quali devono essere lette o salvate delle informazioni.
Parlare di linguaggio macchina in senso assoluto, come se fosse univoco, è un errore.
Le varie tipologie di CPU e SoC in commercio, infatti, sono contraddistinte da una propria architettura e organizzazione interna: ciò le rende uniche e incapaci di eseguire le istruzioni scritte in un linguaggio macchina differente dal loro.
Nessun commento:
Posta un commento