Introduzione al linguaggio assembly del microprocessore 8086.

14
Introduzione al linguaggio assembly del microprocessore 8086

Transcript of Introduzione al linguaggio assembly del microprocessore 8086.

Page 1: Introduzione al linguaggio assembly del microprocessore 8086.

Introduzione al linguaggio assembly del microprocessore 8086

Page 2: Introduzione al linguaggio assembly del microprocessore 8086.

Il linguaggio macchina

Il linguaggio naturale di un microprocessore è il linguaggio macchina.

Nel linguaggio macchina non esistono riferimenti astratti o simbolici e tutte le operazioni sono eseguite direttamente sui registri o in locazioni assolute di memoria.

La programmazione in linguaggio macchina è stata a lungo l’unica possibile, all’inizio dell’epoca del calcolo elettronico, prima dell’introduzione degli assemblatori e dei compilatori.

Il linguaggio macchina non è altro che l’insieme delle istruzioni definite per un particolare processore. Ogni istruzione è identificata dal suo codice, di solito riportato in binario o esadecimale.

Il linguaggio naturale di un microprocessore è il linguaggio macchina.

Nel linguaggio macchina non esistono riferimenti astratti o simbolici e tutte le operazioni sono eseguite direttamente sui registri o in locazioni assolute di memoria.

La programmazione in linguaggio macchina è stata a lungo l’unica possibile, all’inizio dell’epoca del calcolo elettronico, prima dell’introduzione degli assemblatori e dei compilatori.

Il linguaggio macchina non è altro che l’insieme delle istruzioni definite per un particolare processore. Ogni istruzione è identificata dal suo codice, di solito riportato in binario o esadecimale.

Page 3: Introduzione al linguaggio assembly del microprocessore 8086.

Il linguaggio macchina

Per facilitare la descrizione delle istruzioni e degli operandi, si fa uso della notazione esadecimale in alternativa a quella binaria.

L’esempio precedente assume in esadecimale questo aspetto:

Per facilitare la descrizione delle istruzioni e degli operandi, si fa uso della notazione esadecimale in alternativa a quella binaria.

L’esempio precedente assume in esadecimale questo aspetto:

0011 1101 0001 0010 0000 1000 0011 1101 0001 0010 0000 1000

3 D 1 2 0 83 D 1 2 0 8

Il linguaggio macchina si compone di istruzioni alle quali fanno immediatamente seguito i relativi operandi.

Un esempio di linguaggio macchina per il processore Intel 8086 è il seguente codice per il confronto del contenuto dell’accumulatore AX con la costante 812h:

Il linguaggio macchina si compone di istruzioni alle quali fanno immediatamente seguito i relativi operandi.

Un esempio di linguaggio macchina per il processore Intel 8086 è il seguente codice per il confronto del contenuto dell’accumulatore AX con la costante 812h:

Page 4: Introduzione al linguaggio assembly del microprocessore 8086.

Con debug

Con l’uso della calcolatrice scientifica potremo verificare che il valore binario corrispondente è proprio:

001111010001001000001000

Page 5: Introduzione al linguaggio assembly del microprocessore 8086.

Difficile?

Resta però difficile lavorare anche con questa notazione.

Il codice rimane indistinguibile dagli operandi e solo a fatica, con l’aiuto di una tabella di conversione si riconosce in 3D l’istruzione di confronto.

Un certo impegno è anche necessario per la traduzione di 08 12 in 12 08.

Infatti viene memorizzato prima il byte della parte bassa e poi il byte della parte alta del numero considerato a 16 bit.

Resta però difficile lavorare anche con questa notazione.

Il codice rimane indistinguibile dagli operandi e solo a fatica, con l’aiuto di una tabella di conversione si riconosce in 3D l’istruzione di confronto.

Un certo impegno è anche necessario per la traduzione di 08 12 in 12 08.

Infatti viene memorizzato prima il byte della parte bassa e poi il byte della parte alta del numero considerato a 16 bit.

Page 6: Introduzione al linguaggio assembly del microprocessore 8086.

Molto !!!

Il codice binario (o la sua rappresentazione equivalente esadecimale) usato nel linguaggio macchina è molto scomodo; per l’uomo è molto più facile raffigurare e lavorare con simboli e messaggi piuttosto che con cifre.

Il codice binario (o la sua rappresentazione equivalente esadecimale) usato nel linguaggio macchina è molto scomodo; per l’uomo è molto più facile raffigurare e lavorare con simboli e messaggi piuttosto che con cifre.

