L assembler INTEL IA32. Luigi Palopoli

Documenti analoghi
Esempio di moltiplicazione come somma e spostamento

Cenni ad Assembly Intel

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

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

Architettura del Set di Istruzioni (ISA)

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

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

CPU. Maurizio Palesi

Hardware di un Computer

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

MIPS Instruction Set 2

Architettura degli elaboratori (A)

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

Il microprocessore 8086

Introduzione. Corso di Informatica Applicata. Università degli studi di Cassino

L architettura di riferimento

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

Architettura hardware

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

Istruzioni di modifica della sequenza di elaborazione

PD32. Interfacciamento con i dispositivi di I/O (V)

Sistemi Operativi. 5 Gestione della memoria

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

Calcolatori Elettronici Parte X: l'assemblatore as88

INFORMATICA 1 L. Mezzalira

Von Neumann. John Von Neumann ( )

Testi di Esercizi e Quesiti 1

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

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

Aritmetica dei Calcolatori 2

DMA Accesso Diretto alla Memoria

Ing. Paolo Domenici PREFAZIONE

Architettura del calcolatore

Sistema operativo: Gestione della memoria

PD32. Esercitazione sull interfacciamento con un dispositivo di IO

Funzioni in C. Violetta Lonati

Calcolo numerico e programmazione Architettura dei calcolatori

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

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

Lezione n.9. Introduzione al linguaggio macchina

Struttura del calcolatore

Arduino: Programmazione

L unità di elaborazione pipeline L unità Pipelining

FONDAMENTI di INFORMATICA L. Mezzalira

Il livello architettura e set di istruzioni

Architettura degli Elaboratori

Programmazione dello Z80

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

GESTIONE INFORMATICA DEI DATI AZIENDALI

Il memory manager. Gestione della memoria centrale

Gian Luca Marcialis studio degli algoritmi programma linguaggi LINGUAGGIO C

CAP. 4: Aspetti generali del Sistema Operativo Linux. l

= 0, 098 ms. Da cui si ricava t 2 medio

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

Il simulatore SPIM SPIM

JPD132. Microprocessore e assembly

Appunti di informatica. Lezione 2 anno accademico Mario Verdicchio

Powered by: Relators:

Allocazione dinamica della memoria - riepilogo

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

Architettura di un calcolatore: introduzione

Introduzione ai linguaggi di programmazione

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. Implementazione del File System. Struttura del File System. Implementazione

C. P. U. MEMORIA CENTRALE

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

Gestione della Memoria

Parte II.2 Elaboratore

Processore PC. Spazio di indirizzamento. la ALU (Arithmetic and Logic Unit) la FPU (Floating Point Unit)

Architettura di tipo registro-registro (load/store)

Olga Scotti. Basi di Informatica. File e cartelle

Sistemi Operativi (modulo di Informatica II) I processi

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a prof.

Lezione 16: L architettura LC-3

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

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

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Con il termine Sistema operativo si fa riferimento all insieme dei moduli software di un sistema di elaborazione dati dedicati alla sua gestione.

Linguaggio macchina e linguaggio assembler

LABORATORIO DI SISTEMI

Famiglia dei processori INTEL

MODELLI DI MEMORIA e CALL

Il Processore: i registri

Architettura hw. La memoria e la cpu

Protezione. Protezione. Protezione. Obiettivi della protezione

ASSEMBLER 68K parte 1

RISOLUTORE AUTOMATICO PER SUDOKU

Assembler di Spim. Assembler di SPIM. Struttura di un programma assembler. Direttive

Introduzione all'architettura dei Calcolatori

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

Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};

4 3 4 = 4 x x x 10 0 aaa

Laboratorio di Informatica

La macchina programmata Instruction Set Architecture (1)

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

Sistemi Operativi IMPLEMENTAZIONE DEL FILE SYSTEM. D. Talia - UNICAL. Sistemi Operativi 9.1

Tecniche di traduzione da C ad assembly Note generali

Introduzione alla programmazione in C

4. Operazioni aritmetiche con i numeri binari

Assembly. Modello x86

