Vantaggi dei programmi Assembly

LA CPU INTEL 8086
 

L’utilizzo del linguaggio Assembly anzichè di un linguaggio ad alto livello (tipo C o Pascal) è talvolta giustificato dalla maggiore efficienza del codice;

Infatti i programmi in Assembly sono tipicamente
• più veloci,
• più corti,
• ma più complessi
dei programmi scritti in linguaggi ad alto livello.
La maggior complessità è data dal fatto che anche le più comuni routines devono essere sintetizzate dal programmatore (talvolta per semplificare la programmazione e per aumentare la compatibilità del codice, si utilizzano librerie general purpose, ma sono ovviamentemeno efficienti).

 

Set di istruzioni

Set di Istruzioni
L’Assembly dell’8086 rende disponibili 92 tipi di istruzioni, raggruppabili nelle seguenti classi:
• Trasferimento DATI
• Aritmetiche (Somma, sottrazione, moltiplicazione, divisione)
• Manipolazioni di Bit (logiche, traslazione, rotazione)
• Trasferimento di Controllo (CALL, RET, JMP e tutti i salti condizionati e non, LOOP)
• Manipolazioni di Interruzioni ( INT , INT0, IRET)
• Controllo del Processore( modifica dei Flag, Sincronizzazione, Istruzione nulla NOP).

Modi di Indirizzamento

Il Modo di Indirizzamento di un’istruzione definisce il metodo da utilizzare per determinare dove è memorizzato un particolare dato (operando).
Gli operandi possono essere contenuti:
• in registri;
• nell’istruzione stessa;
• in memoria;
• su una porta di I/O.

 

Modi di indirizzamento dell' 8086

I Modi di Indirizzamento possono essere raggruppati in 7 classi:

1)  Register;                         (indirizzamento con registri)                                  

 MOV AX,BX

 2)Immediate;                     (indirizzamento immediato)                                      

MOV AX,10h

3) Direct;                             (indirizzamento diretto)
4)  Register Indirect;        (indirizzamento indiretto con registro)                  

MOV AX, [BX]

                                                                                                                                     

MOV AX, [SI]
5) Base Relative;             (indirizzamento con base relativa)                          

