Amministra sito

Nuovo blog Nireblog


Categoria: Programmazione

L'assembly, tra i linguaggi di programmazione, più vicini al linguaggio macchina vero e proprio.

softwarehouse 29/02/2008 @ 20:43

150x150_sottoscrivi.png

Un assembler è un Programma che trasforma le istruzioni mnemoniche dell'assembly in linguaggio macchina.

E' come se fosse un'interprete diretto tra i comandi che scrive l'uomo e i codici che esegue la macchina. il termine ASSEMBLER deriva dal fatto che le istruzioni vengono convertite e montate una affianco all'altra comme se fossero in fila.

Per ES:
MOV AX,56h Le istruzioni in 8086 che vengono convertite
XOR SI,DI

B8 56 00 in linguaggio macchina (HEX)
33 F7

Molto spesso viene utilizzato impropriamente il termine assembler in riferimento al linguaggio assembly.

Esistono gli assembler per programmare i microcip, per creare programmini sul PC, per quelli sul cellulare, ecc..

Ci sono molti tipi di linguaggi assembly e di conseguenza diversi assemblatori. Questo perché un'assemblatore produce codice assembly per una specifica famiglia di processori. ( intel 8086, 80386, Motorola 68000, ecc... ) Se un programmatore conosce il linguaggio per un certo tipo di processore, è facile impararne un'altro perché i linguaggi si differiscono di poco.

L'assembly, o linguaggio assemblatore (spesso chiamato impropriamente assembler) è, tra i linguaggi di programmazione, quello più vicino al linguaggio macchina vero e proprio.

Caratteristiche generali dell'assembly

L'assembly ha lo scopo generale di consentire 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; per esempio, il codice operativo per la somma potrebbe essere trascritto come ADD e quello per il salto come JMP.

In secondo luogo, i dati e gli indirizzi di memoria manipolati dal programma possono essere scritti, in assembly, nella base numerica più consona al momento: esadecimale, binaria, decimale, ottale ma anche in forma simbolica, utilizzando stringhe di testo (identificatori). Il programma assembly risulta in questo modo relativamente più leggibile di quello in linguaggio macchina, con il quale mantiene però un totale (o quasi totale) isomorfismo. Il programma scritto in assembly non può essere eseguito direttamente dal processore; esso deve essere tradotto nella forma binaria corrispondente, usando un compilatore detto assembler.

Esempio di codice

Esempio di programma "Hello world"

IDEAL
MODEL SMALL
STACK 100h
DATASEG
HW DB "hello, world", 13, 10, '$'
CODESEG
Begin:
MOV AX, @data

Non c'è un solo assembly

A causa di questa "vicinanza" all'hardware, non esiste un unico linguaggio assembly. Al contrario, ogni CPU o famiglia di CPU ha un suo proprio assembly, diverso dagli altri. Ad esempio, sono linguaggi assembly ben diversi quelli per i processori Intel x86, per i Motorola 68000 e per i Dec Alpha. Questo significa che conoscere un certo linguaggio assembly significa saper scrivere programmi solo su una determinata CPU o famiglia di CPU. Passare ad altre CPU però è relativamente facile, perché molti meccanismi sono analoghi o del tutto identici, quindi spesso il passaggio si limita all'apprendimento di nuovi codici mnemonici, nuove modalità di indirizzamento ed altre varie peculiarità del nuovo processore.

Molto meno facile è invece portare un programma scritto in assembly su macchine con processori diversi o con architetture diverse: quasi sempre significa dover riscrivere il programma da cima a fondo, perché i linguaggi assembly dipendono completamente dalla piattaforma per cui sono stati scritti. Molti compilatori assembly supportano sistemi di macro che potrebbero essere impiegati per ovviare in parte a questo problema, ma si tratta di una soluzione poco efficace.

Inoltre l'assembly non offre alcun "controllo sui tipi" (non esiste alcunché di vagamente simile al concetto di "tipo" nella programmazione low-level), ma lascia al programmatore la responsabilità di occuparsi di ogni singolo dettaglio della gestione della macchina e richiede molta disciplina e un esteso lavoro di commento per non scrivere codice che risulti assolutamente illeggibile (ad altri programmatori come anche a sé stessi dopo qualche tempo).