Come si può vedere, la regola è stata fatta in modo da spostare tutti i messaggi di Spam nella cartella del cestino.

Transcript:

L assembler INTEL IA32 Luigi Palopoli

Istruzioni e operandi Contrariamente all assembler del MIPS nel caso dell IA32 ci possono essere due o tre operandi anche per le istruzioni logico aritme>ca Inoltre esistono istruzioni ad un operando ES: INC (INCREMENTA) Nella sintassi AT&T che useremo noi l operando des>nazione si scrive sempre in fondo (contrariamente a quanto abbiamo visto per il MIPS) Per alcune istruzioni si da per implicito che l operando e un par>colare registro (dejo accumulatore).

Intel Nell'assembler Intel (sintassi AT&T) si usa dis>nguere anche se l'istruzione opera su byte (b), su word a 16bit (w) o su word a 32 bit (l) e si usa % prima di ogni registro Es. movb %Ax, Dest (opera sul byte) movl %EAX, Dest (opera su word) Come accumulatore viene spesso usato EAX (32bit) E' possibile usarne solo 16bit specificando AX: AX a sua volta può essere par>zionato AL (8 bit meno significa>vi) AH (8 bit più significa>vi)

Esecuzione delle Istruzioni Gli elaboratori sono macchine sequenziali L esecuzione naturale delle istruzioni è una- dopo- l altra Un programma viene caricato nel processore una istruzione alla volta nell IR Il processore esegue l istruzione e poi carica la successiva a cui punta il PC La fase iniziale si chiama instruc>on fetch (o load, o caricamento) La seconda fase di chiama instruc>on execu>on (o esecuzione)

Inizio esecuzione Address Contents Intel i i + 4 i + 8 Movl Add Movl A,%EAX B,%EAX %EAX,C 3- instruc>on program segment In IA32 l esecuzione viene sempre assunta sequenziale A B Data for the program Come per il MIPS esiste la possibilita di fare salti condizionati e incondizionati C

Metodi di indirizzamento Una forte differenza con il MIPS e nella modalita di indirizzamento (come si specificano gli operandi di un istruzione) Per il MIPS abbiamo visto si opera solo tra registri, o si possono trasferire da> da/a memoria a/da un registro Inoltre alcune istruzioni si possono eseguire in modalita immediata (con alcuni operandi costan>) Per l intel abbiamo gli operandi possono essere Costan> (modalita immediata) Registri (modalita registro) Indirizzi Contrariamente al MIPS gli indirizzi di memoria possono essere specifica> in varie modalita diverse.

Indirizzamento in modo registro In assembler INTEL questo indirizzamento è presente Es. Movl %eax, %ebp Notare che in MIPS una cosa del genere si farebbe cosi : add $ebp, $eax, $zero I registri principali per uso generale sono: eax, ebx, ecx, edx, esi, edi, ebp Nel MIPS I registri sono mol> di piu.

Registri IA32

Registri IA32 EAX, EBX, ECX, EDX: general purpose EAX: accumulatore EBX: puntatore a memoria ECX: controllo cicli EDX: estende EAX per operazioni a 64bit ESI, EDI: puntatori a stringhe EBP: puntatore alla testa del frame di afvazione ESP: puntatore alla testa della pila EIP: instruc>on pointer CS,..., GS: selejori di segmento EAFLAGS: registro con i flag di stato

Indirizzamento immediato Per l'intel (sintassi AT&T), il valore della costante è in preceduto da un $ Es. Move $1, %EAX Add $2, %EAX

Indirizzamento in memoria Nell'architeJura intel tuje le modalità di indirizzamento sono casi par>colare di un modo generale: ind = base + (index*scale)+displacement dove base è uno dei registri eax, ebx, ecx, edx, esp, ebp, esi e edi index può essere uno dei precedenti (eccetto esp) scale può essere (1, 2, 4, o 8) displacement è un valore immediato a 8, 16 o 32 bit Per il MIPS abbiamo solo base e displacement Ad esempio movl 10(%ebx,%ecx,2), %eax porta in eax il contenuto di memoria in ebx+2*ecx+10

