Assemblaggio - Introduzione
Cos'è il linguaggio Assembly?
Ogni personal computer dispone di un microprocessore che gestisce le attività aritmetiche, logiche e di controllo del computer.
Ogni famiglia di processori ha il proprio set di istruzioni per gestire varie operazioni come ricevere input dalla tastiera, visualizzare informazioni sullo schermo ed eseguire vari altri lavori. Questi set di istruzioni sono chiamati "istruzioni in linguaggio macchina".
Un processore comprende solo le istruzioni in linguaggio macchina, che sono stringhe di 1 e 0. Tuttavia, il linguaggio macchina è troppo oscuro e complesso per essere utilizzato nello sviluppo del software. Quindi, il linguaggio assembly di basso livello è progettato per una specifica famiglia di processori che rappresenta varie istruzioni in codice simbolico e in una forma più comprensibile.
Vantaggi del linguaggio assembly
Avere una comprensione del linguaggio assembly rende consapevoli di:
- In che modo i programmi si interfacciano con OS, processore e BIOS;
- Come vengono rappresentati i dati nella memoria e in altri dispositivi esterni;
- Come il processore accede ed esegue le istruzioni;
- Modalità di accesso e trattamento dei dati da parte delle istruzioni;
- Come un programma accede ai dispositivi esterni.
Altri vantaggi dell'utilizzo del linguaggio assembly sono:
Richiede meno memoria e tempo di esecuzione;
Consente lavori complessi specifici dell'hardware in un modo più semplice;
È adatto per lavori con tempi critici;
È particolarmente adatto per scrivere routine di servizio di interrupt e altri programmi residenti in memoria.
Caratteristiche di base dell'hardware del PC
L'hardware interno principale di un PC è costituito da processore, memoria e registri. I registri sono componenti del processore che contengono dati e indirizzo. Per eseguire un programma, il sistema lo copia dal dispositivo esterno alla memoria interna. Il processore esegue le istruzioni del programma.
L'unità fondamentale di archiviazione del computer è un po '; potrebbe essere ON (1) o OFF (0) e un gruppo di 8 bit correlati crea un byte sulla maggior parte dei computer moderni.
Quindi, il bit di parità viene utilizzato per rendere dispari il numero di bit in un byte. Se la parità è pari, il sistema presume che si sia verificato un errore di parità (sebbene raro), che potrebbe essere stato causato da un guasto hardware o da un disturbo elettrico.
Il processore supporta le seguenti dimensioni di dati:
- Word: un elemento di dati a 2 byte
- Doubleword: un elemento di dati a 4 byte (32 bit)
- Quadword: un elemento di dati a 8 byte (64 bit)
- Paragrafo: un'area di 16 byte (128 bit)
- Kilobyte: 1024 byte
- Megabyte: 1.048.576 byte
Sistema di numeri binari
Ogni sistema numerico utilizza la notazione posizionale, ovvero ogni posizione in cui è scritta una cifra ha un valore posizionale diverso. Ogni posizione è la potenza della base, che è 2 per il sistema di numeri binari, e queste potenze iniziano da 0 e aumentano di 1.
La tabella seguente mostra i valori posizionali per un numero binario a 8 bit, dove tutti i bit sono impostati su ON.
Valore in bit | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|---|---|---|---|---|---|---|---|
Valore di posizione come potenza di base 2 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
Numero di bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
Il valore di un numero binario si basa sulla presenza di 1 bit e sul loro valore di posizione. Quindi, il valore di un dato numero binario è -
1 + 2 + 4 + 8 +16 + 32 + 64 + 128 = 255
che è uguale a 2 8-1 .
Sistema numerico esadecimale
Il sistema numerico esadecimale utilizza la base 16. Le cifre in questo sistema vanno da 0 a 15. Per convenzione, le lettere dalla A alla F vengono utilizzate per rappresentare le cifre esadecimali corrispondenti ai valori decimali da 10 a 15.
I numeri esadecimali nell'informatica vengono utilizzati per abbreviare lunghe rappresentazioni binarie. Fondamentalmente, il sistema numerico esadecimale rappresenta un dato binario dividendo ogni byte a metà ed esprimendo il valore di ogni mezzo byte. La tabella seguente fornisce gli equivalenti decimali, binari ed esadecimali:
Numero decimale | Rappresentazione binaria | Rappresentazione esadecimale |
---|---|---|
0 | 0 | 0 |
1 | 1 | 1 |
2 | 10 | 2 |
3 | 11 | 3 |
4 | 100 | 4 |
5 | 101 | 5 |
6 | 110 | 6 |
7 | 111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | UN |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
Per convertire un numero binario nel suo equivalente esadecimale, suddividilo in gruppi di 4 gruppi consecutivi ciascuno, a partire da destra, e scrivi quei gruppi sulle cifre corrispondenti del numero esadecimale.
Example - Il numero binario 1000 1100 1101 0001 è equivalente a esadecimale - 8CD1
Per convertire un numero esadecimale in binario, scrivi semplicemente ogni cifra esadecimale nel suo equivalente binario a 4 cifre.
Example - Il numero esadecimale FAD8 è equivalente a binario - 1111 1010 1101 1000
Aritmetica binaria
La tabella seguente illustra quattro semplici regole per l'addizione binaria:
(io) | (ii) | (iii) | (iv) |
---|---|---|---|
1 | |||
0 | 1 | 1 | 1 |
+0 | +0 | +1 | +1 |
= 0 | = 1 | = 10 | = 11 |
Le regole (iii) e (iv) mostrano un riporto di 1 bit nella posizione successiva a sinistra.
Example
Decimale | Binario |
---|---|
60 | 00111100 |
+42 | 00101010 |
102 | 01100110 |
Un valore binario negativo è espresso in two's complement notation. Secondo questa regola, convertire un numero binario nel suo valore negativo significa invertire i suoi valori di bit e aggiungere 1 .
Example
Numero 53 | 00110101 |
Invertire i bit | 11001010 |
Aggiungi 1 | 0000000 1 |
Numero -53 | 11001011 |
Per sottrarre un valore da un altro, converti il numero da sottrarre nel formato del complemento a due e aggiungi i numeri .
Example
Sottrai 42 da 53
Numero 53 | 00110101 |
Numero 42 | 00101010 |
Invertire i bit di 42 | 11010101 |
Aggiungi 1 | 0000000 1 |
Numero -42 | 11010110 |
53-42 = 11 | 00001011 |
L'overflow dell'ultimo bit viene perso.
Indirizzamento dei dati in memoria
Il processo attraverso il quale il processore controlla l'esecuzione delle istruzioni è denominato fetch-decode-execute cycle o il execution cycle. Consiste di tre passaggi continui:
- Recupero dell'istruzione dalla memoria
- Decodificare o identificare l'istruzione
- Esecuzione dell'istruzione
Il processore può accedere a uno o più byte di memoria alla volta. Consideriamo un numero esadecimale 0725H. Questo numero richiederà due byte di memoria. Il byte di ordine superiore o il byte più significativo è 07 e il byte di ordine inferiore è 25.
Il processore memorizza i dati in una sequenza di byte inversa, ovvero un byte di ordine inferiore viene memorizzato in un indirizzo di memoria bassa e un byte di ordine superiore nell'indirizzo di memoria alta. Quindi, se il processore porta il valore 0725H dal registro alla memoria, trasferirà prima 25 all'indirizzo di memoria inferiore e 07 al successivo indirizzo di memoria.
x: indirizzo di memoria
Quando il processore ottiene i dati numerici dalla memoria per registrarli, inverte nuovamente i byte. Esistono due tipi di indirizzi di memoria:
Indirizzo assoluto: un riferimento diretto a una posizione specifica.
Indirizzo segmento (o offset) - indirizzo iniziale di un segmento di memoria con il valore di offset.