Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
MOV AL, 5
.386
.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
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).
.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
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
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
MAIN ENDP
END MAIN ;TERMINO IL PROGRAMMA