Introduzione al linguaggio assembly



Documenti analoghi
Introduzione al linguaggio assembly

ASSEMBLER 68K parte 1

Capitolo Quarto...2 Le direttive di assemblaggio di ASM Premessa Program Location Counter e direttiva ORG

Introduzione al linguaggio assembly MC68000

Corso di Calcolatori Elettronici I A.A Il processore Lezione 18

Corso di Informatica Applicata. Lezione 3. Università degli studi di Cassino

Il processore Motorola (MC68000)

MC68000: programmazione assembly

La Macchina Virtuale

AXO Achitettura dei Calcolatori e Sistema Operativo. Instruction Set Architecture (ISA) e 68000

Lezione 1: L architettura LC-3 Laboratorio di Elementi di Architettura e Sistemi Operativi 10 Marzo 2014

Pseudo-operatori. Lo pseudo-operatore ORG

Ing. Paolo Domenici PREFAZIONE

AXO Architettura dei Calcolatori e Sistema Operativo. processo di assemblaggio

Architettura di un calcolatore: introduzione

CPU. Maurizio Palesi

#define N = 5. / funzione funz / int funz (int a, int b) { return (a + r) b; } / fine funzione / programma in linguaggio C

Sistema operativo: Gestione della memoria

La macchina programmata Instruction Set Architecture (1)

Architettura (10/9/2003) Pag. 1/6. Cognome e Nome (in stampatello):

Architettura dei calcolatori e sistemi operativi. Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H

Laboratorio di Informatica

Tecniche di traduzione da C ad assembly Note generali

Corso di Informatica

Introduzione alla programmazione assembly

Architettura hardware

Il calcolatore elettronico. Parte dei lucidi sono stati gentilmente forniti dal Prof. Beraldi

FONDAMENTI di INFORMATICA L. Mezzalira

Rappresentazione dei numeri in un calcolatore

Il Processore: i registri

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

Architettura di un calcolatore: Introduzione parte 2

Assemblaggio per il processore Motorola 68000

INFORMATICA 1 L. Mezzalira

Architettura della CPU e linguaggio assembly Corso di Abilità Informatiche Laurea in Fisica. prof. ing. Corrado Santoro

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

Compilatore risorse display grafico LCD serie IEC-line

Lezione 16: L architettura LC-3

Il processore. Il processore. Il processore. Il processore. Architettura dell elaboratore

Architettura di un calcolatore: introduzione

Von Neumann. John Von Neumann ( )

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

CLASSE III A I.T.I. (ABACUS) SISTEMI DI ELABORAZIONE E TRASMISSIONE DEI DATI VERIFICA DI RECUPERO

Il simulatore SPIM SPIM

Introduzione alla programmazione in C

Quinto Homework. Indicare il tempo necessario all'esecuzione del programma in caso di avvio e ritiro fuori ordine.

Architettura degli elaboratori (A)

Architettura del calcolatore

CALCOLATORI ELETTRONICI II

introduzione I MICROCONTROLLORI

Lezione n.9. Introduzione al linguaggio macchina

L unità di controllo. Il processore: unità di controllo. Le macchine a stati finiti. Struttura della macchina a stati finiti

Sommario Introduzione al linguaggio Assembly. Calcolatori Elettronici Prof. Gian Luca Marcialis. Le operazioni fondamentali

AMBIENTE DI SIMULAZIONE ASIM

Alcuni programmi assembly MC68000

Architettura del Set di Istruzioni (ISA)

JPD132. Microprocessore e assembly

3. Programmazione strutturata (testo di riferimento: Bellini-Guidi)

Funzioni in C. Violetta Lonati

Il memory manager. Gestione della memoria centrale

CALCOLATORI ELETTRONICI

Fondamenti di Informatica PROBLEMI E ALGORITMI. Fondamenti di Informatica - D. Talia - UNICAL 1

CALCOLATORI ELETTRONICI A cura di Luca Orrù. Lezione n.7. Il moltiplicatore binario e il ciclo di base di una CPU

Hardware di un Computer

Nascita di Java. Che cos e Java? Caratteristiche di Java. Java: linguaggio a oggetti

Richiami di informatica e programmazione