A fronte di questi svantaggi l'assembly offre un'efficienza senza pari e il controllo completo e assoluto sull'hardware: i programmi in assembly sono, in linea di principio, i più piccoli e veloci che sia possibile scrivere su una data macchina.

Scrivere (buon) codice in assembly è lento, difficile e quindi molto costoso, soprattutto in prospettiva (future modifiche): per questo, raramente l'assembly è il solo linguaggio usato in un progetto mainstream, a meno che questo non sia di dimensioni e portata limitate. In genere si usa in combinazione con altri linguaggi: la maggior parte del codice viene scritta in un linguaggio ad alto livello, mentre le parti più critiche (per motivi di performance, precisione del timing o affidabilità) si scrivono in assembly.

Tali problematiche sono riscontrabili principalmente su piattaforme come i personal computer attuali, dove la vastità quantitativa e l'enorme gamma qualitativa dell'hardware disponibile crea alle applicazioni low-level un oggettivo problema mai risolto (e presumibilmente non risolvibile) a livello di unificazione e standard.

A ciò si aggiunga l'evoluzione costante verso una sempre maggiore stratificazione dei comuni sistemi operativi, caratterizzata da numerosi vincoli e virtualizzazioni delle periferiche fisiche e dei canali di comunicazione, che non rendono agevole lo sviluppo di un software che interagisca direttamente con l'hardware sottostante e ne gestisca direttamente le caratteristiche.

Si possono però citare due esempi, peraltro correlati, di totale inversione di questo paradigma generale:

* Ha ampiamente senso creare programmi interamente in assembly destinati ad hardware caratterizzato architetturalmente da documentazione esaustiva, grande predicibilità, stabilità e scarsa variabilità temporale del design: per esempio, si possono citare gli home computer degli anni ottanta, come il Commodore Vic-20 o il Sinclair ZX Spectrum.

* Ha parimenti senso, ed un forte riscontro nella pratica invalsa negli ultimi trenta anni, operare prevalentemente o esclusivamente in assembly nel vastissimo mercato dei sistemi embedded, per la programmazione di microcontroller e DSP, eventualmente anche sotto forma di core implementati tramite ASIC, CPLD ed FPGA, al fine di massimizzare performance e rispetto dei vincoli temporali, minimizzando nel contempo il footprint.

Ciò trova riscontro a tutti i livelli della filiera produttiva, a partire dalla progettazione dei chip e del relativo linguaggio utilizzando ISA di tipo RISC e fortemente ortogonali, la cui ottimizzazione (in spazio o in performance) è altamente semplificata. Questo approccio è fondamentale in quanto consente grandi economie di scala nei progetti tipici del mondo embedded, caratterizzati dalla capacità di assorbire costi iniziali (NRE, non-recurrent engineering costs) anche elevati, purché finalizzati ad una forte compressione del costo unitario del prodotto finale, anche per volumi medio-bassi.


Ecco allora che la possibilità di utilizzare un microcontroller con limitatissime risorse di memoria ROM e RAM scrivendo il firmware integralmente in assembly diventa essenziale al fine di minimizzare i costi, l'ingombro in piastra, la suscettibilità elettromagnetica, aumentando anche l'affidabilità (processori più "datati" hanno un incolmabile vantaggio in termini di milioni di ore di test e funzionamento sul campo, ossia la "merce" di gran lunga più preziosa per i sistemi embedded variamente critici) ed ottimizzando numerosi altri fattori.

MOV DS, AX
MOV DX, OFFSET HW
MOV AH, 09H
INT 21H
MOV AX, 4C00H
INT 21H
END Begin

RISC e CISC

Il linguaggio assembly costituisce il cosiddetto ISA (Instruction Set Architecture) di un processore. I diversi ISA possono essere divisi in due grandi gruppi: i RISC (Reduced Instruction Set Computer) e i CISC (Complex Instruction Set Computer). Il primo gruppo tende ad avere operazioni semplici e veloci, con grande abbondanza di registri per memorizzare i risultati intermedi. Il secondo mette a disposizione del programmatore istruzioni più complesse, che a volte mimano quelle dei linguaggi di livello più alto (ad esempio, la copia di stringhe nei processori x86).

