Programmazione.it v6.2
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Chat Forum
Breve tutorial sul linguaggio Assembly: esempi pratici (1/4)
Scritto da Alessandro Vinciarelli il 03-09-2007 ore 12:39
L’obiettivo di questo breve tutorial è quello di fornire alcuni semplici esempi pratici di utilizzo del celebre linguaggio Assembly. Si presupporrà quindi la conoscenza della teoria che c’è dietro questo linguaggio e, per alcune parti, del linguaggio C. In particolare ci soffermeremo sull’architettura Intel IA-32 e su un sistema GNU/Linux 2.6.

Per quanto riguarda la sintassi è necessario sottolineare che esistono due differenti dialetti Assembly molto noti:
  • quello relativo agli assemblatori dei sistemi operativi Windows, che prevede una sintassi cosiddetta Intel;
  • e quello relativo all’assemblatore GNU as, che prevede la sintassi chiamata AT&T. Questo assemblatore è quello che viene invocato dal compilatore gcc.
Anche se attualmente as è in grado di gestire entrambe le sintassi, nei nostri esempi utilizzeremo quella AT&T in quanto attraverso tale sintassi il compilatore gcc produce i file Assembly.

Partiamo quindi dal classico "Hello World!" e iniziamo a vedere come il compilatore gcc stesso costruisce il codice assembler, ottenuto con l'opzione –s:

  1. .file "HelloWorld.c" 
  2. .section .rodata 
  3.  
  4. .LC0: 
  5. .string "Hello World!n"  
  6. .text 
  7. .globl main 
  8. .type main,@function 
  9.  
  10. main: 
  11. pushl %ebp 
  12. movl %esp, %ebp  
  13. subl $8, %esp 
  14. andl $-16, %esp 
  15. movl $0, %eax 
  16. subl %eax, %esp 
  17. subl $12, %esp 
  18. pushl $.LC0  
  19. call printf 
  20. addl $16,%esp movl $0, %eax 
  21. leave 
  22. ret 
  23.  
  24. .size main -main
  25. .ident "GCC: (GNU) 3.3.4"


Come possiamo vedere il programma inizia con una serie di comandi che definiscono il file, i simboli e la stringa "Hello World!". Successivamente troviamo il main con le prime due istruzioni pushl e movl, che rappresentano le classiche istruzioni di entry al programma Assembly. Il registro ebp è un puntatore ai dati dello stack, mentre il registro esp contiene l'indirizzo della cima dello stack utilizzato dal microprocessore.

Di seguito troviamo due istruzioni sub, che riservano rispettivamente 8 e 12 byte sullo stack, intervallate da una istruzione di mov, che azzera l'accumulatore eax, cioè il valore restituito dal main. Infine, prima delle istruzioni leave e ret che, lasciando nelle giuste condizioni lo stack, concludono la funzione, troviamo il fulcro del codice Assembly.

Con l'istruzione pushl $.LCO inseriamo quanto definito in testa al programma come argomento dell'istruzione successiva, la ben nota printf(). Una volta eseguita la printf(), infine, vengono rimossi gli argomenti con l'operazione di add. L'istruzione add, opposta alla precedente sub, pulisce lo stack perché le locazioni di memoria con indirizzo lineare minore contengono gli indirizzi aggiunti più di recente.
Precedente: Behaviour-Driven Development
Successiva: Self Service Linux
Intervento di qbprog del 03-09-2007 ore 13:43
Cavaliere
Cavaliere

(137 interventi)
Iscritto il 20-09-2004
E' senz'altro apprezzabile un tutorial sull'assembly al giorno d'oggi.
Tuttavia l'articolo presuppone la conoscenza di:
- Teoria (?!) sul linguaggio assembly, sui linguaggi macchina in generale. (registry, stack, etc...)
- Conoscenza delle convenzioni di chiamata
- Conoscenza sui metodi di indirizzamento.

Tutte cose che un neofita di asm non conosce minimamente, e chi le conosce di certo conosce anche il linguaggio.

Inizierei un po' più dalle basi...

IMHO
Intervento di Alessandro Vinciarelli a.k.a. vinciarelli del 03-09-2007 ore 14:17, Roma (RM)
Nobile
Nobile
(63 interventi)
Iscritto il 07-12-2006
Apprezzo la tua osservazione e la condivido. E' proprio l'osservazione che mi sono auto-fatto mentre scrivevo questi esempi, quindi posso capirla a fondo.