Fondamenti di Informatica Ingegneria Clinica Lezione 19/10/2009. Prof. Raffaele Nicolussi

Laboratorio di Architettura degli Elaboratori

Java: Compilatore e Interprete

Istituto Universitario Navale Facoltà di Ingegneria Corso di Laurea in Ingegneria delle Telecomunicazioni

Parte II.2 Elaboratore

Sottosistema di Ingresso/Uscita (I/O)

Struttura del calcolatore

IL SISTEMA OPERATIVO IL SISTEMA OPERATIVO INTERFACCE TESTUALI INTERFACCE TESTUALI FUNZIONI DEL SISTEMA OPERATIVO INTERFACCE GRAFICHE

Appunti sulla Macchina di Turing. Macchina di Turing

Informazione analogica e digitale

La codifica delle informazioni

I sistemi di numerazione

Aritmetica dei Calcolatori 2

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Università degli Studi di Cassino Corso di Fondamenti di Informatica Codifica di dati e istruzioni. Anno Accademico 2010/2011 Francesco Tortorella

Introduzione a Dev-C++

MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c

Transcript:

Corso di Calcolatori Elettronici I A.A. 2011-2012 Introduzione al linguaggio assembly Lezione 20 Università degli Studi di Napoli Federico II Facoltà di Ingegneria

Il linguaggio Assembly È funzionalmente equivalente al linguaggio macchina, ma usa nomi più intuitivi (mnemonics) Definisce l Instruction Set Architecture (ISA) della macchina Un compilatore traduce un linguaggio di alto livello, che è indipendente dall architettura, in linguaggio assembly, che è dipendente dall architettura Un assemblatore traduce programmi in linguaggio assembly in codice binario eseguibile Nel caso di linguaggi compilati (es. C) il codice binario viene eseguito direttamente dalla macchina target Nel caso di linguaggi interpretati (es. Java) il bytecode viene interpretato dalla Java Virtual Machine, che in questo senso è al livello Assembly language

Ciclo di Sviluppo di un programma in C++ Programma sorgente (nome.cpp) Programma sorgente (nome.cpp) Editor Preprocessore Compilatore disco disco disco Programma sorgente (nome.obj) Librerie (object files) Collegatore disco disco Caricatore MEMORIA (RAM)

Fase 1 preparazione del testo origine il testo origine viene digitato mediante un editor e viene memorizzato in un file con estensione cpp

Fase 2 precompilazione il testo origine (sorgente) contenuto nel file.cpp viene elaborato da un programma detto preprocessore (o precompilatore) che sostanzialmente esegue l espansione del codice (inclusioni, macro, etc.)

Fase 3 compilazione delle unità le unità del programma vengono compilate mediante l attivazione del compilatore; il testo origine verrà trasformato in testo oggetto e memorizzato in un file con estensione.obj

Fase 4 collegamento (linkage) i diversi moduli oggetto costituenti il programma eseguibile vengono collazionati fra loro (p1.obj,, pn.obj) e con il supporto al tempo di esecuzione mediante un modulo collegatore (linker). Il tutto viene memorizzato in un file che costituisce il programma eseguibile (p.exe)

Linguaggi e dipendenza dalla piattaforma di esecuzione Codice C++ Compilatore C++ i386 Win OS Compilatore C++ PowerPC MacOS Codice Binario Pentium Win OS Codice Binario PowerPC MacOS Compilatore C++ SPARC Solaris OS Codice Binario SPARC Solaris OS

Ciclo di sviluppo/esecuzione per programmi in linguaggio di alto livello Digitazione dei sorgenti Editor Compilatore Moduli oggetto Programma sorgente Programma in linguaggio macchina in RAM Linker statico Debugger Macchina target Loader / Linker dinamico Programma eseguibile

Ciclo di sviluppo/esecuzione per programmi in linguaggio assembly Digitazione dei sorgenti Editor Assemblatore Moduli oggetto Programma sorgente Programma in linguaggio macchina in RAM Linker statico Debugger Macchina target Loader / Linker dinamico Programma eseguibile

Ciclo di sviluppo semplificato di programmi assembly MC68000 nel sistema didattico ASIM Digitazione del programma Editor Assembler ASIMTOOL Programma sorgente.a68 Moduli oggetto e file list Macchina target Loader ASIM