In entrambi i casi, i migliori set di istruzioni tendono ad essere quelli cosiddetti ortogonali, dove i diversi metodi di indirizzamento e i diversi registri possono essere usati indifferentemente in tutte le istruzioni. Famosi set di istruzioni ortogonali sono quelli del Motorola 68000 (CISC) e del MIPS (RISC). L'ISA dei processori Intel x86 era originariamente ben poco ortogonale, ed è andata via via migliorando.

La distinzione tra set di istruzioni RISC e CISC è oggi un po' sfumata, perché la maggior parte dei processori consumer sono oggi dei CRISP, cioè un misto fra i due. Inoltre, alcuni processori traducono l'ISA originale in un set di istruzioni interno, per ragioni diverse e con modalità diverse: nel caso dell'Intel Pentium 4 e dell'AMD Athlon, è per liberarsi dalle limitazioni causate da un'ISA retrocompatibile ormai arcaica, e la conversione è eseguita direttamente da hardware dedicato che effettua la necessaria decodifica.

Nel caso dei processori Transmeta, è per poter "tradurre" ISA di altri processori esistenti come se fossero proprie, e la traduzione è fatta da qualcosa di molto simile a routine firmware (talvolta denominate microcodice) memorizzate in un'area ROM ricavata sul silicio del microprocessore.

RSTP ("Raccomandati Se Ti Piacciono")

24/02 - BitNami. per installare pacchetti Open Source con facilità

19/02 - Il Bloggatore, nuovo aggregatore di feeds on line

13/02 - PHP_Speedy utility per velocizzare il tuo sito

13/02 - Synback, utility per pianificare i backups automatici

05/02 - Nireblog e Nirudia

04/02 - Slony, per il backup dei nostri databases in Ubuntu

27/01 - Page Defrag, per chi non si accontenta del semplice defrag di Windows

23/01 - VirtualDub, ottimo tool open source per il video editing

Altri links del "Mondo Open Source"

04/03 - Masterizzare da linea di comando

24/02 - Epiphany, browser appositamente fatto per Ubuntu/Gnome

21/02 - Comandi per la gestione di file e directory in Linux

18/02 - XFile files tree syncronizaion and cross validation

14/02 - Compiz, rilasciata la nuova versione 0.70

13/02 - Tape, Backup Software per Linux

12/02 - How do I Backup Thunderbird mail and profile under Linux

11/02 - BioBrew, Linux Distribution for the Life Scientists

1/02 - Blag, Distro basata su Fedora Core

10/02 - Virtualizzazione, una rassegna di quattro opzioni

09/02 - Wine 0.9.5.5. released

05/02 - Nuova release per Bacula backup


150x150_sottoscrivi.png


GNU Octave, disponibile la nuova versione 3.0

softwarehouse 27/12/2007 @ 17:48

L'immagine “http://www.gnu.org/software/octave/images/sombrero.jpg” non può essere visualizzata poiché contiene degli errori.

GNU Octave è la principale alternativa open source a Matlab.

GNU Octave è un linguaggio di programmazione di alto livello. Fornisce un'interfaccia a riga di comando orientata a risolvere problemi di calcolo numerico, utilizzando un linguaggio estremamente simile a Matlab e per certi versi compatibile con esso.

In ambito ingegneristico Matlab é molto usato e Octave si presenta come una valida alternativa open source. Con la nuova versione di sviluppo, gli sviluppatori cercano di implementare le stesse funzioni con lo stesso nome di Matlab in octave

Octave possiede numerose librerie che permettono di risolvere problemi numerici di algebra lineare, di trovare le radici di equazioni non lineari, integrare funzioni ordinarie, manipolare espressioni polinomiali, integrare equazioni differenziali e alle differenze algebriche, e altro ancora. Tramite altre librerie presenti in Octave è possibile ottenere con facilità grafici bidimensionali e tridimensionali, e effettuare operazioni di input/output.