E' vero che chi conosce bene gli aspetti di cui sopra saprà anche risolvere questi semplici esercizi di esempio, ma ti assicuro che per chi non ha le basi troppo consolidate oppure per chi sta imparando il linguaggio questi esempi sono il primo piccolissimo passo per proseguire poi con problemi più complessi.

Solitamente si parla in modo teorico di architettura della macchina, indirizzamento della memoria e solo dopo si passa a scrivere qualche linea di codice.

Io ho solo presupposto che una prima lettura di alcune dispense su Assembly ci sia stata.

ps. L'articolo propone un link ad un tutorial già pubblicato su Programmazione.it che pone le prime basi per comprendere il ilnguaggio.
Intervento di Andrea Pendoletti a.k.a. tattarata del 03-09-2007 ore 16:17, Villanterio (PV)
Plebeo
Plebeo
(3 interventi)
Iscritto il 29-03-2007
Ciao,

nell'articolo l'opzione è (sembra) -s (minuscolo) mentre nel mio gcc (GCC 4.1.2) è -S (maiuscolo). Per il resto ottima iniziativa ;)
Intervento di Vincenzo Avati a.k.a. smalldragon del 13-09-2007 ore 13:10, Napoli (NA)
Plebeo
Plebeo
(4 interventi)
Iscritto il 03-06-2004
Beh, questo non è assembler. L'assembler purtroppo è morto!
Ed io ne ero un grandissimo estimatore!
Questo linguaggio di cui si parla si chiama hlasm, il quale fu creato per poter adattare il vecchio software scritto in assembly ai sistemi windows.
Utilizzando delle tecniche di entrapping per catturare le chiamate agli interrupt e delle tecniche doorbox per vettorizzare gli interrupt creati dagli utenti, si poteva far girare un programma assembly sotto windows riducendone l’efficacia.
Non capisco perché continuano a chiamarlo assembly visto che dell'assembler non ha niente o quasi.
Le strutture sono quasi uguali a quelle del “C”.
A parte calcoli e depositi in memoria, se non hai le famigerate DLL e spesso mal documentate API, non puoi far niente di visibile o di operativo.
Non si può accedere a periferiche senza avere le DLL come invece si poteva fare con l’assembly e per questo che si utilizzava l'assembly, per poter sfruttare al meglio le periferiche.
Poi c'è da dire che le API e le DLL, quest’ultime naturalmente, hanno strutture più rigide rispetto a vecchi interrupt.
in conclusione, con questo linguaggio non serve tanto una buona conoscenza del hardware, come serviva con l'assembler, ma una buona conoscenza degli strumenti DLL e API.
Intervento di Alessandro Vinciarelli a.k.a. vinciarelli del 13-09-2007 ore 14:51, Roma (RM)
Nobile
Nobile
(63 interventi)
Iscritto il 07-12-2006
Citazione:
Beh, questo non è assembler.
http://asm.sourceforge.net/articles/linasm.html
http://en.wikipedia.org/wiki/GNU_Assembler
Citazione:
Questo linguaggio di cui si parla si chiama hlasm, il quale fu creato per poter adattare il vecchio software scritto in assembly ai sistemi windows.