Assembly: formato del codice sorgente Una linea di codice sorgente Assembly è costituita da quattro campi: LABEL Ø Stringa alfanumerica Ø Definisce un nome simbolico per il corrispondente indirizzo OPCODE Ø Codice mnemonico o pseudo-operatore Ø Determina la generazione di un istruzione in linguaggio macchina o la modifica del valore corrente del Program Location Counter OPERANDS Ø Oggetti dell azione specificata dall OPCODE Ø Variano a seconda dell OPCODE e del modo di indirizzamento COMMENTS Ø Testo arbitrario inserito dal programmatore

Assembly: caratteristiche generali Di regola, una linea di codice assembly corrisponde ad una istruzione l/m Eccezioni: Macro: 1 linea assembler n istruzioni l/m Pseudo istruzioni: 1 linea assembler 0 istr. l/m Variabili interamente gestite dal programmatore Allocazione: memoria o registri CPU No dichiarazione

Esempio Assembly X86 a 32 bit DES_std_crypt: movl 4(%esp),%edx pushl %ebx movl DES_count,%ecx xorl %ebx,%ebx movq (%edx),k1 movq 32(%edx),K2 movq K1,tmp1 movq 8(%edx),K3 movq 16(%edx),K4 DES_copy(24, 40) DES_copy(112, 120) movq DES_IV,R xorl %edx,%edx movq DES_IV+8,L DES_loop:

Esempio Assembly Alpha DES_std_crypt: ldgp $29,0($27) DES_std_crypt..ng: subq $30,56,$30 lda tmp1,des_iv lda tmp2,des_count lda SPE,DES_SPE_F ldq R,0(tmp1) ldq L,8(tmp1) ldq count,0(tmp2) ldq K1,0(kp) ldq K2,8(kp) ldq K3,16(kp) ldq K4,24(kp) xor K1,R,D ldq K5,32(kp) ldq K6,40(kp) ldq K7,48(kp) ldq K8,56(kp) stq K9,0($30) stq K10,8($30) stq K11,16($30) stq K12,24($30) stq K13,32($30) stq K14,40($30) stq K15,48($30) ldq K9,64(kp) ldq K10,72(kp) ldq K11,80(kp) ldq K12,88(kp) ldq K13,96(kp) ldq K14,104(kp) ldq K15,112(kp) ldq K16,120(kp) DES_loop: DES_2_ROUNDS(K2, K3)

Esempio Assembly SPARC DES_std_crypt: save %sp,-120,%sp st %i7,[%fp-24] sethi %hi(des_spe_l),spe_l_0 sethi %hi(des_spe_l+0x400),spe_l_4 add SPE_L_0,0x808,SPE_H_0 ldd [kp],dl ldd [SPE_L_4+0xC08],Rl ld [SPE_L_4+0xC18],count DES_loop: DES_2_ROUNDS(kp) std Rl,[out] std Ll,[out+8] ret restore

Linguaggi Assembly Per una data macchina, esiste sempre almeno il linguaggio assembly definito dal costruttore In aggiunta, possono esistere linguaggi assembly forniti da terze parti Quando si definisce un linguaggio assembly Si ha libertà di scelta per quanto riguarda: Gli mnemonics Il formato delle linee del sorgente I formati per specificare modi di indirizzamento, varianti delle istruzioni, costanti, label, pseudo-operatori, etc. Non si ha libertà di scelta per quanto riguarda: L effetto finale di ogni singola istruzione macchina

Convenzioni Gli spazi bianchi tra i diversi campi fungono esclusivamente da separatori (vengono ignorati dall assemblatore) Una linea che inizi con un asterisco (*) è una linea di commento Nelle espressioni assembly, gli argomenti di tipo numerico si intendono espressi In notazione decimale, se non diversamente specificato In notazione esadecimale, se preceduti dal simbolo $ Nell indicazione degli operandi, il simbolo # denota un indirizzamento immediato

Program Location Counter PLC Ø E una variabile interna dell assemblatore Ø Punta alla locazione di memoria in cui andrà caricata a run time l istruzione assemblata Ø Viene inizializzato dallo pseudo-operatore origin (ORG) Ø Durante il processo di assemblaggio, il suo valore è aggiornato sia in funzione degli operatori, sia in funzione degli pseudo-operatori Ø E possibile, all interno di un programma, fare riferimento al suo valore corrente, mediante il simbolo *

