DIS - Dipartimento di Informatica e Sistemistica Calcolatori Elettronici II Programmazione C/Assembler per i processori ARM Prof. A. Mazzeo Dipartimento.

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

Linux examples of Buffer overflow attacks
Introduzione al linguaggio C
Programmazione assembler
Classe III A A.s – 2011 Sistemi di Elaborazione e Trasmissione dell’Informazione 4 ore settimanali (2 laboratorio) Docenti Prof. Alberto Ferrari.
Procedure In assembler.
Organizzazione della memoria
Università degli Studi di Napoli Federico II Facoltà di Ingegneria Dipartimento di Informatica e Sistemistica Corso di Sistemi ad elevate prestazioni –
PUNTATORI Introduzione
Marco Barisione Estendere Python in C.
Generazione di Codice Intermedio
Massa Laura Mela Enrica
1 Classi di memorizzazione. 2 Definiscono le regole di visibilità delle variabili e delle funzioni quando il programma è diviso su più file Stabiliscono.
Gestione della Memoria
Chiamate a Procedure. Per lesecuzione di una procedura, un programma deve eseguire i seguenti sei passi: mettere i parametri in un posto dove la procedura.
Programmazione Procedurale in Linguaggio C++
Indirizzi delle variabili A ogni variabile sono associati tre concetti fondamentali: il valore memorizzato; il tipo dati di appartenenza; lindirizzo. Il.
Caratteri e stringhe di caratteri
Laboratorio di informatica: ASSEMBLER
Università degli Studi di Roma La Sapienza Architettura degli elaboratori II Funzioni.
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 21 Marzo 2013.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Stringhe e Puntatori Marco D. Santambrogio – Ver. aggiornata al 18 Marzo 2013.
Corso di Informatica (Programmazione)
eliana minicozzi linguaggi1a.a lezione2
CALCOLATORI ELETTRONICI Gestione delle subroutine.
Gestione delle subroutine
1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.
nome: sequenza di caratteri usata per denotare un oggetto
memoria gestita staticamente:
Università di Trieste Calcolatori Elettronici a.a Omero TuzziL01, Basi 1 Sommario: 1. Concetto di bit. 2. Indirizzi di memoria. 3. Ordinamento.
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Fondamenti di Informatica1 Ripetizioni di segmenti di codice Spesso è necessario ripetere più volte uno stesso segmento dell'algoritmo (e.g. I/O, elaborazioni.
Le funzioni.
Programmazione Avanzata
Gestione della memoria logica e fisica degli elaboratori x86
Architettura degli Elaboratori II (canale P-Z) Linguaggi e moduli
Introduzione al linguaggio assembly del microprocessore a parte
Introduzione al linguaggio assemby del microprocessore a parte
I vettore interruzioni
Architettura del calcolatore
Prof.ssa Chiara Petrioli -- Fondamenti di programmazione, a.a. 2009/2010 Corso di Fondamenti di programmazione a.a. 2009/2010 Prof.ssa Chiara Petrioli.
INTERFACCIAMENTO ASSEMBLY - C++
Unità Didattica 3 Linguaggio C
Introduzione al linguaggio assembly del microprocessore a parte
BIOINFO3 - Lezione 331 SUBROUTINE IN PERL Una subroutine (funzione, metodo, procedura o sottoprogramma), e` una prozione di codice all`interno di un programma.

Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
Il linguaggio Fortran 90: 3. Procedure e Funzioni
Calcolatori Elettronici Assemblatore, Linker e Loader
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2006/2007 Corso di Programmazione 1 a.a.2006/2007 Prof.ssa Chiara Petrioli Corso di Laurea.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 11 Ottobre 2014.
1 M. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Rebaudengo - M. Sonza Reorda L’Assembler 8086 Procedure e Macro.
1 M. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Rebaudengo - M. Sonza Reorda L’Assembler 8086 Istruzioni per.
Fondamenti di Informatica II Ingegneria Informatica (A-I) Prof. M.T. PAZIENZA a.a – 3° ciclo.
Programmazione Assembly
Corso di Laurea in Informatica Architettura degli elaboratori a.a La macchina programmata Instruction Set Architecture (2) Istruzioni I-type Indirizzamento.
Gestione dei dispositivi di I/O:
1 M. Rebaudengo, M. Sonza Reorda Politecnico di Torino Dip. di Automatica e Informatica M. Rebaudengo - M. Sonza Reorda L’Assembler 8086 Istruzioni per.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
L’esecuzione dei programmi
Esercizio 14 – chiamata di una procedura Il codice deve: Passare due parametri alla procedura ‘salva’ Questa procedura deve salvare i due parametri nel.
Fondamenti di Informatica1 Linguaggi Diversi tipi di linguaggi: –Imperativi –Funzionali –Dichiarativi Tutti basati sulla traduzione nell'unico linguaggio.
Esercizi.
1 System Call ancora Vediamo passo passo come funziona una SC.
Corso di Laurea in Informatica Architettura degli elaboratori a.a Programmazione Assembly: procedure (1) Supporto hardware alle procedure Passaggio.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Puntatori Marco D. Santambrogio – Ver. aggiornata al 8 Aprile 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 14 Marzo 204.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Array e “stringhe” Marco D. Santambrogio – Ver. aggiornata al 28 Ottobre 2014.
Corso di Laurea in Informatica Architettura degli elaboratori a.a Programmazione Assembly: procedure (2) Convenzioni di uso dei registri Utilizzo.
Transcript della presentazione:

DIS - Dipartimento di Informatica e Sistemistica Calcolatori Elettronici II Programmazione C/Assembler per i processori ARM Prof. A. Mazzeo Dipartimento di Informatica e Sistemistica Università Degli Studi di Napoli Federico II

DIS - Dipartimento di Informatica e Sistemistica Programmazione mista C/Assembly l Le routines che effettuato chiamate ad altri moduli devono rispettare convenzioni comuni per i parametri passati e ricevuti l Per il processore ARM queste convenzioni sono espresse dallARM Procedure Call Standard (APCS)

DIS - Dipartimento di Informatica e Sistemistica Lo standard APC l APCS è un insieme di regole per la chiamata di funzioni in segmenti di codici compilati o assemblati separatamente l Definisce: »I vincoli nelluso dei registri »Convenzioni per lo stack »Il formato di uno stack backtrace data structure »Il supporto ai meccanismi di condivisione delle librerie di ARM l Esistono diverse versioni di APCS, non compatibili tra loro, fra cui il programmatore deve scegliere

DIS - Dipartimento di Informatica e Sistemistica Chiamata di una routine ASSEMBLY da C l La routine assembly invocata nel programma C deve essere esportata AREA |mul64$$code|, CODE, READONLY EXPORT mul64 mul64 MOV ip, a1, LSR #16 ;ip = a_hi MOV a4, a2, LSR #16 ;a4 = b_hi l Il programma C deve dichiarare che utilizzerà una funzione implementata esternamente extern int64 mul64(unsigned a, unsigned b);

DIS - Dipartimento di Informatica e Sistemistica Chiamata di una routine ASSEMBLY da C l La routine assembly invocata nel programma C deve essere esportata AREA |mul64$$code|, CODE, READONLY EXPORT mul64 mul64 MOV ip, a1, LSR #16 ;ip = a_hi MOV a4, a2, LSR #16 ;a4 = b_hi l Il programma C deve dichiarare che utilizzerà una funzione implementata esternamente extern int64 mul64(unsigned a, unsigned b); Esporta il simbolo per renderlo visibile allesterno Esporta il simbolo per renderlo visibile allesterno ip <-parte alta di a a4 <-parte alta di b ip <-parte alta di a a4 <-parte alta di b

DIS - Dipartimento di Informatica e Sistemistica Uso e denominazione dei registri l Tutti i registri che non sono utilizzati nel ruolo per essi definito dallAPCS possono essere usati come registri generali

DIS - Dipartimento di Informatica e Sistemistica Perché programmare in Assembly 1/5 l Realizzare la somma tra due interi a 64 bit l Un programma C che realizzi una tale operazione non ha accesso al flag di carry dello Status Register l Il programma C a tale scopo realizzato (ARM_home\examples\candasm\ADD64_1.C) potrebbe essere: void add_64(int64 *dest, int64 *src1, int64 *src2) { unsigned hibit1=src1->lo >> 31, hibit2=src2->lo >> 31, hibit3; dest->lo=src1->lo + src2->lo; hibit3=dest->lo >> 31; dest->hi=src1->hi + src2->hi + ((hibit1 & hibit2) || (hibit1!= hibit3)); return; }

DIS - Dipartimento di Informatica e Sistemistica Perché programmare in Assembly 2/5 l Compilare il file add64_1.c armcc –apcs 3/32bit –S add64_1.c »Il flag –apcs 3/32bit forza lutilizzo dellAPCS 3 nella versione a 32 bit »Visualizzare il file add64_1.s contenente il codice assembly generato