Octave è facilmente estendibile e customizzabile, sia attraverso funzioni scritte nel linguaggio nativo di Octave, sia attraverso moduli caricabili dinamicamente che possono essere scritti in C, C++, Fortran e altri linguaggi.

Per chi utilizza Matlab e cerca un'alternativa funzionale e open source, Octave è senz'altro la scelta migliore.

Nota: Octave è anche disponibile per Mac come parte del progetto Fink. Chi fosse interessato può trovare ulteriori informazioni direttamente sul sito del progetto Fink

Vantaggi:

  • Facilissimo da utilizzare per chi conosce Matlab
  • Per un utilizzo generale offre gli stessi tool di Matlab

Svantaggi:

  • La compatilità con Matlab è parziale
  • Mancano diversi tool presenti in Matlab per utilizzi particolari
L'immagine “http://upload.wikimedia.org/wikipedia/commons/thumb/f/fb/Octave_workshop_screenshot.png/300px-Octave_workshop_screenshot.png” non può essere visualizzata poiché contiene degli errori.


News for Octave Version 3

  • Compatibility with Matlab graphics is much better. We now have some graphics features that work like Matlab's Handle Graphics (tm):
    • You can make a subplot and then use the print function to generate file with the plot.
    • RGB line colors are supported if you use gnuplot 4.2. Octave can still use gnuplot 4.0, but there is no way to set arbitrary line colors with it when using the Matlab-style plot functions. There never was any way to do this reliably with older versions of gnuplot (whether run from Octave or not) since it only provided a limited set to choose from, and they were terminal dependent, so choosing color 1 with the X11 terminal would be different from color 1 with the PostScript terminal. Valid RGB colors for gnuplot 4.0 are the eight possible combinations of 0 and 1 for the R, G and B values. Invalid values are all mapped to the same color.

      This also affects patch objects used in the bar, countour, meshc and surfc functions, where the bars and contours will be monochrome. A workaround for this is to type "colormap gmap40" that loads a colormap that in many cases will be adequate for simple bar and contour plots.

    • You can control the width of lines using (for example):
      	line (x, y, "linewidth", 4, "color", [1, 0, 0.5]); 

      (this also shows the color feature).

    • With gnuplot 4.2, image data is plotted with gnuplot and may be combined with other 2-d plot data.
    • Lines for contour plots are generated with an Octave function, so contour plots are now 2-d plots instead of special 3-d plots, and this allows you to plot additional 2-d data on top of a contour plot.
    • With the gnuplot "extended" terminals the TeX interpreter is emulated. However, this means that the TeX interpreter is only supported on the postscript terminals with gnuplot 4.0. Under gnuplot 4.2 the terminals aqua, dumb, png, jpeg, gif, pm, windows, wxt, svg and x11 are supported as well.
    • The following plot commands are now considered obsolete and will be removed from a future version of Octave:
      	__gnuplot_set__ __gnuplot_show__ __gnuplot_plot__ __gnuplot_splot__ __gnuplot_replot__ 

      Additionally, these functions no longer have any effect on plots created with the Matlab-style plot commands (plot, line, mesh, semilogx, etc.).

    • Plot property values are not extensively checked. Specifying invalid property values may produce unpredictible results.
    • Octave now sends data over the same pipe that is used to send commands to gnuplot. While this avoids the problem of cluttering /tmp with data files, it is no longer possible to use the mouse to zoom in on plots. This is a limitation of gnuplot, which is unable to zoom when the data it plots is not stored in a file. Some work has been done to fix this problem in newer versions of gnuplot (> 4.2.2). See for example, this thread on the gnuplot development list.
  • The way Octave handles search paths has changed. Instead of setting the built-in variable LOADPATH, you must use addpath, rmpath, or path"." at the head of the path, for compatibility with Matlab. to manipulate the function search path. These functions will maintain

    Leading, trailing or doubled colons are no longer special. Now, all elements of the search path are explicitly included in the path when Octave starts. To display the path, use the path function.

    Path elements that end in // are no longer searched recursively. Instead, you may use addpath and the genpath function to add an entire directory tree to the path. For example,

          addpath (genpath ("~/octave")); 

    will add ~/octave and all directories below it to the head of the path.

  • Previous versions of Octave had a number of built-in variables to control warnings (for example, warn_divide_by_zero). These variables have been replaced by warning identifiers that are used with the warning function to control the state of warnings.

    For example, instead of writing

          warn_divide_by_zero = false; 

    to disable divide-by-zero warnings, you should write

          warning ("off", "Octave:divide-by-zero"); 

    You may use the same technique in your own code to control warnings. For example, you can use

          warning ("My-package:phase-of-the-moon", "the phase of the moon could cause trouble today"); 

    to allow users to control this warning using the "My-package:phase-of-the-moon" warning identifier.

    You may also enable or disable all warnings, or turn them into errors:

          warning ("on", "all"); warning ("off", "all"); warning ("error", "Octave:divide-by-zero"); warning ("error", "all"); 

    You can query the state of current warnings using

          warning ("query", ID) warning ("query") 

    (only those warning IDs which have been explicitly set are returned).

    A partial list and description of warning identifiers is available using

          help warning_ids 
  • All built-in variables have been converted to functions. This change simplifies the interpreter and allows a consistent interface to internal variables for user-defined packages and the core functions distributed with Octave. In most cases, code that simply accesses internal variables does not need to change. Code that sets internal variables will change. For example, instead of writing
          PS1 = ">> "; 

    you will need to write

          PS1 (">> "); 

    If you need write code that will run in both old and new versions of Octave, you can use something like

          if (exist ("OCTAVE_VERSION") == 5) ## New: PS1 (">> "); else ## Old: PS1 = ">> "; endif 
  • For compatibility with Matlab, the output order of Octave's "system" function has changed from
          [output, status] = system (cmd); 

    to

          [status, output] = system (cmd); 
  • For compatibility with Matlab, normcdf, norminv, normpdf, and normrnd have been modified to compute distributions using the standard deviation instead of the variance.
  • For compatibility with Matlab, the output of Octave's fsolve function has been changed from
          [x, info, msg] = fsolve (...); 

    to

          [x, fval, info] = fsolve (...); 
  • For compatibility with Matlab, normcdf, norminv, normpdf, and normrnd have been modified to compute distributions using the standard deviation instead of the variance.
  • For compatibility with Matlab, gamcdf, gaminv, gampdf, gamrnd, expcdf, expinv, exppdf and exprnd have been modified to compute the distributions using the standard scale factor rather than one over the scale factor.