AsimTool

AsimTool: esempio di file list PLC contenuto label opcode operands comments 00000000 1 * Somma i primi 17 interi 00000000 2 * 00008000 3 ORG $8000 00008000 4279 00008032 4 START CLR.W SUM 00008006 3039 00008034 5 MOVE.W ICNT,D0 0000800C 33C0 00008030 6 ALOOP MOVE.W D0,CNT 00008012 D079 00008032 7 ADD.W SUM,D0 00008018 33C0 00008032 8 MOVE.W D0,SUM 0000801E 3039 00008030 9 MOVE.W CNT,D0 00008024 0640 FFFF 10 ADD.W #-1,D0 00008028 66E2 11 BNE ALOOP 0000802A 4EF9 00008008 12 JMP SYSA 00008030 =00008008 13 SYSA EQU $8008 00008030 14 CNT DS.W 1 00008032 15 SUM DS.W 1 00008034 =00000011 16 IVAL EQU 17 00008034 0011 17 ICNT DC.W IVAL Symbol Table ALOOP 800C CNT 8030 IVAL 0011 START 8000 SUM 8032 ICNT 8034

ASIM: programma caricato in memoria

Pseudo-operatori NON sono istruzioni eseguite dal processore sono direttive che regolano il processo di traduzione del programma assembler in programma eseguibile Lo pseudo-operatore ORG Viene usato per inizializzare il Program Location Counter (PLC), ovvero per indicare a quale indirizzo sarà posta la successiva sezione di codice o dati Esempio: ORG $8100 Lo pseudo-operatore END Viene usato per terminare il processo di assemblaggio ed impostare l entry point (prima istruzione da eseguire) nel programma Esempio: END TARGETLAB

Pseudo-operatori Lo pseudo-operatore DS Viene usato per incrementare il Program Location Counter (PLC), in modo da riservare spazio di memoria per una variabile Esempio: LABEL DS.W NUMSKIPS Lo pseudo-operatore DC Viene usato per inizializzare il valore di una variabile Esempio: LABEL DC.W VALUE Lo pseudo-operatore EQU Viene usato per definire una costante usata nel sorgente assembler Esempio: LABEL EQU VALUE

Etichette (label) Sono stringhe di testo arbitrarie (opzionali) anteposte ad una istruzione o ad un dato all interno del programma assembler Servono a riferirsi al particolare indirizzo che contiene quella istruzione o dato usati per gestire i salti usati per gestire variabili (manipolate nel programma assembler attraverso le loro etichette in maniera simile alle variabili di un linguaggio di programmazione di alto livello) Ad esempio: ALOOP è un etichetta usata per riferisti all istruzione MOVE, SUM è una etichetta usata per gestire una variabile, mentre IVAL è una costante ALOOP MOVE.W D0,CNT ADD.W SUM,D0 SUM DS.W 1 IVAL EQU 17

Processori a carattere e processori a parola I processori a carattere accedono alla memoria con parallelismo 1 byte (8 bit) prime CPU ad accumulatore I processori a parola hanno la capacità di indirizzare ed accedere la memoria per unità (parole o word) di 16 bit, 32 bit o 64 bit In questi sistemi (tranne pochissime eccezioni nel passato) l unità indirizzabile di memoria (locazione) è ancora il byte Si parla di sistemi a memoria byte-addressable: ogni byte ha il suo indirizzo Terminologia Motorola 68000: word = 2 byte, longword = 4 byte

Big-endian e little-endian I processori a parola possono disporre in memoria i byte che formano una parola in due modi Big-endian: i byte sono disposti in memoria in modo che il più significativo MSB occupi la locazione di memoria di indirizzo minore, e poi via via gli altri, fino a quello meno significativo LSB che è collocato nella locazione di indirizzo maggiore Little-endian: disposizione opposta Il processore Motorola 68000 usa la convenzione Big Endian Disposizione BIG_ENDIAN Byte3 Byte2 Byte1 Byte0 Indirizzi crescenti Disposizione LITTLE ENDIAN Byte0 Byte1 Byte2 Byte3 Indirizzi crescenti MSB LSB LSB MSB