Esempi di indirizzamento

Salti e cicli Consideriamo il problema di sommare N numeri Richiede (ad esempio) l uso di un modo indirizzamento indirejo (>po puntatore), in cui un registro viene aggiornato ad ogni ciclo per contenere l indirizzo della locazione di memoria in cui si trova di volta in volta l operando

Intel Address LOOP Contents movl movl Addl Addl cmpl JNE Move 0,%ecx $0, %eax a(,%edx,4),%eax $1,%edx %edx, $N LOOP %eax,sum Ini>aliza>on

Uso dell indirizzamento indiretto e indicizzato L indirizzamento indicizzato è fondamentale nella ges>one delle strujure da> complesse Immaginiamo di voler ges>re i vo> di tuf gli studen> di un corso, che effejuano 3 test, ad esempio per calcolare la media (o semplicemente la somma complessiva) dei vo> assegna> durante i test

Esempio N LIST LIST + 4 LIST + 8 LIST + 12 LIST + 16 n Student ID Test 1 Test 2 Test 3 Student ID Test 1 Test 2 Test 3 Student 1 Student 2

Formato assembler Per operare correjamente bisogna definire un formato univoco del linguaggio assembler e>cheje (label), possono avere un nome logico oltre al valore numerico istruzione (opera>on instruc>on) operandi (operands) commen> (comments) label i-code op1,op2,op3 bla,bla,bla,...

Somma di 2 numeri... Sintassi gcc per Intel.pippo: movl $27,%eax /*loads the number 27 in the accumulator*/ addl A,%eax /*adds the content of memory location A in the accumulator*/ movl %eax,b /*store the result into B*/

Qualche altra istruzione assembler... Istruzioni logiche sui singoli bit di una parola not and or cmp dst dst1,dst2 dst1,dst2 dst1,dst2 bitwise complement dst, that may be a register or a memory location (mloc) bitwise ANDs the content of dst1/2, that may be registers, mlocs or constants bitwise ORs the content of dst1/2, that may be registers, mlocs or constants compares the content of dst1/2, that may be registers, mlocs or constants, returns 0 if dst1=dst2

Qualche altra istruzione assembler... Istruzioni algebriche neg mul dst dst1,dst2, trasforma dst in dst calcola la moltiplicazione tra dst1/2 supposti numeri interi, e memorizza il risultato in dst2, il cui contenuto viene distrutto; resta il problema che il risultato può andare in overflow, problema peraltro comune anche ad Add Nell architettura INTEL esistono anche una seri di istruzioni per gestire direttamente il floating point

Intel Istruzioni di Shio logiche shll shrl $N,%dst $N,%dst sposta il contenuto del registro dst a sinistra di N passi, N può usare un sistema di indirizzamento qualsiasi; i bit che escono dal registro sono persi, le posizioni a destra sono rimpiazzate da 0 (operandi a 32bit) sposta il contenuto del registro Ri a destra di N passi, N può usare un sistema di indirizzamento qualsiasi; i bit che escono dal registro sono persi, le posizioni a sinistra sono rimpiazzate da 0 (operandi a 32bit)

Intel Istruzioni di Shio aritme>che (mol>plicazione/ divisione per due) sall $N,%dest sposta il contenuto del registro dest a sinistra di N passi, N può usare un sistema di indirizzamento qualsiasi; i bit che escono dal registro sono persi, le posizioni a destra sono rimpiazzate da 0 (identica a LShfL) sarl $N,%dest sposta il contenuto del registrodest a destra di N passi, N può usare un sistema di indirizzamento qualsiasi; i bit che escono dal registro sono persi, le posizioni a sinistra sono rimpiazzate da bit uguali al bit di segno

shll C R0 0 before: 0... 0 1 1 1 0 0 1 1 aoer: 1... 1 1 0 0 1 1 0 0 (a) Logical/Aritmetical shift left LShiftL #2,R0

shrl 0 R0 C before:... 0 1 1 1 0 0 1 1 0 aoer: 0 0 0 1 1 1 0... 0 1 (b) Logical shift right LShiftR #2,R0

