Sei sulla pagina 1di 13

Linguaggio Assembly

Il codice macchina rappresenta l'insieme delle istruzioni che un elaboratore è in grado di eseguire
direttamente. Può essere visto in una forma equivalente attraverso un linguaggio comprensibile all’uomo
(mnemonico), al contrario delle sequenze di bit che sono comprensibili solo al microprocessore.

L’insieme dei codici mnemonici delle istruzioni prende il nome di linguaggio assembly. Si tratta di un
linguaggio a più alto livello rispetto a quello macchina.

Il linguaggio assembly prevede l’uso di PAROLE CHIAVE:

• MOV per assegnare valori a registri


• ADD per sommare i contenuti di registri o aree di memoria
• SUB per sottrarre
• …..
• ……
• ……..
CODICE MACCHINA

1010 0101 0011 1010

CODICE MNEMONICO linguaggio macchina

MOV AL, 5

LINGUAGGIO ASSEMBLY Il linguaggio macchina


e il linguaggio
assembly stanno in
rapporto 1:1
Il processo che traduce il codice assembly in codice
macchina si compone di due passaggi:

▪ Assembler: processo di traduzione (disassembler


processo inverso)

▪ Linker: serve a collegare moduli e librerie di cui si


compone il programma e trasformare il codice
oggetto in codice eseguibile

La libreria è un insieme di funzioni già implementate


che possono essere immediatamente collegate al
resto del programma.
Un’istruzione assembly è formata da:
• Un’etichetta opzionale (label)
• Un codice operativo (opcode) che specifica l’operazione da svolgere
• Zero o più operandi separati da una virgola, che specificano i dati su cui
operare

ISTRUZIONE ASSEMBLY → ADD AL , 3 ‘’;’’ COMMENTO

E’ possibile inserire un commento


facendolo precedere dal ‘’;’’
Un programma in assembly ha generalmente la seguente struttura:

.386

.MODEL ...... ; indica al compilatore il modello di memoria da usare

.STACK ...... ; dimensiona lo Stack

.DATA ; inizio del segmento dati (variabili)

.CONST ; costanti

.CODE
MAIN PROC ; inizio del segmento di codice
........
……
……
MAIN ENDP
END MAIN ; fine del programma
.386
Questa è una direttiva per l'assembler, a cui diciamo di usare il set di istruzioni 80386.

.MODEL
Definisce il tipo dei segmenti di memoria da utilizzare nel programma. Le principali scelte possibili sono:
tiny, small, medium, compact, large, huge, FLAT (supporta la modalità a 32bit dei processori 386+; sotto Win32 è l’unico
modello ammesso, non esistono più segmenti da 64K. La memoria è un largo e continuo spazio di 4 GB).

.STACK
Dice al compilatore quanto spazio deve riservare per o stack (porzione di memoria utilizzata per il salvataggio temporaneo
dei dati).

.DATA
Dopo questa direttiva si dichiarano le variabili da usare nel programma e si inizializzano.
DB - Define Byte: la variabile è grande 1 byte
DW - Define Word: la variabile è grande 2 byte
DD - Define Double word: la variabile è grande 4 byte
DQ - Define Quadword: la variabile è grande 8 byte
DT - Define TenByte: la variabile è grande 10 byte

.CONST
Questa sezione contiene le costanti usate dal programma.

.CODE
Indica l’inizio del segmento di codice del programma. E’ qui dove vengono messe le istruzioni.
I CICLI

I costrutti tipici sono:

1. WHILE (Esempio 3 - prima il test poi l’operazione);


2. DO-WHILE (Esempio 4 - prima l’operazione e poi il test).

3. FOR (Esempio 5) si adatta bene all’elaborazione di vettori o stringhe di caratteri di cui si conosce la lunghezza.
Abbiamo visto nella lezione precedente che l’istruzione assembly per i cicli for è la LOOP. La LOOP decrementa
automaticamente di uno a ogni ciclo il registro CX e, quando CX = 0, il ciclo finisce.
Per operare su strutture dati di questo tipo, la CPU utilizza due registri indice: SI (Source Index) e DI (Destination Index). Il
loro compito è quello di contenere l’indice dell’elemento dell’array che si sta leggendo (SI) o che si sta scrivendo (DI).Tale
indice è però un indirizzo di memoria (offset) che deve essere inizializzato all’indirizzo del primo elemento del vettore e poi
incrementato di un byte per volta.