Big-endian e little-endian: un esempio Immaginiamo di avere un processore a parola, con parole di 32 bit (4 byte) e voler scrivere in memoria il valore intero (esadecimale) $12FA34ED all indrizzo 812 Le figure sottostanti illustrano il contenuto della memoria nei due casi big-endian e little-endian 12 FA 34 ED indirizzo big-endian ED 34 FA 12 indirizzo little-endian

Memoria: parole allineate e non allineate Per un processore a parola di 16 bit o 32 bit, una parola che inizia ad un indirizzo pari si dice allineata sul limite di parola Tipicamente, un processore è in grado di accedere ai due byte che costituiscono una parola allineata mediante una sola operazione di lettura Il processore Intel 8086 consente l accesso a parole non allineate, cioè parole che iniziano ad un indirizzo dispari, ma in tal caso sono necessari 2 distinti accessi in memoria Il 68000 NON consente l accesso a parole non allineate Indirizzo i Indirizzo i+2 i i+1 i+2 i+3 i+1 i+2 (i pari) La parola di 16 bit formata dai due byte ombreggiati non è allineata sul limite di parola (indirizzo multiplo di 2)

Esempio - Moltiplicazione 2 interi * Programma per moltiplicare MCND e MPY * ORG $8000 * MULT CLR.W D0 D0 accumula il risultato MOVE.W MPY,D1 D1 e' il contatatore di ciclo BEQ DONE Se il contatore e' zero e' finito LOOP ADD.W MCND,D0 Aggiunge MCND al prodotto parziale ADD.W #-1,D1 Decrementa il contatore BNE LOOP e ripete il giro DONE MOVE.W D0,PROD Salva il risultato STOP #$2700 Arresta esecuzione programma ORG $8200 PROD DS.W 1 Riserva spazio di memoria per PROD MPY DC.W 3 Definisce il valore di MPY MCND DC.W 4 Definisce il valore di MCND END MULT Fine ass., salto a entry point

Analisi del file LIS PLC contenuto label opcode operandi 00000000 1 * Programma per moltiplicare MCND e MPY 00000000 2 * 00008000 3 ORG $8000 00008000 4 * 00008000 4240 5 MULT CLR.W D0 00008002 3239 00008202 6 MOVE.W MPY,D1 00008008 6700 000E 7 BEQ DONE 0000800C D079 00008204 8 LOOP ADD.W MCND,D0 00008012 0641 FFFF 9 ADD.W #-1,D1 00008016 66F4 10 BNE LOOP 00008018 33C0 00008200 11 DONE MOVE.W D0,PROD 0000801E 4E72 2700 12 STOP #$2700 00008200 13 ORG $8200 00008200 14 PROD DS.W 1 00008202 0003 15 MPY DC.W 3 00008204 0004 16 MCND DC.W 4 00008206 17 END MULT Symbol Table MULT $8000 MPY $8202 DONE $8018 LOOP $800C MCND $8204 PROD $8200

Esercitazione Provare il programma mult2ints.a68 che moltiplica due interi attraverso un ciclo di addizioni ripetute Eseguire il programma sul simulatore ASIM e sperimentare: L effetto di DC e la convenzione big-endian del processore 68000 L effetto dell istruzione CLR.W su registro di 32 bit L effetto dell istruzione MOVE da memoria a registro L effetto dell istruzione BEQ sul PC L effetto dell istruzione ADD tra memoria e registro L effetto dell istruzione ADD tra immediato e registro L effetto dell istruzione BNE sul PC L effetto dell istruzione JMP sul PC L effetto dell istruzione MOVE da registro a memoria Confrontare la codifica in l/m delle istruzioni di salto

Esercitazione Nell esempio precedente, effettuare le seguenti sostituzioni ed osservarne gli effetti DONE MOVE.W D0,PROD Salva il risultato PROD DS.W 1 Riserva spazio di memoria per PROD DONE MOVE.L D0,PROD Salva il risultato PROD DS.L 1 Riserva spazio di memoria per PROD L= long (32 bit) W= word (16 bit) B= byte (8 bit)