Cenni ad Assembly Intel



Documenti analoghi
L Assembler Istruzioni Aritmetiche. M. Rebaudengo - M. Sonza Reorda. Politecnico di Torino Dip. di Automatica e Informatica

Istruzioni di modifica della sequenza di elaborazione

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

La microarchitettura. Didattica della strumentazione digitale e sistemi a microprocessore anno accademico pagina 1

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

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

Esempio di moltiplicazione come somma e spostamento

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

Calcolatori Elettronici

CPU. Maurizio Palesi

Architettura del Set di Istruzioni (ISA)

Architettura degli elaboratori (A)

Il microprocessore 8086

Von Neumann. John Von Neumann ( )

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

I.T.I. A. RIGHI e VIII Napoli Specializzazione Informatica Tradizionale Corso D Materia: Sistemi. Elementi di Assembly 8086

Architettura del calcolatore

Introduzione alla programmazione in C

Tutta la famiglia dei processori Intel (x86) si basa ed e' compatibile con il primo processore di questo tipo: l'8086.

La macchina programmata Instruction Set Architecture (1)

Architettura hardware

MIPS Instruction Set 2

Programmazione in linguaggio assembly per architetture Intel 8088

Il livello architettura e set di istruzioni

Assembly. Modello x86

Aritmetica dei Calcolatori 2

1.1.1 Esercizio conta le occorrenze di un carattere in una stringa

ARCHITETTURE MICROPROGRAMMATE. 1. Necessità di un architettura microprogrammata 1. Cos è un architettura microprogrammata? 4

Ing. Paolo Domenici PREFAZIONE

Cenni ad Assembly ARM

Programmazione dello Z80

Hardware di un Computer

ToolChain: Come Generare Applicazioni in Linguaggio Macchina

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

Il simulatore SPIM SPIM

MODELLO DLX IN UNISIM

Testi di Esercizi e Quesiti 1

ASSEMBLER 68K parte 2

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

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Prelievo di un istruzione. Istruzioni macchina. Tipi di istruzioni. Registri principali della CPU e loro ruolo

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

Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014

Calcolatori Elettronici Parte X: l'assemblatore as88

Architettura di tipo registro-registro (load/store)

Il linguaggio Assembly della CPU Il linguaggio Macchina

L insieme delle istruzioni (6)

AMBIENTE DI SIMULAZIONE ASIM

Processore Danilo Dessì. Architettura degli Elaboratori.

4. Operazioni aritmetiche con i numeri binari

Variabili e tipi di dato

Lezione n.19 Processori RISC e CISC

Arduino: Programmazione

Lezione n.9. Introduzione al linguaggio macchina

Comparatori. Comparatori di uguaglianza

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Calcolatori Elettronici Parte VII: il Livello delle Istruzioni Macchina

Introduzione all'architettura dei Calcolatori

Hazard sul controllo. Sommario

Istruzioni di trasferimento dati

Lezione 3: Architettura del calcolatore

RETI E SOTTORETI. Copyright 2010 Marco Salatin Pagina 1

Lezione 16: L architettura LC-3

Linguaggio macchina e linguaggio assembler

PROVA INTRACORSO TRACCIA A Pagina 1 di 6

GESTIONE INFORMATICA DEI DATI AZIENDALI

Il Processore: i registri

Architettura degli Elaboratori

STACK, istruzioni PUSH e POP; PROCEDURE, istruzioni CALL e RET

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

L architettura del calcolatore (Prima parte)

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

Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori

JPD132. Microprocessore e assembly

Elementi di Informatica e Programmazione. # Memoria di massa. Problema: comprare un PC. Architettura del calcolatore. Architettura di Von Neumann

ESERCIZIO 1 1. Traccia 1. Analisi 2. Codifica programma 7. frame nel seguente modo: il primo byte dice la lunghezza complessiva del frame,

L archiviazione della posta elettronica può aiutarci a recuperare spazio senza costringerci a cestinare documenti importanti

Compilatore risorse display grafico LCD serie IEC-line

I Thread. I Thread. I due processi dovrebbero lavorare sullo stesso testo

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

CALCOLATORI ELETTRONICI II

Esercizi. Assembly. Alessandro A. Nacci ACSO 2014/2014

ARCHITETTURA DELLE CPU come ARCHITETTURA DEL SET DI ISTRUZIONI

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

Transcript:

Cenni ad Assembly Intel Luca Abeni April 17, 2015