Page 7: Introduzione al linguaggio assembly del microprocessore 8086.

Una soluzione:I linguaggi assembly in ambienti assembler sono stati introdotti proprio per eliminare i problemi di uso del linguaggio macchina. Le caratteristiche principali dei linguaggi assembly sono le seguenti:

• In assembly le istruzioni non sono identificate da codici astratti ma da simboli letterali con significato mnemonico.

ADD significa ad esempio addizione

• Alle variabili viene fatto riferimento per valore e non per locazione assoluta di memoria (indirizzo)

• E’ possibile definire istruzioni macro assembler, composte a loro volta da altre istruzioni, e richiamarle nel programma.

I linguaggi assembly in ambienti assembler sono stati introdotti proprio per eliminare i problemi di uso del linguaggio macchina. Le caratteristiche principali dei linguaggi assembly sono le seguenti:

• In assembly le istruzioni non sono identificate da codici astratti ma da simboli letterali con significato mnemonico.

ADD significa ad esempio addizione

• Alle variabili viene fatto riferimento per valore e non per locazione assoluta di memoria (indirizzo)

• E’ possibile definire istruzioni macro assembler, composte a loro volta da altre istruzioni, e richiamarle nel programma.

Page 8: Introduzione al linguaggio assembly del microprocessore 8086.

Esempio: alternativa In Linguaggio

Assembly (commenti in IDE jasmin)

In Linguaggio C like

Page 9: Introduzione al linguaggio assembly del microprocessore 8086.

Esempio: scrittura a video

….. main(….) {System.out.print(“ciao \n”); }

DSEG SEGMENT ;segmento datiOutstr db “ciao”,13,10,”$”

DSEG ENDSSSEG SEGMENT stack ;segmento catasta

dw 32 dup (?)SSEG ENDSCSEG SEGMENT ;segmento codice

assume cs:cseg, ds:dseg, ss:sseg start: mov bx,dseg

mov ds,bx ;DS=DSEG via bxmov dx,offset outstr ;puntatore a “ciao”mov ah,09h ;uscita su schermoint 21h ;richiamo MS-DOSmov ah,4Ch ;termine programmaint 21h ;richiamo MS-DOS

CSEG ENDSEND start ; termine programma

; inizio a start

In Linguaggio JAVA

In Linguaggio Assembly

….. main(….) {printf(“ciao \n”); }

In Linguaggio C

Page 10: Introduzione al linguaggio assembly del microprocessore 8086.

Complicato?

Il primo programma è molto più compatto del secondo, oltre che più facile da leggere e capire. Il programma in assembly è a prima vista certamente molto più complicato ed è necessario un certo tempo per analizzarne e comprenderne le funzioni, che in questo caso sono comunque molto semplici.

Il primo programma è molto più compatto del secondo, oltre che più facile da leggere e capire. Il programma in assembly è a prima vista certamente molto più complicato ed è necessario un certo tempo per analizzarne e comprenderne le funzioni, che in questo caso sono comunque molto semplici.

Entrambi i programmi funzionano secondo lo stesso principio, chiedendo al sistema operativo di presentare una stringa sullo schermo.

Entrambi i programmi funzionano secondo lo stesso principio, chiedendo al sistema operativo di presentare una stringa sullo schermo.

Page 11: Introduzione al linguaggio assembly del microprocessore 8086.

Nel programma in assembly è necessario tenere esplicitamente conto di tutti questi aspetti.

Le chiamate al sistema operativo hanno luogo per mezzo dell’istruzione INT 21h

La stringa di uscita è definita nell’area dati; con essa devono essere indicati esplicitamente i codici di “a capo” (ASCII 10) , “ritorno carrello” (ASCII 13) e termine stringa “$”.

Nel programma in assembly è necessario tenere esplicitamente conto di tutti questi aspetti.

Le chiamate al sistema operativo hanno luogo per mezzo dell’istruzione INT 21h

La stringa di uscita è definita nell’area dati; con essa devono essere indicati esplicitamente i codici di “a capo” (ASCII 10) , “ritorno carrello” (ASCII 13) e termine stringa “$”.

Nel programma in linguaggio JAVA i dettagli di questa chiamata sono nascosti al programmatore al quale è sufficiente scrivere l’istruzione Systm.out.print Spetta al compilatore generare la chiamata al sistema operativo, aggiungere alla stringa i codici di controllo “a capo” e “ritorno carrello”, ecc.