L’istruzione che consente di caricare in un registro l’indirizzo di una variabile di memoria è la LEA (Load Effective Address).

Nel caso di una stringa o di un array/vettore viene caricato nel registro solo
l’indirizzo del primo carattere (stringa) o valore (array/vettore).

MOV EAX, [ESI] COPIA IN EAX L’ELEMENTO DELLA STRINGA IL CUI


INDIRIZZO E’ IN ESI

INC ESI INCREMENTA L’INDICE


MOV EAX, [ESI] COPIA IN EAX L’ELEMENTO IL CUI INDIRIZZO E’ IN ESI
Esempio n.1 Dati due numeri, sommarli e scrivere il risultato in memoria nella variabile scelta

.386

.MODEL FLAT

.STACK 4096

.DATA DICHIARO LA VARIABILE CON IL NOME ‘’N1’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL VALORE ‘’5’’
N1 DD 5 DICHIARO LA VARIABILE CON IL NOME ‘’N2’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL VALORE ‘’3’’
N2 DD 3
DICHIARO LA VARIABILE CON IL NOME ‘’SOMMA’’, LA DEFINISCO ‘’DD’’ E NON GLI ASSEGNO VALORE
SOMMA DD ?

.CODE
MAIN PROC

MOV EAX, N1 ;COPIO N1 IN EAX


ADD EAX, N2 ;AGGIUNGO N2 A EAX
MOV SOMMA, EAX ;COPIO IN SOMMA IL VALORE DI EAX
INT 20H ;FORZA LA FINE DEL PROGRAMMA E RITORNA AL S.O.

MAIN ENDP
END MAIN ;TERMINO IL PROGRAMMA
Esempio n.2 (if-else) Dati due numeri, sottrarli se il primo è maggiore o uguale al secondo, altrimenti
sommarli e scrivere il risultato in memoria nella variabile scelta
.386
.MODEL FLAT
.STACK 4096

.DATA
N1 DD 5 DICHIARO LA VARIABILE CON IL NOME ‘’N1’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL VALORE ‘’5’’
N2 DD 4 DICHIARO LA VARIABILE CON IL NOME ‘’N2’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL VALORE ‘’4’’
SOT DD ? DICHIARO LA VARIABILE CON IL NOME ‘’SOT’’, LA DEFINISCO ‘’DD’’ E NON GLI ASSEGNO VALORE
SOM DD ? DICHIARO LA VARIABILE CON IL NOME ‘’SOT’’, LA DEFINISCO ‘’DD’’ E NON GLI ASSEGNO VALORE
.CODE
MAIN PROC
MOV EAX,N1 ;COPIA N1 IN EAX
SE: CMP EAX,N2 ;CONFRONTO N1 CON N2
JGE VERO ;SALTA SE EAX MAGGIORE O UGUALE DI N2 LE ETICHETTE (LABEL) SONO
JMP FALSO ;SALTA SE EAX MINORE DI N2
DEGLI INDIRIZZI SIMBOLICI CHE
VERO: SUB EAX,N2 ;SOTTRAI IL VALORE DI N2 A EAX
MOV SOT, EAX ;COPIA EAX IN SOT
L’ASSEMBLATORE E IL LINKER
JMP FINESE ;SALTA ESCO DALLA SELEZIONE (FINESE) TRASFORMERANNO IN INDIRIZZI
FALSO: ADD EAX,N2 ;SOMMA N2 A EAX REALI IN CODICE MACCHINA
MOV SOM,EAX ;COPIA EAX IN SOM
FINESE: NOP ;NON FACCIO NULLA
INT 20H ;RESTITUISCO IL CONTROLLO AL S.O.

MAIN ENDP
END MAIN ;TERMINO IL PROGRAMMA
Esempio n.3 (while) Dati due numeri, moltiplicarli attraverso somme successive e scrivere il risultato in
memoria nella variabile scelta
.386
.MODEL FLAT
.STACK 4096