DIS - Dipartimento di Informatica e Sistemistica Perché programmare in Assembly 3/5 AREA |C$$code|, CODE, READONLY |x$codeseg| DATA add_64 STMDB sp!,{v1,lr} LDR v1,[a2,#0] MOV a4,v1,LSR #31 LDR ip,[a3,#0] MOV lr,ip,LSR #31 ADD ip,v1,ip STR ip,[a1,#0] MOV ip,ip,LSR #31 LDR a2,[a2,#4] LDR a3,[a3,#4] ADD a2,a2,a3 TST a4,lr TEQEQ a4,ip MOVNE a3,#1 MOVEQ a3,#0 ADD a2,a2,a3 STR a2,[a1,#4]! LDMIA sp!,{v1,pc} AREA |C$$data|,DATA |x$dataseg| EXPORT add_64 END È immediato verificare che il codice ottenuto non risulta essere efficiente

DIS - Dipartimento di Informatica e Sistemistica Perché programmare in Assembly 3/5 AREA |C$$code|, CODE, READONLY |x$codeseg| DATA add_64 STMDB sp!,{v1,lr} LDR v1,[a2,#0] MOV a4,v1,LSR #31 LDR ip,[a3,#0] MOV lr,ip,LSR #31 ADD ip,v1,ip STR ip,[a1,#0] MOV ip,ip,LSR #31 LDR a2,[a2,#4] LDR a3,[a3,#4] ADD a2,a2,a3 TST a4,lr TEQEQ a4,ip MOVNE a3,#1 MOVEQ a3,#0 ADD a2,a2,a3 STR a2,[a1,#4]! LDMIA sp!,{v1,pc} AREA |C$$data|,DATA |x$dataseg| EXPORT add_64 END È immediato verificare che il codice ottenuto non risulta essere efficiente INFATTI ACCEDE ALLO STACK ANCHE PER UN SALVATAGGIO DI CONTESTO CHE COINVOLGE POCHI REGISTRI RISPETTO A QELLI DI CUI DISPONE INFATTI ACCEDE ALLO STACK ANCHE PER UN SALVATAGGIO DI CONTESTO CHE COINVOLGE POCHI REGISTRI RISPETTO A QELLI DI CUI DISPONE

DIS - Dipartimento di Informatica e Sistemistica Perché programmare in Assembly 3/5 AREA |C$$code|, CODE, READONLY |x$codeseg| DATA add_64 STMDB sp!,{v1,lr} LDR v1,[a2,#0] MOV a4,v1,LSR #31 LDR ip,[a3,#0] MOV lr,ip,LSR #31 ADD ip,v1,ip STR ip,[a1,#0] MOV ip,ip,LSR #31 LDR a2,[a2,#4] LDR a3,[a3,#4] ADD a2,a2,a3 TST a4,lr TEQEQ a4,ip MOVNE a3,#1 MOVEQ a3,#0 ADD a2,a2,a3 STR a2,[a1,#4]! LDMIA sp!,{v1,pc} AREA |C$$data|,DATA |x$dataseg| EXPORT add_64 END È immediato verificare che il codice ottenuto non risulta essere efficiente Store a blocchi: Salva con una istruzione Più registri a partire da SP Store a blocchi: Salva con una istruzione Più registri a partire da SP Load a blocchi: Carica con una istruzione più registri Load a blocchi: Carica con una istruzione più registri

DIS - Dipartimento di Informatica e Sistemistica Perché programmare in Assembly 4/5 l Partiamo da codice C per la somma a 64 bit senza considerare il flag di Carry (add64_2.c) #include "int64.h" void add_64(int64 *dest, int64 *src1, int64 *src2) { dest->lo=src1->lo + src2->lo; dest->hi=src1->hi + src2->hi; return;} l Ottenere il codice assembly armcc –li –apcs 3/32bit –S add64_2.c

DIS - Dipartimento di Informatica e Sistemistica Perché programmare in Assembly 5/5 add_64 LDR a4,[a2,#0] LDR ip,[a3,#0] ADD a4,a4,ip STR a4,[a1,#0] LDR a2,[a2,#4] LDR a3,[a3,#4] ADD a2,a2,a3 STR a2,[a1,#4]! MOV pc,lr Analizzando il codice si osserva che la prima ADD produce la low order word mentre la seconda la high order word. Il codice desiderato può essere ottenuto semplicemente sostituendo la prima ADD con ADDS (ADD e SET flag) e la seconda con ADC (ADD with Carry) ADDS a4,a4,ip ADC a2,a2,a3

DIS - Dipartimento di Informatica e Sistemistica Leffetto dellAPCS l a1 contiene un puntatore alla struttura di output della funzione l a2 ed a3 contengono i puntatori alle strutture passate in input alla funzione l a4 ed ip sono utilizzati in luogo dei registri v per non salvare il contenuto di tali registri sullo stack l Nessun registro è stato salvato sullo stack per il ritorno dalla funzione basta MOV pc,lr l Per ritornare un valore, ad esempio il valore del flag di carry, usare il registro a1 MOVa1, #0 ADCa1, a1, #0 »Il codice è disponibile nel file (ARM_home\examples\candasm\add64_3.s)

DIS - Dipartimento di Informatica e Sistemistica Salvataggio dei registri sullo stack l Tornando alla prima versione dellassembly possiamo osservare che essendo utilizzati localmente i registri v1 ed lr sono preservati sullo stack l Il ritorno dalla funzione è ottenibile mediante LDMIA sp!,{v1,pc} add_64 STMDB sp!,{v1,lr} LDR v1,[a2,#0] MOV a4,v1,LSR #31 LDR ip,[a3,#0] MOV lr,ip,LSR #31 ADD ip,v1,ip STR ip,[a1,#0] MOV ip,ip,LSR #31 LDR a2,[a2,#4] LDR a3,[a3,#4] ADD a2,a2,a3 TST a4,lr TEQEQ a4,ip MOVNE a3,#1 MOVEQ a3,#0 ADD a2,a2,a3 STR a2,[a1,#4]! LDMIA sp!,{v1,pc}

DIS - Dipartimento di Informatica e Sistemistica Dettagli sullAPCS 1/2 l I registri sb, sl, fp, ip, sp sono utilizzati con funzioni dedicate nellAPCS; laddove non dovessero essere utilizzati per i ruoli definiti dallAPCS i registri possono essere utilizzati come registri generali l Le funzioni definite dallAPCS per i registri dedicati: »ip Utilizzato esclusivamente durante le chiamate di funzione. È convenzionalmente utilizzato come un registro locare. In altri casi può essere utilizzato come un registro temporaneo corruttibile »lrContiene lindirizzo di ritorno alluscita dalla funzione. Può essere utilizzato come registro temporaneo preservandone il valore sullo stack. Questultimo valore può essere direttamente ricaricato nel PC

DIS - Dipartimento di Informatica e Sistemistica Dettagli sullAPCS 2/2 »spstack pointer »slstack limit, utilizzato se il controllo dei limiti dello stack è esplicito (cioè realizzato dal codice in occorrenza di un push sullo stack). Se il controllo è implicito (effettuato dallhardware) il registro può essere utilizzato come v7. »fpframe pointer. Contiene o zero o un puntatore allultimo frame generato sullo stack. »sbstatic base. Nel caso di codice rientrante consente laccesso ad un array di puntatori a dati statici. Nel caso di codice non rientrante può essere usato come v6.

DIS - Dipartimento di Informatica e Sistemistica Passaggio e ritorno di strutture 1/3 l Generalmente le strutture sono passate attraverso registri o eventualmente (se le dimensioni o il numero lo esigessero) attraverso lo stack. l Il registro a1 punta allarea di memoria utilizzata per la memorizzazione dei risultati (per funzioni che ritornano strutture) »È come se struct s f(int x) fosse compilata come void f(struct s *result, int x)

DIS - Dipartimento di Informatica e Sistemistica Passaggio e ritorno di strutture 2/3 Si consideri il seguente codice ( ARM_home\candasm\two_ch.c ) typedef struct two_ch_struct { char ch1; char ch2; } two_ch; two_ch max( two_ch a, two_ch b ) { return (a.ch1>b.ch1) ? a : b; } »Il codice assembly corrispondente può essere ottenuto mediante armcc –S two_ch.c –apcs 3/32bit

DIS - Dipartimento di Informatica e Sistemistica Passaggio e ritorno di strutture 3/3 l Il codice assembly corrispondente evidenzia che: »Gli argomenti, il frame pointer, lo stack pointer, il link register e il current pc, sono salvati sullo stack (nellordine inverso rispetto a quello in cui sono stati elencati essendo lo stack discendente) »a2 ed a3 sono usati come variabili temporanee e memorizzano la parte di interesse delle strutture passate »a1 è un puntatore allarea di memoria in cui porre i risultati max MOV ip,sp STMDB sp!,{a1-a3,fp,ip,lr,pc} SUB fp,ip,#4 LDRB a3,[fp,#-&14] LDRB a2,[fp,#-&10] CMP a3,a2 SUBLE a2,fp,#&10 SUBGT a2,fp,#&14 LDR a2,[a2,#0] STR a2,[a1,#0] LDMDB fp,{fp,sp,pc}

DIS - Dipartimento di Informatica e Sistemistica Ritorno di strutture integer-like 1/3 l Una integer-like structure: »È non più grande di una parola »Ha campi per i quali il byte offset è nullo l Ad esempio sono integer-like structure structunion polymorphic_ptr{ unsigned a:8, b:8, c:8, d:8; struct A *a; } struct B *b; int *i; } »Non è un integer-like structure quella dellesempio precedente l Una integer like structure ha il suo valore di ritorno in a1

DIS - Dipartimento di Informatica e Sistemistica Ritorno di strutture integer-like 2/3 l Si consideri il codice seguente (half_str.c) typedef struct half_words_struct { unsigned field1:16; unsigned field2:16; } half_words; half_words max( half_words a, half_words b ) { half_words x; x= (a.field1>b.field1) ? a : b; return x;} l Mediante lopzione –S si ottenga il codice assembly corrispondente armcc –S half_str.c –apcs 3/32bit

DIS - Dipartimento di Informatica e Sistemistica Ritorno di strutture integer-like 3/3 l Il codice ottenuto evidenzia che il valore della struttura è ritornato direttamente in a1 max MOV a3,a1,LSL #16 MOV a3,a3,LSR #16 MOV a4,a2,LSL #16 MOV a4,a4,LSR #16 CMP a3,a4 MOVLE a1,a2 MOV pc,lr

DIS - Dipartimento di Informatica e Sistemistica Ritorno di integer-like stuctures mediante registri 1/5 l Utilizzando il registri come puntatori per lo scambio di strutture si ha un overhead elevato. l Luso della keyword __value_in_regs forza il passaggio delle strutture di dimensioni inferiori alle quattro parole attraverso i registri argomento a1-a4

DIS - Dipartimento di Informatica e Sistemistica Ritorno di integer-like stuctures mediante registri 2/5 l Problema: realizzare una routine ottimizzata per il prodotto di interi a 64 bit. l Il codice C non sarebbe ottimizzato (C flag) l Luso della memoria è da evitare. l Si consideri il codice contenuto nei file mul64.s, mul64.h, int64.h e multest.c

DIS - Dipartimento di Informatica e Sistemistica Ritorno di integer-like stuctures mediante registri 3/5 l Il file mul64.s evidenzia che la struttura è ritornata attraverso i registri a1 ed a2 Mul64MOV ip, a1, LSR #16 MOV a4, a2, LSR #16 BIC a1, a1, ip, LSL #16 BIC a2, a2, a4, LSL #16 MUL a3, a1, a2 MUL a2, ip, a2 MUL a1, a4, a1 MUL a4, ip, a4 ADDS ip, a2, a1 ADDCS a4, a4, #&10000 ADDS a1, a3, ip, LSL #16 ADC a2, a4, ip, LSR #16 MOV pc, lr

DIS - Dipartimento di Informatica e Sistemistica Ritorno di integer-like stuctures mediante registri 4/5 l Affinché ciò avvenga nel file int64.h la funzione mul64 è dichiarata come segue __value_in_regs extern int64 mul64(unsigned a, unsigned b); l Per compilare, assemblare e lincare i file si proceda come segue armasm mul64.s –o mul64.o armcc –c multest.c –apcs 3/32bit Armlink mul64.o multest.o –o multest

DIS - Dipartimento di Informatica e Sistemistica Ritorno di integer-like stuctures mediante registri 5/5 l Per lesecuzione > armsd -li multest A.R.M. Source-level Debugger, version 4.10 (A.R.M.) [Aug ] ARMulator V1.20, 512 Kb RAM, MMU present, Demon 1.01, FPE, Little endian. Object program file multest armsd: go Enter two unsigned 32-bit numbers in hex eg.(100 FF43D) Least significant word of result is Most significant word of result is Program terminated normally at PC = 0x x : 0xef : > swi 0x11 armsd: quit Quitting >

DIS - Dipartimento di Informatica e Sistemistica