HLASM è un assemblatore (http://it.wikipedia.org/wiki/Elenco_di_assemblatori)
così come assembler ;-)
Citazione:
Le strutture sono quasi uguali a quelle del “C”.
Potresti essere più preciso a riguardo? Che intendi per "le strutture sono quasi uguali a quelle del “C”"?
Citazione:
A parte calcoli e depositi in memoria, se non hai le famigerate DLL e spesso mal documentate API, non puoi far niente di visibile o di operativo.
Stiamo parlando di sintassi per Linux, le DLL non credo siano proprio necessarie per scrivere un programma.
Citazione:
in conclusione, con questo linguaggio non serve tanto una buona conoscenza del hardware, come serviva con l'assembler, ma una buona conoscenza degli strumenti DLL e API.
Di nuovo parliamo di linux e non di windows. Cmq fino a prova contraria questo assembly viene utilizzato proprio per programmare a basso livello, ad esempio i driver delle periferiche (di cui quindi va conosciuta molto bene l'architettura).
Intervento di Vincenzo Avati a.k.a. smalldragon del 20-09-2007 ore 16:22, Napoli (NA)
Plebeo
Plebeo
(4 interventi)
Iscritto il 03-06-2004
scusami per la mia risposta tardiva ma pultroppo ho avuto un sacco di cose da fare.
struttura risposta


vecchia discussione


nuova risposta


mi contestavi che hlasm era solo un assemblatore mentre io affermavo che era un linguaggio


hai raggione che l’hlasm ,acronimo di high level assembler,e anche un assemblatore se ricordo bene la I release risale al 1988 ed il suo nome in origine era lasm.
sinceramente non so che fine abbia fatto la società che lo creo.
Il difetto di questo assemblatore e che aveva una corporatura più da alto livello che da basso
,Per corporatura intendo il suo codice oggetto ,.obj che il suo eseguibile .exe,
Livello e aveva anche lo svantaggio che i suoi concorrenti turbo assembler e masm
costavano molto di meno ed erano più performanti.
La sigla hlasm comparve poco prima dell’uscita di windows 95 e questa volta si adatto
meglio al nuovo sistema operativo.
Ma veniamo alle ragioni che hanno modificato il linguaggio assembler decretandone la
morta a livello di computer.
Con l’avvento dei computer pentium i quali sono computer paralleli,mentre prima non lo
Erano,per le nozioni di parallelismo vedi qualche libro di elettronica.
Il sistema operativo divenne quasi del tutto inutilizzabile da parte di tutti cosi fu trasformato
Windows, che era un applicativo, in un sistema operativo.
Linux nacque successivamente per contrastare e levarsi dai piedi la tirannia di microsoft ma
essendo stato sviluppato sotto windows ne ha ereditato alcuni difetti.
Alcune ragioni che hanno stravolto l’assembler sono :
1) codici mnemonici insufficienti a gestire le nuove istruzioni inserite all’interno dei
microprocessori e quindi consequenziale cambio di strategia di assemblaggio dei programmi per poter gestire sia le nuove che le vecchie istruzioni.
2) tentativo delle multinazionali del software di controllo del codice in parte non riuscito grazie a linux
3) “facilitazione di programmazione” visto che ora anche se ti vuoi creare una libreria tua devi usare gioco forza quelle degli altri.
4) Esigenza di mercato e più facile ,più “utile” e più conveniente adattare una periferica hai driver disponibili nel sistema sia esso windows che linux.


Potresti essere più preciso a riguardo? Che intendi per "le strutture sono quasi uguali a quelle del “C”"?


per strutture quasi uguali a quelle del c intendo che :
1) sia in hlasm che in c i programmi sono delle funzioni nidificatementre esterne con preggi e difetti che dovresti conoscere nel vero assembly le funzioni invece erano dei quorter dei programmi ed erano sempre interni al programma.
2) Cosi come in c non si fa altro che settare dei parametri che poi vengono dati in pasto ad una funzione esterna mentre in assembler le funzioni essendo parte integrante venivano create direttamente dal settaggio dei parametri tipo si copiava la stringa da stampare nella locazione di memoria del buffer video.


Citazione:
A parte calcoli e depositi in memoria, se non hai le famigerate DLL e spesso mal documentate API, non puoi far niente di visibile o di operativo.
Stiamo parlando di sintassi per Linux, le DLL non credo siano proprio necessarie per scrivere un programma.



ma cosa credi che sia una DLL ?
una DLL non è niente altro che una libreria che a differenza di quelle normali a la prerogativa di essere dinamica cioè sempre attiva a meno che uno non la disattiva manualmente il che non è abbastanza agevole.
Non credo che chi abbia fatto linux ha rinunciato a una cosi grossa comodità.
E non credo che le librerie non si usano sotto linux sicuramente avranno un altro nome ma con funzionamento simile.in linguaggio assembly si utilizzano le librerie normali piuttosto che quelle dinamiche perché c’era l’esigenza di risparmiare memoria pena il blocco del computer.


Citazione:
in conclusione, con questo linguaggio non serve tanto una buona conoscenza del hardware, come serviva con l'assembler, ma una buona conoscenza degli strumenti DLL e API.
Di nuovo parliamo di linux e non di windows. Cmq fino a prova contraria questo assembly viene utilizzato proprio per programmare a basso livello, ad esempio i driver delle periferiche (di cui quindi va conosciuta molto bene l'architettura).



una volta si scrivevano in assembly adesso invece ,almeno a livello aziendale,vengono scritti in VHDL ,Virtual Hardware Design Lenguage, e poi convertiti ,di solito, in c, c++ questo cambiamento e dovuto a 3 fondamentali motivi :
1) il sistema gestiva le periferiche come la televisione cioè ogni periferica era agganciata ad un canale il quale era mappato ad un indirizzo ben specifico ed utilizzavano degli interrupt dedicati.il problema consisteva che non si potevano mettere più di un certo numero di periferiche per esempio se volevi montare un masterizzatore e un cr-rom o montavi l’uno o montavi l’altro perché tutti e 2 utilizzavano lo stesso canale.mentre ora la gestione e molto differente i canali sono stati virtualizzati ,prima erano solo fisici,così facendo si possono generare dei sottocanali e così ,teoricamente, si possono attaccare infinite periferiche ad un computer ciò a permesso la standardizzazione delle periferiche.
2) L’assembler gestiva il risultato che veniva dai circuiti elettronici tramite porte i/o e raramente switch e punti di accumulazione questi ultimi per facilità venivano baipassati su porte i/o. mentre utilizzando il linguaggio VHDL si programma direttamente il circuito elettronico rendendo non solo più facile la programmazione ma anche la riparazione dei circuiti.
3) VHDL permette un più facile interfacciamento fra microprocessori diversi.