.DATA
N1 DD 5 DICHIARO LA VARIABILE CON IL NOME ‘’N1’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL VALORE ‘’5’’
N2 DD 4 DICHIARO LA VARIABILE CON IL NOME ‘’N2’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL VALORE ‘’4’’
RIS DD ? DICHIARO LA VARIABILE CON IL NOME ‘’RIS’’, LA DEFINISCO ‘’DD’’ E NON GLI ASSEGNO VALORE

.CODE
MAIN PROC
MOV EAX,N1 ;COPIA N1 IN EAX
MOV EBX, N2 ;COPIA N2 IN EBX
START-CICLO: CMP EBX, 0 ;CONFRONTO EBX CON 0
JE STOP-CICLO ;SALTA SE EBX E’ UGUALE A 0
IL CICLO ESEGUE LA SOMMA TANTE
ADD EDX, EAX ;SOMMA EAX A EBX
VOLTE QUANTO VALE N2
DEC EBX :DECREMENTA EBX
JMP START-CICLO ;SALTA
STOP-CICLO MOV RIS, EDX ;COPIA EDX IN RIS
INT 20H ;RESTITUISCO IL CONTROLLO AL S.O.

MAIN ENDP
END MAIN ;TERMINO IL PROGRAMMA
Esempio n.4 (do-while) Dati due numeri maggiori o uguali a 1, moltiplicarli attraverso somme successive e
scrivere il risultato in memoria nella variabile scelta
.386
.MODEL FLAT
.STACK 4096

.DATA
N1 DD 5 DICHIARO LA VARIABILE CON IL NOME ‘’N1’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL VALORE ‘’5’’
N2 DD 4 DICHIARO LA VARIABILE CON IL NOME ‘’N2’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL VALORE ‘’4’’
RIS DD ? DICHIARO LA VARIABILE CON IL NOME ‘’RIS’’, LA DEFINISCO ‘’DD’’ E NON GLI ASSEGNO VALORE

.CODE
MAIN PROC
MOV EAX,N1 ;COPIA N1 IN EAX
MOV EBX, N2 ;COPIA N2 IN EBX
START-CICLO: ADD EDX, EAX ;SOMMO EAX A EDX DATO CHE SIA N1 CHE N2
SONO MAGGIORI O UGUALI A
DEC EBX ;DECREMENTA EBX
1 ESEGUE LA SOMMA
CMP EBX, 0 ;CONFRONTO EBX CON 0
JNE START-CICLO ;SALTE SE EBX E’ DIVERSO DA 0 ALMENO UNA VOLTA

MOV RIS, EDX ;COPIO EDX IN RIS


INT 20H ;RESTITUISCO IL CONTROLLO AL S.O.

MAIN ENDP
END MAIN ;TERMINO IL PROGRAMMA
Esempio n.5 (for) Data una stringa str1, copiarla in una stringa str2
DUP serve per riservare tante
.386 locazioni di memoria pari al
.MODEL FLAT numero che lo precede. L’aggiunta
.STACK 4096 di (?) indica che non è inizializzata.
.DATA
STR1 DD ‘’hello, world!’’ DICHIARO LA VARIABILE CON IL NOME ‘’STR1’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO IL TESTO
STR2 DD 12 DUP(?) DICHIARO LA VARIABILE CON IL NOME ‘’STR2’’, LA DEFINISCO ‘’DD’’ E GLI ASSEGNO 12 LOCAZIONI

.CODE
MAIN PROC
LEA ESI, STR1 ;CARICA L’INDIRIZZO INIZIALE DI STR1 IN ESI
LEA EDI, STR2 ;CARICA L’INDIRIZZO INIZIALE DI STR2 IN EDI

COPIA-STR MOV EAX, [ESI] ;COPIA IN EAX L’ELEMENTO DI STR1 IL CUI INDIRIZZO E’ IN ESI
MOV [EDI], EAX ;COPIA IN MEMORIA, ALL’INDIRIZZO DI STR2 CONTENUTO IN EDI IL CONTENUTO
;DI EAX

INC ESI ;INCREMENTA L’INDICE DI STR1


INC EDI ;INCREMENTA L’INDICE DI STR2
LOOP COPIA-STR ;DECREMENTA ECX E SE DIVERSO DA 0 SALTA A COPIA-STR
INT 20H ;RESTITUISCO IL CONTROLLO AL S.O.

MAIN ENDP
END MAIN ;TERMINO IL PROGRAMMA

Potrebbero piacerti anche