Linguaggio assembly: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Camillo (discussione | contributi)
Annullata la modifica 80463087 di 5.170.134.188 (discussione)
Abisys.bot (discussione | contributi)
m ., typos fixed: h ; → h; (2), h ; → h; (3)
Riga 18:
|sito_web =
}}
Il '''linguaggio assembly''' (da non confondersi con Assembler, che invece indica il programma assemblatore e '''non''' il linguaggio), detto anche '''linguaggio assemblativo''', è, tra i [[linguaggio di programmazione|linguaggi di programmazione]], quello più vicino al [[linguaggio macchina]] vero e proprio, pur essendo [[Linguaggio macchina#Assembly|differente]] rispetto a quest'ultimo. Erroneamente viene spesso chiamato "[[assembler]]", ma come già accennato quest'ultimo termine identifica solo il [[programma (informatica)|programma]] "assemblatore" che converte il linguaggio assembly in linguaggio macchina.
 
==Caratteristiche generali dell'assembly==
Riga 50:
 
* 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 1980|anni ottanta]], come i [[Commodore]] [[Vic-20]] e [[Commodore 64|C64]] 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 [[microcontrollore|microcontroller]] e [[Digital Signal Processor|DSP]], eventualmente anche sotto forma di ''core'' implementati tramite [[Application specific integrated circuit|ASIC]], [[CPLD]] ed [[Field programmable gate array|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 [[instruction set|ISA]] di tipo [[Reduced instruction set computer|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.
 
Riga 99 ⟶ 98:
END
</source>
 
 
 
Questo invece è l'esempio del programma scritto per sintassi AT&T (per le architetture [[UNIX]] [[GNU]])
<source lang="asm">
 
 
 
.section .data
Riga 163 ⟶ 158:
</source>
 
Su alcune architetture tali fasi risultano invece essere quattro (ad esempio, nei PIC Microchip, negli Intel 8051 e in numerosissimi core analoghi), da cui risulta anche l'effettivo rapporto tra velocità di clock ossia frequenza del quarzo esterno (es. 10 &nbsp;MHz) e numero di istruzioni effettivamente eseguite in un secondo. Per i PIC (famiglie ''baseline'' e ''midrange'' in particolare) tale rapporto è pari ad 1/4, poiché ad ogni ciclo di clock il core esegue effettivamente una singola fase Fetch-Decode-Execute-Write e dunque sono necessari quattro cicli del clock esterno per completare una singola istruzione. Su architetture di microcontroller e core più arcaiche o comunque di diversa concezione, sono necessari anche più cicli di clock per ciascuna fase (ad esempio tre o quattro), da cui il diverso rapporto tra clock e MIPS, che nel caso del design 8051 originale richiede ad esempio 12 cicli di clock per ciascuna singola istruzione.
Si ricordi infine che talune istruzioni, tra le quali tipicamente i salti incondizionati, richiedono su un numero notevole di piattaforme (sia RISC che CISC, concepite in varie epoche) un numero di cicli superiore alle altre, a causa delle operazioni accessorie (non parallelizzabili) richieste dall'aggiornamento del registro IP e di eventuali code di prefetch interne.
 
Riga 179 ⟶ 174:
/* Acquisizione del valore numerico */
printf("Inserisci un valore compreso tra -32768 e 32768: ");
scanf("%d", &a);
 
/* Visualizzazione del messaggio di risposta */