Nel programma in linguaggio JAVA i dettagli di questa chiamata sono nascosti al programmatore al quale è sufficiente scrivere l’istruzione Systm.out.print Spetta al compilatore generare la chiamata al sistema operativo, aggiungere alla stringa i codici di controllo “a capo” e “ritorno carrello”, ecc.

Page 12: Introduzione al linguaggio assembly del microprocessore 8086.

Facciamo qualche valutazione..La differenza nello spazio occupato in memoria dai due programmi è evidente quando si passa a compilarli ed eventualmente collegarli. Le dimensioni in byte dei codici sorgente, oggetto (compilato) e eseguibile (collegato) dei programmi sono qui confrontate:

La differenza nello spazio occupato in memoria dai due programmi è evidente quando si passa a compilarli ed eventualmente collegarli. Le dimensioni in byte dei codici sorgente, oggetto (compilato) e eseguibile (collegato) dei programmi sono qui confrontate:

Programma in JAVA Programma in C Programma in Assembly

Sorgente 1000 byte 57 byte 682 byte

Oggetto 1000 byte 578 byte 194 byte

Eseguibile Al volo 15 Kbyte 610 byte

La differenza nelle dimensioni del programma sorgente assembly rispetto al C è dovuta al maggior spazio richiesto per le istruzioni e per i commenti necessari. Il codice compilato è però già più compatto per il programma assembly. La differenza più rilevante si nota dopo che i programmi sono stati collegati alle rispettive biblioteche e routine di servizio: il programma in assembly manca quasi completamente di overhead, che invece caratterizza il programma in C. Il programma scritto in assembly è più rapido a caricarsi ed eseguirsi; tutti i programmi producono lo stesso risultato e non sono distinguibili solo sulla base di quest’ultimo.

La differenza nelle dimensioni del programma sorgente assembly rispetto al C è dovuta al maggior spazio richiesto per le istruzioni e per i commenti necessari. Il codice compilato è però già più compatto per il programma assembly. La differenza più rilevante si nota dopo che i programmi sono stati collegati alle rispettive biblioteche e routine di servizio: il programma in assembly manca quasi completamente di overhead, che invece caratterizza il programma in C. Il programma scritto in assembly è più rapido a caricarsi ed eseguirsi; tutti i programmi producono lo stesso risultato e non sono distinguibili solo sulla base di quest’ultimo.

Page 13: Introduzione al linguaggio assembly del microprocessore 8086.

Concludendo..Non esistono criteri assoluti per optare per un linguaggio ad alto livello oppure assembly. Se con l’assembly è possibile scrivere programmi più efficienti, è anche vero che la loro stesura prende molto più tempo rispetto allo scrivere programmi in un linguaggio avanzato. Anche la documentazione e la manutenzione di programmi assembly sono più difficili e dispendiose.

Non esistono criteri assoluti per optare per un linguaggio ad alto livello oppure assembly. Se con l’assembly è possibile scrivere programmi più efficienti, è anche vero che la loro stesura prende molto più tempo rispetto allo scrivere programmi in un linguaggio avanzato. Anche la documentazione e la manutenzione di programmi assembly sono più difficili e dispendiose.

La programmazione in assembly resta comunque di attualità in tutti i casi dove con la programmazione ad alto livello si raggiungono i limiti di capacità di memoria o velocità di esecuzione di una macchina.Alcune funzioni, in particolare quelle che agiscono direttamente sulle risorse del sistema, non sono realizzabili se non in assembly.

La programmazione in assembly resta comunque di attualità in tutti i casi dove con la programmazione ad alto livello si raggiungono i limiti di capacità di memoria o velocità di esecuzione di una macchina.Alcune funzioni, in particolare quelle che agiscono direttamente sulle risorse del sistema, non sono realizzabili se non in assembly.

Aspetto non trascurabile della programmazione assembly è il suo carattere didattico. Indipendentemente dal numero e tipo di prodotti software installati in un sistema, il processore, almeno con le architetture attuali, opera su istruzioni di macchina assimilabili a quelle di un programma assembly. L’assembly aiuta quindi a comprendere meglio i meccanismi di funzionamento della macchina.

Aspetto non trascurabile della programmazione assembly è il suo carattere didattico. Indipendentemente dal numero e tipo di prodotti software installati in un sistema, il processore, almeno con le architetture attuali, opera su istruzioni di macchina assimilabili a quelle di un programma assembly. L’assembly aiuta quindi a comprendere meglio i meccanismi di funzionamento della macchina.

Page 14: Introduzione al linguaggio assembly del microprocessore 8086.

… concludendo