Se vuoi imparare o dilettarti con la programmazione assembler usa i microprocessori della famiglia PICXXXX con un piccolo programmatore di eprom.
Scoprirai un mondo tutto da creare.
Per quanto riguarda il tutorial in se per se (lasciando da parte il fatto che e sull’ hlasm e non sul assembly) non è malvagio solamente che manca una prima lezione dove dovresti spiegare a cosa servono le direttive esempio: “.globl main” cosa che chi non conosce l’argomento certo non ci arriva tanto facilmente a capirlo.
Intervento di Alessandro Vinciarelli a.k.a. vinciarelli del 20-09-2007 ore 17:07, Roma (RM)
Nobile
Nobile
(63 interventi)
Iscritto il 07-12-2006
Per l'ultima frase, ok hai ragione ma per brevità ho dovuto tagliare molte cose.
Altrimenti ce ne erano di cose da spiegare.

Le librerie dinamiche ci sono anche in linux e come.

Per il resto tutto apprezzabilissimo, è che io mi riferisco, con il tutorial e con il termine, ad un assembly molto più vicino a noi e che comunque è considerato un linguaggio a basso livello.

Tu, che giustamente rimani fedele ad una codifica ancora precedente ritieni che quello sia il vero assembly. Sono punti di vista assolutamente condivisibili.
Intervento di Vincenzo Avati a.k.a. smalldragon del 20-09-2007 ore 17:42, Napoli (NA)
Plebeo
Plebeo
(4 interventi)
Iscritto il 03-06-2004
Citazione:
Per l'ultima frase, ok hai ragione ma per brevità ho dovuto tagliare molte cose.
Altrimenti ce ne erano di cose da spiegare.

Le librerie dinamiche ci sono anche in linux e come.

Per il resto tutto apprezzabilissimo, è che io mi riferisco, con il tutorial e con il termine, ad un assembly molto più vicino a noi e che comunque è considerato un linguaggio a basso livello.

Tu, che giustamente rimani fedele ad una codifica ancora precedente ritieni che quello sia il vero assembly. Sono punti di vista assolutamente condivisibili.

potresti fornire dei siti con buona documentazione documentazione delle API e delle DLL di sistema visto che oramai senza di loro non si può far più niente ?
ti ringrazio anticipatamente per l'informazioni che mi darai
Intervento di Alessandro Vinciarelli a.k.a. vinciarelli del 21-09-2007 ore 00:02, Roma (RM)
Nobile
Nobile
(63 interventi)
Iscritto il 07-12-2006
Citazione:
potresti fornire dei siti con buona documentazione documentazione delle API e delle DLL di sistema visto che oramai senza di loro non si può far più niente ?
ti ringrazio anticipatamente per l'informazioni che mi darai

A quest'ora, per me tarda, posso darti queste indicazioni per linux.

Allora intanto io direi di dare una letta a questa pagina che, in italiano, ci spiega tutto quello che dobbiamo sapere per rendere il nostro codice assembly un programma.

Qui troviamo un manuale completo in più lingue compreso italiano.

Qui, per chi sceglie la strada dell'assembly anzichè C, invece un tutorial sulla programmazione di driver in assembly.

Se ritrovo altri link li inserisco.

Per Windows purtroppo non ho niente, non mi sono mai cimentato con la programmazione assembly per questo sistema operativo. Conosco alcune differenze tra le due sintassi, ma niente di più.

ps. Un po' di tempo fa mi ero divertito anche con questo, per Mac.
Copyright Programmazione.it™ 1999-2009. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.812 secondi. Sito ottimizzato per Mozilla Firefox. Powered by Kyron.