Rattin Livia
Assembly
Il linguaggio assembly è un linguaggio a basso livello, ed è il più vicino al linguaggio macchina
vero e proprio.
Erroneamente viene spesso chiamato "assembler" anche se quest'ultimo identifica il programma
che converte il linguaggio assembly in linguaggio macchina.
Per assembly si intende il linguaggio che utilizza il Set Di Istruzioni del processore cioè l'insieme
di tutte le operazioni che il processore è in grado di eseguire.
Per questo motivo non esiste un linguaggio assembly unico ma ogni processore ha il suo.
L'assembly consente al programmatore di ignorare il formato binario del linguaggio macchina.
Ogni codice operativo del linguaggio macchina viene sostituito, nell'assembly, da una sequenza di
caratteri che lo rappresenta in forma mnemonica e quindi più facile e intuitivo per il programmatore.
Il programma scritto in assembly non può essere eseguito direttamente dal processore, deve essere
tradotto nella forma binaria corrispondente, usando un programma compilatore.
L'assembly consente una traduzione particolarmente semplice che trasforma ogni istruzione
assembly, in modo univoco, in una istruzione in linguaggio macchina.
1
Rattin Livia
Registri :
I microprocessori dispongono di alcuni elementi di memorizzazione ad alta velocità inseriti nel chip
stesso, denominati registri.
È possibile pensare ai registri come a locazioni di memoria che i Microprocessori utilizzano con un
tempo di accesso inferiore alla memoria tradizionale.
Ciascun registro ha una propria caratteristica e dispone di particolarità che nessun altro registro o
locazione di memoria possiede.
I registri possono essere classificati in
quattro categorie: Possono avere diverse dimensioni
il registro dei flag 8-bit
i registri di utilizzo generale 16-bit
32-bit.
il puntatore alle istruzioni 64 bit
128 bit
i registri di segmento. …
Suddivisione dei registri:
Registri caratteristica
Flag (riporto, n°pari, segno, overflow,...) Hanno solo 2 stati (true / false 0/1 on / off)
AX BX CX DX SI DI BP SP
Registri generici ( a 16 bit )
ACCUMULATORE
usato per varie operazioni
AX
principalmente per le operazioni * e /
Ax = 16 bit = 8 bit + 8 bit=
AH+AL
PUNTATORE
Bx = 16 bit = 8 bit + 8 bit=
BX solitamente punta a loc. di memoria
BH+BL
es mov ax,[bx]
…..
CONTATTORE
L = low = parte bassa = 8 bit
CX usato per contare (cicli)
H = hight = parte alta = 8 bit
Consente di eseguire operazioni di
DX
INPUT/ OUTPUT
IP (istruction Point) Punta all’istruzione
SP (stack point) Punta alla cima dello STACK
CS (code segment)
DS (data segment) Registri di segmento
ES (extra segment) (puntano ad un segmento di memoria)
SS (stack segment)
2
Rattin Livia
Registro di flag
3
Rattin Livia
IL PROGRAMMA
I programmi Assembly sono composti di:
• istruzioni: generano un’istruzione/comando per la macchina es. ADD AX, 5
• direttive o pseudo-istruzioni: sono comandi per l’assemblatore. ( Es. VAR1 DB ? )
Le direttive sono informazioni di contesto e non corrispondono a un'azione da eseguire.
;programma di …
;nome file: …
;autore:…
.model small
.stack
.data
…
.code
STARPOINT:
….
…. Istruzioni
….
END STARPOINT
End.
Commenti
I commenti in assembly vengono fatti con il punto e virgola
; commento
. Model type
Questa direttiva definisce il tipo di segmenti di memoria da utilizzare nel pgm
Type Spazio occupato
Tyny 1 [Link] 64kb x il codice e x i dati e 1 seg x stack(64kb))
small 1 [Link] 64kb x il codice, un seg(64kb) x i dati e 1 seg x stack(64kb))
medium + [Link] 64kb x il codice, + seg(64kb) x i dati e + seg x stack(64kb))
compcat + [Link] 64kb x il codice, + seg(64kb) x i dati e + seg x stack(64kb))
large + [Link] 64kb x il codice, + seg(64kb) x i dati e + seg x stack(64kb))
4
Rattin Livia
.Stack
Questa direttiva avvisa il compilatore di quanto stack si necessita
.stack default 1 kbyte
.stack 100h 1/2 kbyte
.data
Inizializza il segmento dati.
Questa direttiva consente di dichiarare le var del pgm
var equ 100 ;(costante)
A DB ? ;(crea una variabile A, a 8 bit, il cui contenuto non è definito)
mess db 13,10,"questo è un esempio",13,10,"$" ; (mess e una varabile stringa )
Var2 dw ? ;( crea una variabile Var2, a 16bit, il cui contenuto non è definito)
Le variabili
Tipi di variabili
DB - Define Byte (=8 bit)
DW -Define Word (=16 bit)
DD - Define Double word
( =32 bit)
DQ - Define Quadword
( 64 bit)
Costanti
• binarie: 001101B
DF - Define FAR 6 byte
DT - Define TenByte (=10 byte)
• ottali: 15O, 15Q
Dichiarazione: • esadecimali: 72H, 0DH, 0BEACH
(devono iniziare con un numero)
Var db ? var= ? (1 byte) • decimali: 13, 13D
• stringhe: “S”, “Ciao”
Var1 db 15h var1=A • reali in base 10: 2.345925, 715E-3
Var2 dw ? var2=? (16 bit)
var equ 100 var=100 definisce una COSTANTE con valore 100 (direttiva dos)
a DB ? definisce una variabile indeterminata
mess db 13,10,"questo è un esempio",13,10,"$" mess=”questo è un esempio”
crea una stringa
(13,10 = a capo)
spazio db 13,10," ",13,10,"$" Spazio=” “
5
Rattin Livia
.code
Startpoint: …. End starpoint ( solo usando DosBOX)
indica l'inizio del segmento di codice del programma.
Il programma
;programma di …
;nome file: …
;autore:…
.model small
.stack
.data
…
.code
STARPOINT:
….
…. Istruzioni
….
END STARPOINT
End.
Il pgm viene scritto su Blocco Note e poi salvato con estensione .asm
Ad ogni modifica il pgm deve venir salvato e poi ri_compilato
Compilazione ed esecuzione di un programma
Dopo aver creato il programma per essere eseguito deve sempre venir compilato.
Compilazione ed esecuzione di un pgm Assembly: ([Link] = nome file creato in assembly)
Per compilare tradurre in linguaggio macchine tasm [Link] (genera un programma obj)
Per generare un eseguibile tlink [Link] (genera un programma exe)
Per eseguire il programma esempio
6
Rattin Livia
Utilizzando DosBox:
Attivare dosbox facendo doppio click sull’icona del desktop
Scrivere sul pront dei comandi Z:> Mount c: c:\Tasm
Significato: la cartella TASM diventa l’hard disk virtuale di dosbox.
Scrivere C:
Scrivere cd bin
Dir *.exe
(Verificare la presenza dei file TASM – TLINK e TD)
Ora è possibile lavorare.
DOSBox è un emulatore DOS open source, usato per fare funzionare giochi
incompatibili con i sistemi operativi moderni.
Piccolo promemoria sui comandi MS DOS base :
C: F: … è il comando per cambiare il drive
DIR C: elenca il contenuto del nostro hard disk virtuale
CD pippo entra nella cartella pippo
CD .. Ritorno alla cartella precedente
DELTREE pippo rimuove la cartella pippo e eventuali sottocartelle
DIR *.* visualizzare tutti i file contenuti
dir /p visualizza i file x pagina
dir /w visualizza i file x
DosBox:
cls pulizia schermo
ALT + ENTER schermo intero e viceversa
CTRL + F1 Mappa dei tasti
CTRL + F7 decrementa la velocità dell’emulatore
CTRL + F8 incrementa la velocità dell’emulatore
CTRL + F9 ESCE da dosbox
CTRL + F10 prende o rilascia il mouse
TD nome_file.exe avvia l’emulatore
7
Rattin Livia
Istruzioni
;……. commento
Op1 Op2= variabili/registri
Mov op1,op2 Op1 e op2 NON possono essere
entrambe variabili
Add op1,op2 Op1= op1+op2
Sub op1,op2 Op1= op1-op2
Mul op1 Ax=al*op1
Al=ax/op1
Div op1
Ah=resto della divisione
Inc op1 Op1=op1+1
Dec op1 Op1=op1-1
Interfaccia con l’utente
Mov dl,… Stampa UN carattere
Mov ah,02h Il valore deve essere nel registro D
Int 21h
Mov ax,@data Memorizza l’indirizzo dei messaggi
Mov ds,ax
Mov dx,offset mess Stampa la stringa presente nel registro
Mov ah,09h dx
Int 21h
Mov ah,01h Input di un carattere
Int 21h Al=input
Mov ah,4ch Chiusura pgm
int 21h
Es:
Mov bl,10d bl=0A 0Ah =10d 0000 0000 0000 0000 1010
Mov bh,10h bh=10 10h =16d 0000 0000 0000 0001 0000
8
Rattin Livia
Esercizi:
1. Inserire un numero in 1/2 registro (parte bassa); copiare il valore dalla parte bassa del
registro a quella alta dello stesso registro
2. Inserire un numero in UN registro, copiare il valore in un secondo registro
3. Inserire un numero in BL. CH←BL+1 e CL←BL-1
4. Inserire un numero in BX.
Salvare in un altro registro il valore BX+BX
Salvare in un altro registro il valore BX-BX
Salvare in un altro registro il valore BX*2
Salvare in un altro registro il valore BX/2
===========================================================
5. Eseguire gli esercizi precedenti inserendo i dati e stampando a video il risultato. Inserire
massaggi adeguati nell'input e nella stampa
NB: la pressione di un tasto della tastiera corrisponde ad un numero esadecimale individuabile sulla della tabella ASCII.
Premendo A il pgm riceve--> 65 a-->97 1-->49 7-->55
6. Creare una semplice calcolatrice
inserire 2 numeri
eseguire la somma dei due numeri e stampare: somma=...
eseguire la differenza dei due numeri e stampare: differenza=...
eseguire la prodotto dei due numeri e stampare: prodotto=...
eseguire la quoziente dei due numeri e stampare: quoziente=...
===========================================================
9
Rattin Livia
SALTI
Salto incondizionato:
JMP etichetta (salta SEMPRE a etichetta)
….
Pippo:
…
…
Jmp pippo
Salto condizionato:
CMP r1,r2 (Confronta r1 e r2)
SALTA se:
JA etichetta r1>r2 (Jump Above)
JAE etichetta r1>=r2 (Jump Above or Equal)
JB etichetta r1<r2 (Jump Below)
JBE etichetta r1<=r2 (Jump Below op Equal)
JE etichetta r1=r2 (Jump Equal)
JNE etichetta r1< >r2 (Jump Not Equal)
Se l’ultima operazione su un registro è
JNZ etichetta NON Zero ( dec bl se bl <>0 salta)
JZ etichetta ZERO (dec bl se bl=0 salta)
Esercizi:
1. Individuare se un numero è pari o dispari
2. Cercare il max valore tra 2 n° inseriti
3. Inserire un carattere e dare in uscita la scritta “ è un numero” oppure “è un carattere”
4. Inserire un numero e dire se è maggiore, minore o uguale a 5
5. Inserire un numero e solo se è pari aumentarlo di uno (trasformarlo in dispari)
6. Inserire due numeri e dire se uno è la metà dell’altro.
7. ….
10