sarl R0 C before:... 1 0 0 1 1 0 1 0 0 aoer:... 1 1 1 0 0 1 1 0 1 (c) Arithmetic shift right AShiftR #2,R0

Intel Istruzioni di rotazione roll rcll ror rcr $N,%dst $N,%dst $N,%dst $N,%dst sposta ciclicamente il contenuto del registro dst a sinistra di N passi, N può usare un sistema di indirizzamento qualsiasi; come RotL, ma include il bit di carry come RotL, ma verso destra come RotR, ma include il bit di carry

roll C R0 before: 0... 0 1 1 1 0 0 1 1 aoer: 1... 1 1 0 0 1 1 0 1 (a) Rotate left without carry RotateL #2,R0

rcll C R0 before: 0... 0 1 1 1 0 0 1 1 aoer: 1... 1 1 0 0 1 1 0 0 (b) Rotate left with carry RotateLC #2,R0

ror R0 C before:... 0 1 1 1 0 0 1 1 0 aoer:... 1 1 0 1 1 1 0 0 1 (c) Rotate right without carry RotateR #2,R0

Qualche altra istruzione assembler... Istruzioni di fine ret: comunica al sistema operativo (o a un altro programma, o al programma principale se stiamo considerando una subroutine) che il programma ha terminato l esecuzione

Esecuzione dei programmi l Assembler NON è il linguaggio macchina Assemblatore: traduce l assembler in linguaggio macchina, risolvendo eventuali conflif (es. sal> in avan>) simile a un compilatore Loader: carica un programma in memoria (ad esempio dal disco rigido) al momento dell esecuzione, risolvendo gli indirizzi rela>vi e controllando che ci siano tuf i pezzi necessari all esecuzione correja

Funzioni fondamentali di I/O Qualsiasi elaboratore deve poter comunicare con l esterno... almeno tramite una tas>era e un video/stampante Bus Processor DATAIN DATAOUT SIN Keyboard SOUT Display tastiera video e processore sono collegati al bus

Funzioni fondamentali di I/O è uso che il processore veda i registri periferici di interfaccia di tas>era e video come delle normali posizioni di memoria (memory mapped I/ O) DATAIN registro di ingresso DATAOUT registro di uscita I/O sono molto più len> del processore Quando sono disponibili i da> su DATAIN? Quando sono sta> lef i da> da DATAOUT?

INTEL Il processore deve poter aspejare che l I/O sia abilitato, quindi deve avere un loop per leggere il registro solo al momento opportuno READW test $3, SIN controlla lo stato dell ingresso jnc READW continua il loop se il dato non è disponibile movb Din,%al legge il dato WRITEW test $3, SOUT controlla lo stato dell uscita jnc WRITEW continua il loop se il display non può ricevere il dato movb %al, Dout scrive il dato

Un programma per fare l eco di caratteri... fino a CR(IA32)!.BEGIN lea loc,%ebp /*Carica l'indirizzo loc in ebp*/.read testb jnc movb movb inc $3, SIN READ DATAIN,AL AL,(%ebp) %ebp /*controlla lo stato dell ingresso*/ /memorizza il dato */.ECHO testb $3, SOUT controlla lo stato dell uscita jnc ECHO continua il loop se il display non può ricevere il dato movb %al, DATAOUT scrive il dato, facendo l eco e resetta SOUT cmpb $32, al punta alla nuova locazione di memoria jne READ passa a leggere un altro carattere

Subroutines e gestione della memoria I programmi sono (auspicabilmente!!) compos> di tante subrou>ne Il programma principale invoca una subrou>ne, che ne invoca un altra, che ne invoca una successiva... Come evolve il program counter? Come viene mantenuto lo stato del programma nel passaggio da una subrou>ne ad un altra?

Subroutines e gestione della memoria Come si ges>sce la memoria del processore per evitare conflif tra subrou>nes? Come si possono passare parametri e risulta> tra subrou>nes diverse? In par>colare come si passano tra una subrou>ne chiamante ed una chiamata?