MOV AX, [BX+4]
6)  Direct Indexed;           (indirizzamento diretto con indice)
7) Base Indexed;             (indirizzamento con l'indice di base)

Istruzione MOV

ISTRUZIONI DI TRASFERIMENTO

Nel microprocessore 8086 per spostare gli operandi in memoria si utilizza il comando MOV da Move cioè spostare muovere.
Esso ha la seguente sintassi:

                                                     MOV destinazione, sorgente


Cioè sposta il contenuto di sorgente in destinazione;

In questo caso si ha che la sorgente che è scritta a destra del comando viene spostata a sinistra del comando MOV

                                                      destinazione<--sorgente

La destinazione può essere un registro ( a 16 o a 8 bit) o una locazione di memoria;
la sorgente può essere un registro,una locazione di memoria o un dato immediato.

Vi sono molti modi per spostare un dato, tra questi ricordiamo:

Istruzioni aritmetiche del microprocessore 8086

ISTRUZIONI ARITMETICHE:

                                                      Istruzione ADD

L’operazione di somma tra due operandi viene realizzata attraverso il comando ADD ( da adder cioè sommare). La sua sintassi è:

                                                     ADD sorgente1, sorgente2

In questo caso la somma tra sorgente1 e sorgente2 viene trasferita in sorgente1

                                              Sorgente1<--sorgente1 + sorgente2

ADD AX, DATO  ; somma il contenuto di DATO a quello di AX e lo trasferisce in AX
ADD DATO,BX ; somma il contenuto di BX e DATO e lo trasferisce in DATO


                                                      Istruzione SUB


L’operazione di sottrazione tra due operandi viene realizzata tramite l’istruzione SUB (da subtract o sottrai). La sua sintassi è:


                                                      SUB sorgente1,sorgente2


In questo caso la sottrazione tra sorgente1 e sorgente2 viene trasferita in sorgente1


                                               Sorgente1 <-- sorgente1 –sorgente2


                                                            Istruzione MUL


L’istruzione MUL esegue la moltiplicazione per sorgente del moltiplicando che si trova in AL se la moltiplicazione è ad 8 bit, mentre oppure esegue la moltiplicazione di sorgente per il moltiplicando che si trova in AX se la moltiplicazione è a 16 bit.


Il risultato del prodotto di sorgente per il moltiplicando (AL O AX) viene trasferito in AX se il moltiplicando è a 8 bit mentre viene trasferito in DX:AX se il moltiplicando è a 16 bit(Word alta in DX e word bassa in AX). I fag C ed O vengono impostati ad 1 se la metà più significativa del risultato è diversa da zero.


                                                                  MUL sorgente


Moltiplica senza segno interi a 8 bit o 16 bit con il risultato in doppia precisione a 16 o a 32 bit.


ESEMPIO:


MOV AL, 2   ;                sposta il numero 2 in AL
MOV BL,3    ;                sposta il numero 3 in BL
MUL  B3      ;                  AX<--AL* BL ciè sposta in AX il numero 
                     

                      ;                  dato dal prodotto di AL per BL

                     ;                  nel nostro caso AX<-- 0006

 

ESEMPIO: 


MOV AX ,10  ;                  sposta in AX il numero 10h
MOV BX, 2  ;                    sposta in BX il numero 02h
MUL BX       ;                    sposta in DX: AX il risultato

                      ;                     di AX per BX nel nostro

                      ;                   caso DX:AX<-- 0000:0020


                                                                  

Divisione a 8 bit e a 16 bit

L'istruzione per eseguire la divisione nel microprocessore 8086 è: 

 

                                                                DIV sorgente


ed esegue la divisione senza segno;


il divisore a 8 o a 16 bit è in sorgente; il dividendo di precisione doppia , è in AX o nella coppia di registri DX:AX;


il quoziente va in  AL (8bit) o in AX (16 bit) e il resto nei due casi, in AX o in DX.
I flag sono indefiniti e una divisione per zero genera una interruzione di tipo 0.

Salvataggio di un file con estensione .com

LAVORIAMO CON IL DEBUG

Problema :
Risolvere la seguente funzione utilizzando i registri ad 8 bit:

8 - ( 1 + 4 )

A 100 Assembla a partire dall’indirizzo 100
MOV AL, 08 AL<- 08
MOV BL, 04 BL<- 04
MOV BH, 01 BH<- 01
ADD BH, BL BH<- BH +BL
SUB AL, BH AL <- AL -BH
INT 3

Per salvarlo nella directory pippo col nome somma.com bisogna eseguire la seguente procedura:


Dopo aver scritto il programma come da figura e aver digitato INT 3 premere invio; spunterà una
linea.

A questo punto scrivere (senza uscire dal Debug):


- n c:\pippo\somma.com (invio)
- R BX (invio)
-0
-R CX (invio)
- B (invio)

-w (invio)

 

Il valore inserito B dipende dalla lunghezza del nostro programma nel nostro
caso dalla figura si vede che da 0100 l’istruzione dopo INT 3 è arrivata alla cella 010B
da cui facendo la differenza tra (010B – 0100) = B


L' istruzione  w significa scrivi il programma
Dopo l' invio si avrà la risposta del debug :

-sono stati scritti B byte,

cioè il nostro programma è stato
salvato nella cartella 

c:\pippo\somma.com

Come richiamare un file con estensione .com

Per richiamare il file appena salvato bisogna eseguire la seguente procedura.

Dal prompt di c:> scrivere


c:> debug c:\pippo\somma.com (invio)
-u (cioè u = assembla il programma appena salvato)
-r (cioè r = fai vedere i registri )
- t ( t = step to step cioè passo passo)
(continuare a dare invio e poi scrivere t fin quando si arriva
all’istruzione INT 3).

 ESCAPE='HTML'