http://math-blog.com/wp-content/uploads/2007/06/scilab3d.png

Sottoscrivi il feed http://softwarehouse.nireblog.com/rss2/35682/index.xml

Create Social Bookmark Links

Add to Technorati Favorites

feedNuts Feed Profile

tutto blog

BlogItalia.it - La directory italiana dei blog

Feed XML offerto da BlogItalia.it

Sito preferito

Il Bloggatore

Italian Bloggers


Programming Blogs - Blog Catalog Blog Directory

web stats

AddThis Social Bookmark Button

free hit counter

Argentina in immagini


Social Bookmarking
Add to: Mr. Wong Add to: Webnews Add to: Icio Add to: Oneview Add to: Linkarena Add to: Favoriten Add to: Seekxl Add to: Kledy.de Add to: Social Bookmarking Tool Add to: BoniTrust Add to: Power Oldie Add to: Bookmarks.cc Add to: Favit Add to: Newskick Add to: Newsider Add to: Linksilo Add to: Readster Add to: Folkd Add to: Yigg Add to: Digg Add to: Del.icio.us Add to: Reddit Add to: Jumptags Add to: Upchuckr Add to: Simpy Add to: StumbleUpon Add to: Slashdot Add to: Netscape Add to: Furl Add to: Yahoo Add to: Spurl Add to: Google Add to: Blinklist Add to: Blogmarks Add to: Diigo Add to: Technorati Add to: Newsvine Add to: Blinkbits Add to: Ma.Gnolia Add to: Smarking Add to: Netvouz Information

Social Bookmarking

Blog360gradi - L’aggregatore di notizie a 360°

 provenienti dal mondo dei blog!