Tecniche di gestione della memoria Coda spazio di memoria in cui gli elemen> che entrano per primi saranno anche i primi a uscire (FIFO First In First Out) Realizzabile in memoria tramite un buffer circolare ges>to da puntatori dinamici Stack spazio di memoria in cui gli elemen> che entrano per primi gli ulkmi a uscire (LIFO Last In First Out) Realizzabile in memoria tramite un buffer circolare ges>to con un puntatore sta>co e uno dinamico

Stack Come la pila dei giornali in salojo... Un puntatore (fisso) segna il fondo della coda Un puntatore (mobile) segna l ul>mo elemento entrato nello stack e anche il primo ad uscirne La ges>one di uno stack in memoria si può fare semplicemente con una locazione di memoria (in genere un registro specializzato) che svolge il ruolo di puntatore e delle operazioni di move per scrivere e leggere gli elemen> è u>le effejuare dei controlli per evitare di leggere elemen> da uno stack vuoto o di riempire lo stack all infinito

Stack ScriJura 0 Stack Pointer register SP Stack BOTTOM - 28 17 739 43 Current top element BoQom element add $- 4,%SP mov ITEM,(%SP) LeJura mov (%SP),ITEM Add $4,SP

Push e Pop Le operazioni di lejura e scrijura in uno stack in genere si chiamano PUSH ITEM per la scrijura e POP ITEM per la lejura Le operazioni di push e pop sono normalmente realizzate con subrou>nes che controllano lo stato dello stack stesso

Push e Pop PUSH Cmp CIMA,%SP controlla che SP non sia già posizionato alla cima della memoria ammessa per lo stack JE FULLERROR se è gia pieno salta a una routine di errore Add $-4,%SP Move ITEM,(%SP) Routine di PUSH con controllo dello riempimento POP CMP FONDO,%SP controlla che SP non sia già posizionato alla fondo della memoria riservata allo stack JE EMPTYRROR se è gia pieno salta a una routine di errore Add $4,%SP Move (%SP),ITEM Routine di POP con controllo dello riempimento

Subroutines e Stack Lo stack è la strujura usata abitualmente per il passaggio dei parametri e del controllo tra subrou>nes Consente in modo naturale la ricorsione e l annidamento di subrou>nes senza nessun vincolo a priori sul livello di annidamento Noi daremo per scontato che esistono le rou>nes pop e push (con un solo parametro) e usiamo quelle per ges>re lo stack, ovviamente invocando POP e PUSH... usiamo lo stack!!

Salvataggio del PC Passando il controllo del programma ad una subrou>ne bisogna salvare il Program Counter per sapere da dove riprendere l esecuzione Memory locakon Calling program Memory locakon SubrouKne SUB 200 Call SUB 1000 first instruckon 204 next instruckon Return

Salvataggio del PC L istruzione Call salva il PC nello stack del processore e poi esegue un branch incondizionato all istruzione di inizio della subrou>ne Bisogna sempre ricordare che una subrou>ne in assembler non è nient alto che una sequenza di istruzioni in un area di memoria PUSH JMP %PC PIPPO salva il program counter salta alla prima istruzione della subroutine istruzioni equivalenti alla Call di una subroutine

Subroutines e parametri Nei linguaggi di alto livello i parametri si passano... tra parentesi call subr(par1,par2,par3) In assembler invocare una subrou>ne vuol dire solamente effejuare un salto incondizionato a una locazione di memoria Call SUBR JMP SUBR I parametri che userà la subrou>ne devono già essere in una opportuna area di memoria... in cima allo stack I parametri res>tui> dalla subrou>ne saranno anche loro passa> ajraverso lo stack

Subroutines e parametri Invocando una subrou>ne in un linguaggio di alto livello es: is_date(day,month,year) Si ofene una sequenza di istruzioni in assembler del >po Push PAR3 Push PAR2 Push PAR1 Call ISDATE Dove PAR1, PAR2 e PAR3 sono le locazioni di memoria in cui sono state memorizzate le variabili day, month e year