Architerrura Intel Utilizzata sulla maggior parte dei laptop, desktop e server moderni Lunga storia Dagli anni 70 (Intel 8080-8 bit!)......fino ad oggi (Intel Core i7 e simili, 64 bit!) E la storia ha dei retaggi Evoluzione lenta ma costante, guardando al passato... Moderne CPU a 64 bit sono ancora in grado di eseguire vecchio codice ad 8 bit (MSDOS, anyone?)! Immaginate complicazioni e complessità che questo comporta... Architettura CISC (Complex Instruction Set Computer), contrapposta a RISC (Reduced Instruction Set Computer) di MIPS Calcolatori Luca Abeni 2 / 19

Assembly Intel CISC gran numero di istruzioni e modalità di indirizzamento Non vedremo tutto in modo esaustivo (ottimi tutorial online) Ci focalizzeremo su differenze rispetto a MIPS Compatibilità varie modalità di funzionamento Considereremo solo modalità a 64 bit e relativa API Vari Assembler con sintassi differenti Considereremo GNU Assembler (gas) Calcolatori Luca Abeni 3 / 19

Registri General Purpose 16 registri a 64 bit (più o meno) general purpose Strani nomi... rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp r8,... r15 Nota: rsp stack pointer; rbp base pointer (puntatore a stack frame) rax... rbp estendono registri a 32 bit (eax... ebp......che a loro volta estendono registri a 16 bit (ax... bp)...che possono essere composti da 2 registri a 8 bit (ax == ah + al) Semplice, no? Meraviglie della compatibilità! Calcolatori Luca Abeni 4 / 19

Registri Speciali Instruction Pointer visibile : rip Flags register: rflags (estende eflags, che estenfe flags) Set di flag settati da istruzioni logico aritmetiche (CF, ZF, SF, OF,...) Usati da istruzioni di salto condizionale Altri flag controllano il funzionamento della CPU (IF) o contengono altre informazioni sulla CPU Equivalente a Program Status Word (PSW) di altre CPU Altri registri speciali non sono interessanti per noi ora Calcolatori Luca Abeni 5 / 19

Convenzioni di Chiamata Non fanno propriamente parte dell architettura Data una CPU / architettura, si possono usare molte diverse convenzioni di chiamata Servono per mettere d accordo diversi compilatori / librerie ed altre parti del Sistema Operativo Tecnicamente, sono specificate dall ABI, non dall ISA!!! Come / dove passare i parametri Stack o registri? Quali registri preservare? Quando un programma invoca una subroutine, quali registri può aspettarsi che contengano sempre lo stesso valore al ritorno? Calcolatori Luca Abeni 6 / 19

Convenzioni di Chiamata Primi 6 argomenti: %rdi, %rsi, %rdx, %rcx, %r8 ed %r9 Altri argomenti (7 n): sullo stack Registri preservati: %rbp, %rbx, %r12, %r13, %r14 ed %r15 Valori di ritorno: %rax e %rdx Calcolatori Luca Abeni 7 / 19

Modalità di Indirizzamento - 1 Istruzioni prevalentemente a 2 operandi Sorgente e destinazione Operando Immediato Operando in Registro Operando in Memoria Possibili operazioni fra registri e memoria! MIPS: accesso a memoria solo per load e store Vincolo: no entrambi gli operandi in memoria Calcolatori Luca Abeni 8 / 19

Modalità di Indirizzamento - 2 Operandi in memoria: varie modalità di indirizzamento Semplificando un po : accesso indiretto Accesso a locazione di memoria Indirizzo i = <displacement> + <base> + <indice> * <scala> <displacement>: costante (valore immediato) a 8, 16 o 32 bit (simile a MIPS) <base>: valore in registro (come per MIPS) <indice>: valore in registro (semplifica iterazione su array) <scala>: valore costante: 1, 2, 4 o 8 (semplifica accesso ad array con elementi di dimensione 1, 2, 4 o 8 byte) Sintassi:<displ>(<base reg>,<index reg>, <scale>) Calcolatori Luca Abeni 9 / 19

Indirizzamento - Casi Speciali Scala = 1 (no scale): <displ>(<base reg>,<index reg>) Niente scala e indice: <displ>(<base reg>) Ricorda qualcosa? Unica differenza con MIPS: la dimensione in bit dell offset/displacement Niente scala, indice e displacement (displacement = 0): (<base reg>) Niente displacement (displacement = 0): (<base reg>,<index reg>, <scale>)... Calcolatori Luca Abeni 10 / 19

Istruzioni Intel Troppe per vederle tutte Ancora, buoni tutorial online Per una lista più o meno dettagliata delle istruzioni, vedere http://en.wikipedia.org/wiki/x86_instruction_listings Molte istruzioni non proprio utili mantenute per compatibilità! In genere, sintassi <opcode> <source>, <destination> Carattere finale di opcode (b, w, l, d) per indicare larghezza (in bit) degli operandi Nomi registri iniziano con %, valori immediati (costanti) iniziano con $ Calcolatori Luca Abeni 11 / 19

Istruzioni Più Comuni - 1 mov push / pop: inserisce / rimuove dati da stack add / adc (add with carry) sub / sbc (sub with carry) mul / imul: signed / unsigned multiplication div / idiv: signed / unsigned division inc / dec: somma / sottrae 1 and / or / xor / not: operazioni booleane bit a bit Istruzioni aritmetico / logiche modificano flag (carry, zero, sign,...) Altre istruzioni per modificare flag: clc / stc, cld, cmc... Calcolatori Luca Abeni 12 / 19

Istruzioni Più Comuni - 2 rcl, rcr, rol, ror: varie forme di rotate sal, sar, shl, shr: shift (aritmetico e logico) jmp je / jnz / jc / jnc: salti condizionati neg La condizione di salto è stabilita in base al valore dei flag nel flag register (jump if equal, jump if not zero, jump if carry,...) In generale, j<condition> cmp: setta flags come sub, ma senza risultato! Da usarsi prima di salti condizionali call / ret: indirizzo di ritorno sullo stack nop Calcolatori Luca Abeni 13 / 19

Esempio Stringa C: array di caratteri terminato da 0 ASCII: caratteri codificati su byte Copia di una stringa: void c o p i a s t r i n g a ( char d, const char s ) { i n t i = 0; } while ( ( d [ i ] = s [ i ] )!= 0) { i += 1; } Esempio già visto per Assembly MIPS... Come fare con Assembly Intel (64 bit)? Calcolatori Luca Abeni 14 / 19

Accesso a Singoli Byte Ricordate? Necessità di copiare byte, non parole... Intel fornisce soluzione semplice (ed elegante? Dipende dai punti di vista!) I registri rax... rdx sono composti da sottoregistri In particolare, al... dl: registri a 8 bit Operazioni mov da e a memoria possono lavorare su dati di diversa ampiezza (8, 16, 32 e 64 bit) Istruzione movb: da memoria a al.. dl o viceversa Non c è bisogno di una istruzione diversa come per MIPS, è sempre la stessa mov che lavora su parti diverse del registro Calcolatori Luca Abeni 15 / 19

Implementazione Assembly: Prologo I due parametri d ed s sono contenuti in %rdi e %rsi Supponiamo di usare %rax per il contatore i Non è un registro preservato... Non è necessario salvarlo sullo stack Non è necessario alcun prologo; possiamo cominciare col codice C Iniziamo: i = 0; %rax = 0 movq $0, %rax Calcolatori Luca Abeni 16 / 19

Implementazione Assembly: Loop Ciclo while: copia s[i] in d[i] Prima di tutto, carichiamolo in %bl Per fare questo, possiamo sfruttare la modalità di indirizzamento indiretta (base + indice * scala, con scala = 1) Nessuna necessità di caricare l indirizzo dell i-esimo elemento in un registro, come si faceva per MIPS L1 : movb (% r s i, %rax ), %b l # I n i z i o Loop Ora memoriazziamo %bl in d[i] movb %bl, (% r d i, %rax ) Calcolatori Luca Abeni 17 / 19

Implementazione Assembly: Fine del Loop Bisogna ora controllare se s[i] == 0 Se si, fine del loop! cmpb $0, %b l # confronta %b l con 0... je L2 # se sono uguali, s a l t a a L2 # ( esci dal loop! ) Se no, incrementa i (che sta in %rax) e cicla... add $1, %rax jmp L1 # L1 : l a b e l d i i n i z i o loop La label L2 implementerà il ritorno al chiamante Calcolatori Luca Abeni 18 / 19

Implementazione Assembly: Fine Non abbiamo salvato nulla sullo stack: non c è necessità di epilogo! Si può direttamente tornare al chiamante L2 : r e t Mettendo tutto assieme:. t e x t. g l o b l c o p i a s t r i n g a c o p i a s t r i n g a : movq $0, %rax L1 : movb (% r s i, %rax ), %b l movb %bl, (% r d i, %rax ) cmpb $0, %b l je L2 add $1, %rax jmp L1 L2 : r e t Calcolatori Luca Abeni 19 / 19