Passaggio dei parametri SP Return address (PC) PAR1 PAR2 PAR3 I parametri vengono scrif nello stack (ad esempio in ordine inverso) Per ul>mo viene salvato il PC in modo da sapere l indirizzo dove si dovrà ritornare in uscita dalla subrou>ne I parametri possono anche essere variabili in uscita, che userà il programma chiamante

Salvataggio dei registri SP [ESI] [EDI] [EDX] Return address (PC) PAR1 PAR2 PAR3 Se una subrou>ne deve usare del registri (diciamo ESI, EDI ed EDX) deve garan>re di non distruggere il loro contenuto, per poterlo ripris>nare in uscita Li memorizza in cima allo stack

Variabili locali e Frame Pointer (FP) In mol> linguaggi le subrou>nes possono avere variabili locali che non sono viste dal resto del programma e la cui memoria viene rilasciata all uscita dalla subrou>ne Il luogo naturale di memorizzazione è nuovamente lo stack dove la memoria può essere assegnata all ingresso in una subrou>ne e rilasciata in uscita Per mantenere chiaramente separate le variabili globali salvate nello stack e quelle locali si usa un ulteriore puntatore chiamato Frame Pointer

Variabili locali e Frame Pointer (FP) SP FP saved [R1] saved [R0] localvar3 localvar2 localvar1 saved [FP] Return address param1 param2 param3 param4 Stack frame for called subroukne Old TOS (top- of- stack) FP separa la parte di memoria dedicata al passaggio dei parametri dalla memoria locale I registri R1 ed R0 sono salva> perchè assumiamo che la subrou>ne li userà FP non varia durante l esecuzione della subrou>ne

Tipico Struttura di una funzione IA32 /* Prologo */ ESP EBP saved register saved register localvar3 localvar2 localvar1 saved [EBP] Return address param1 param2 Stack frame for called subroukne pushl %ebp /*salva ebp */ mov %esp, %ebp /*Memorizza inizio Frame afvazione */ sub $.., %esp /* alloca spazio per variabili locali*/ pushl %esi... /* salva registri.. se occorre */ /* Corpo funzione */... /* epilogo */ popl %esi... /* Ripris>na registri se salva> */ addl $.., %esp /* dealloca variabili locali */ movl %ebp, %esp /* Ripris>na ebp, esp */ popl %ebp /* Queste due istruz. equivalgono a leave*/ ret param3 param4 Old TOS (top- of- stack)

IA32 gcc convenzioni di chiamata U>lizzando gcc, per rendere una funzione assembler invocabile dal C, occorre rispejare le seguen> convenzioni: I parametri vengono immessi sullo stack dal chiamante a par>re dall'ul>mo verso il primo. as. es., all'interno della funzione troviamo in (%esp) l'indirizzo di ritorno, 4(%esp) il primo parametro, 8(%esp) il secondo (assumendo che il primo sia a 32 bit) ecc. I registri esp, ebp, esi, edi, ebx devono essere preserva> se si usano bisogna prima salvarli sullo stack e poi ripris>narli i parametri di ritorno, se interi o puntatori, vengono res>tui> in eax

Esempio su IA32 Si scriva una funzione Assembly che riceve come parametri un vejore di numeri interi a 8 bit con segno il numero di elemen> del vejore, e res>tuisce la somma a 32- bit di tuf gli elemen> posi>vi.

Soluzione... Prologo /* Prologo */ pushl %ebp /*salva ebp */ mov %esp, %ebp /*Memorizza inizio Frame acvazione */ pushl %esi /* salva registri, non ho variabili locali */

Soluzione... Corpo funzione movl 8(%ebp), %esi movl 12(%ebp), %ecx xorl %eax, %eax /* azzero eax */ xorl %edx, %edx /* azzero eax */ jecxz.end /*Se ecx 0 finito */.L0: movb (%esi), %dl testb %dl, %dl /*Come la and ma non salva il risultato e seqa solo i flag */ js.l1 /* se il numero è negakvo non lo considero */ addl %edx, %eax.l1: incl %esi loop.l0 /* Decrementa ecx e salta se diverso da 0 */

Soluzione... Epilogo.END: popl %esi /* RiprisKna registri leave ret se salvak */