Introduzione ai concetti e al simulatore SPIM

TITLE
Assembler MIPS 32
Introduzione ai concetti
e al simulatore SPIM
Riccardo Solmi
© 2002-2004 Alberto Montresor, Riccardo Solmi
1
Indice degli argomenti
ƒ Introduzione ai concetti di
• assembler, compilatore, linker, programma eseguibile
ƒ Elementi di un programma assembly
• Direttive all’assembler
• Identificatori, etichette e riferimenti
• Registri generali e speciali
• Istruzioni e pseudoistruzioni
ƒ Uso del tool SPIM
• Un semplice simulatore del processore MIPS32
• Come utilizzare SPIM
© 2002-2004 Alberto Montresor, Riccardo Solmi
2
1
Bibliografia
ƒ MIPS – Assembly Language Programmer’s Guide
• Manuale di programmazione assembly MIPS
ƒ Assemblers, Linkers, and the SPIM Simulator
• Contiene un tutorial per imparare ad usare il simulatore
SPIM
ƒ SPIM – Simulatore MIPS32
• Assemblatore, simulatore e debugger MIPS
ƒ Trovate tutto nella pagina web relativa a questo modulo:
• http://www.cs.unibo.it/~solmi/teaching/arch_20042005.html
© 2002-2004 Alberto Montresor, Riccardo Solmi
3
Ricevimento
ƒ Sul newsgroup
• Avete a disposizione un newsgroup:
unibo.cs.informatica.architettura
• Utilizzatelo il più possibile; se nessuno risponde in due-tre
giorni, risponderà uno dei docenti
• Valuteremo anche la partecipazione al newsgroup
ƒ Subito dopo le lezioni
• sono a vostra disposizione per chiarimenti
• in aula e alla lavagna, in modo da rispondere a tutti
ƒ Su appuntamento in laboratorio dottorandi
• Scrivete a [email protected]
• Fissiamo un appuntamento
© 2002-2004 Alberto Montresor, Riccardo Solmi
4
2
Alcuni concetti fondamentali
ƒ Linguaggio macchina
• Il linguaggio basato su valori numerici utilizzato dai
computer per memorizzare ed eseguire programmi.
ƒ Linguaggio assembly
• Rappresentazione simbolica (quasi 1 a 1) del linguaggio
macchina, usato dai programmatori perché utilizza simboli
invece di numeri per rappresentare istruzioni, registri e dati.
ƒ Linguaggi ad alto livello
• Tutti gli altri linguaggi di programmazione sono detti ad alto
livello perché includono delle astrazioni che permettono al
programmatore di non specificare certi tipi di dettagli
implementativi della macchina.
5
© 2002-2004 Alberto Montresor, Riccardo Solmi
Esempio in linguaggio Macchina e Assembly
00100111101010010001111011001011
00100110010011001001100100110010
01100100110010011001001100100110
00100110010011001001100100110010
11111000101001000111001010010100
01010101011111111111000001101001
10100101010101010011111000110001
11010010100100010101001010101011
10101010100000111111000011110001
10001000111110001010001111010101
10010011111011100000111100001111
…
Linguaggio macchina
© 2002-2004 Alberto Montresor, Riccardo Solmi
addiu
sw
sw
sw
sw
sw
sw
lw
lw
multu
addiu
...
$29,
$31,
$4,
$5,
$5,
$0,
$0,
$14,
$24,
$14,
$8,
$29, -32
20($29)
32($29)
36($29)
36($29)
24($29)
28($29)
28($29)
24($29)
$14
$14, 1
Assembly
6
3
Esempio in un linguaggio ad alto livello
/* prova.c */
int main(int argc, char *argv[]) {
int i;
int sum=0;
for (i=0; i <= 100; i++)
sum = sum + i;
printf(“The sum from 0 .. 100 is %d\n”, sum);
}
Linguaggio C
7
© 2002-2004 Alberto Montresor, Riccardo Solmi
Assembler
ƒ Assembler
• Uno strumento che traduce programmi scritti nel linguaggio
assembly in linguaggio macchina. L’assembler
• legge un file sorgente in assembly
• produce un file oggetto contenente linguaggio macchina
ed altre informazioni necessarie per trasformare uno o
più file oggetto in un programma eseguibile
File sorgente
Assembly
© 2002-2004 Alberto Montresor, Riccardo Solmi
Assembler
File
oggetto
8
4
Compilatore
ƒ Compilatore
• Uno strumento che traduce un programma scritto in un
linguaggio ad alto livello in un:
• programma equivalente scritto in linguaggio assembly,
che può essere trasformato in un file oggetto da un
assembler
• oppure, direttamente in un file oggetto
File C
Compilatore
File
Assembly
Assembler
© 2002-2004 Alberto Montresor, Riccardo Solmi
File
Oggetto
9
File oggetto (o modulo)
ƒ Un modulo può contenere
• Istruzioni (routine, subroutine, coroutine, ecc.)
• Dati
• Riferimenti a subroutine e dati di altri moduli
(unresolved references)
© 2002-2004 Alberto Montresor, Riccardo Solmi
10
5
Linker
ƒ Linker
• Uno strumento che combina un insieme di file oggetto e file
libreria in un programma eseguibile
• Il linker ha tre compiti:
• Ricercare nei file libreria le routine di libreria utilizzate
dal programma (es. printf)
• Determinare le locazioni di memoria che il codice di
ogni modulo andrà ad utilizzare e aggiornare i
riferimenti assoluti in modo opportuno
• Risolvere i riferimenti tra i diversi file
• Il programma eseguibile non deve contenere unresolved
references
11
© 2002-2004 Alberto Montresor, Riccardo Solmi
Linker
File oggetto
main:
jal ???
…
jal ???
------------call, sub
call, printf
File oggetto
sub:
jal ???
…
------------call, scanf
File libreria
printf:
…
…
scanf:
…
…
Linker
NB. In realtà le istruzioni
(es. jal) sono in
linguaggio macchina
© 2002-2004 Alberto Montresor, Riccardo Solmi
File eseguibile
main:
jal sub
…
jal printf
------------sub:
jal scanf
…
------------printf:
…
…
scanf:
…
…
12
6
Assembler
ƒ Compito principale di un assembler è quello di semplificare
il più possibile la vita del programmatore rispetto all’uso
diretto del linguaggio macchina:
• Utilizzo di parole mnemoniche per identificare le istruzioni
del linguaggio macchina
addiu $29, $29, -32
vs
00100111101111011111111111100000
• Aumento del numero di istruzioni disponibili per il
programmatore attraverso l’uso di pseudoistruzioni
• Possibilità di definire macro
• Possibilità di definire etichette
• Possibilità di aggiungere commenti
© 2002-2004 Alberto Montresor, Riccardo Solmi
13
Linguaggio Assembly: Pro
ƒ Perché utilizzare il linguaggio assembly?
• Quando dimensioni e velocità del programma sono fattori
critici
• Per velocizzare almeno le sezioni critiche di un programma
• Per utilizzare istruzioni particolari del processore altrimenti
non utilizzate dai compilatori (ad es., istruzioni MMX)
• Per sviluppare il kernel di un sistema operativo, che
necessita di istruzioni particolari per gestire ad esempio la
protezione della memoria
• Per non essere limitati dall’espressività dei costrutti di un
linguaggio ad alto livello.
• Per imparare ad usare con più consapevolezza le astrazioni
dei linguaggi ad alto livello
© 2002-2004 Alberto Montresor, Riccardo Solmi
14
7
Linguaggio Assembly: Contro
ƒ Perché non utilizzare il linguaggio assembly?
• E’ complesso
• Devo specificare tutti i dettagli implementativi
• Il codice prodotto è poco leggibile
• E’ error-prone
• Salto dove voglio
• Leggo/scrivo quello che mi pare
• E’ meno produttivo
• Il codice prodotto non è portabile
• I compilatori sono spesso più bravi di voi
15
© 2002-2004 Alberto Montresor, Riccardo Solmi
Elementi di un programma assembly
.text
.globl main
Direttive
Etichette
main:
lw $a0, Size
li $a1, 0
Registri
li $a2, 0
li $t2, 4
loop:
mul $t1, $a1, $t2
lw $a3, Array($t1)
add $a2, $a2, $a3
add $a1, $a1, 1
beq $a1, $a0, stor
j loop
© 2002-2004 Alberto Montresor, Riccardo Solmi
stor:
sw $a2, Result
.data
Identificatore
Array:
.word 1, 2, 3, 4, 5
Size:
.word 7
Result:
Allocazione
.word 0
di memoria
Istruzioni
16
8
Direttive
ƒ Direttive
• Forniscono informazioni addizionali utili all’assembler per
gestire l’organizzazione del codice
• Iniziano con un punto
ƒ Esempi:
• .text
indica che le linee successive contengono istruzioni
• .data
indica che le linee successive contengono dati
© 2002-2004 Alberto Montresor, Riccardo Solmi
17
Organizzazione della memoria
ƒ Come è organizzata la memoria?
• La memoria viene suddivisa in segmenti
• Ogni segmento viene utilizzato per un particolare scopo
ƒ Segmenti principali:
• Text:
Contiene il codice dei programmi
• Data:
Contiene i dati “globali” dei programmi
• Stack
Contiene i dati “locali” delle funzioni
© 2002-2004 Alberto Montresor, Riccardo Solmi
18
9
Organizzazione della memoria
Reserved for Kernel Use
0x 8000 0000
0x 7FFF F000
Not used
Stack
$sp
Heap
.bss
0x 1000 0000
0x 0040 0000
0x 0000 0000
.data
.text
.rdata
.reserved
© 2002-2004 Alberto Montresor, Riccardo Solmi
19
Identificatori
ƒ Identificatori
• Un identificatore è un nome associato ad una particolare
posizione del programma assembly come l’indirizzo di una
istruzione o di un dato.
• Un identificatore consiste in una sequenza case-sensitive di
caratteri alfanumerici. Ad esempio: main, loop, stor,
Size, Array, Result
• Ogni istruzione o dato si trova in un particolare indirizzo di
memoria. Un identificatore ci permette di fare riferimento
ad una particolare posizione senza sapere il suo indirizzo in
memoria (che non ci interessa)
• Nei prossimi due lucidi vedremo come definirli e usarli
© 2002-2004 Alberto Montresor, Riccardo Solmi
20
10
Etichette e loro visibilità
ƒ Etichette
• Una etichetta introduce un identificatore e lo associa al
punto del programma in cui si trova.
• Un’etichetta consiste in un identificatore seguito dal
simbolo due punti. Ad esempio: main:, loop:, stor:,
Size:, Array:, Result:
• L’identificatore introdotto può avere una visibilità locale o
globale. Le etichette sono locali per default; l’uso della
direttiva .globl rende un’etichetta globale
• Una etichetta locale può essere referenziata solo
dall’interno del file in cui è definita; una etichetta globale
può essere referenziata anche da file diversi da quello in cui
è definita.
© 2002-2004 Alberto Montresor, Riccardo Solmi
21
Riferimenti
ƒ Riferimenti
• Gli identificatori possono essere usati nelle istruzioni
assembly e nei dati per fare riferimento alla posizione del
programma associata all’identificatore.
• E’ sufficiente una etichetta anche per dati che occupano più
bytes; basta aggiungere uno scostamento (calcolato in bytes)
al riferimento base. Es.
Array: .word 1, 2, 3, 4, 5
# Array si può usare come riferimento al dato 1
# Array + 4 è un riferimento al dato 2, ecc.
© 2002-2004 Alberto Montresor, Riccardo Solmi
22
11
Allocazione di memoria per i dati
ƒ Allocazione di memoria nel segmento data:
• E’ possibile allocare memoria nel segmento data utilizzando
alcune direttive che permettono di specificare come la
memoria verrà utilizzata e il valore iniziale della memoria
stessa.
• Il valore iniziale può essere specificato tramite espressioni,
costanti o stringhe. Esempi possibili possono essere:
• “Hello World”
• 0xAA+12
• 10*10
© 2002-2004 Alberto Montresor, Riccardo Solmi
23
Direttive per allocare memoria
ƒ
Direttive di allocazione di memoria:
• .byte b1, …, bn
Alloca n quantità a 8 bit in byte successivi in memoria
• .half h1, …, hn
Alloca n quantità a 16 bit in halfword successive in memoria
• .word w1, …, wn
Alloca n quantità a 32 bit in word successive in memoria
• .float f1, …, fn
Alloca n valori floating point a singola precisione in locazioni
successive in memoria
• .double d1, …, dn
Alloca n valori floating point a doppia precisione in locazioni successive
in memoria
• .asciiz str
Alloca la stringa str in memoria, terminata con il valore 0
• .space n
Alloca n byte, senza inizializzazione
© 2002-2004 Alberto Montresor, Riccardo Solmi
24
12
Registri generali
ƒ Registri generali
• $0
$zero
• $1
$at
• $2-$3
$v0-$v1
• $4-$7
$a0-$a3
• $8-$15 $t0-$t7
• $16-$23 $s0-$s7
• $24-$25 $t8-$t9
• $26-$27 $k0-$k1
• $28
$gp
• $29
$sp
• $30
$fp
• $31
$ra
Valore fisso a 0
Riservato
Risultati di una funzione
Argomenti di una funzione
Temporanei (non preservati fra chiamate)
Temporanei (preservati fra le chiamate)
Temporanei (non preservati fra chiamate)
Riservate per OS kernel
Pointer to global area
Stack pointer
Frame pointer
Return address
© 2002-2004 Alberto Montresor, Riccardo Solmi
25
Registri speciali
ƒ Registri speciali
• PC
Program counter
• HI
Risultato di una moltiplicazione, parte più significativa
• LO
Risultato di una moltiplicazione, parte meno significativa
ƒ Nota
• I registri generali possono essere utilizzati in qualunque istruzione,
a scelta del programmatore (sebbene esistano delle convenzioni)
• I registri speciali non sono registri generali, quindi non possono
essere utilizzati dalle istruzioni normali
• Esistono istruzioni speciali per gestire i registri speciali:
• Istruzioni “Branch” e “Jump” per il PC
• Istruzioni mthi, mtlo, mfhi, mflo per LO ed HI
© 2002-2004 Alberto Montresor, Riccardo Solmi
26
13
Istruzioni e pseudoistruzioni
ƒ
Istruzioni
•
Un’istruzione inizia con una parola riservata (keyword) e continua a
seconda della sua sintassi
•
Ad ogni istruzione del linguaggio macchina MIPS corrisponde
un’istruzione del linguaggio assembly
Es:
ƒ
bne reg1, reg2, address (branch if not equal)
Pseudoistruzioni:
•
Una pseudoistruzione è una istruzione fornita dall’assembler ma non
implementata in hardware
•
blt reg1, reg2, address (branch if less than)
Es:
diventa:
slt $at, reg1, reg2 (set less than)
bne $at, $zero, address (branch if not equal)
© 2002-2004 Alberto Montresor, Riccardo Solmi
27
SPIM
ƒ Cos’è SPIM e cosa fa?
• SPIM è un simulatore che esegue programmi per
l’architettura MIPS32
• SPIM può leggere ed assemblare programmi scritti in
linguaggio assembly MIPS
• SPIM contiene inoltre un debugger per poter analizzare il
funzionamento dei programmi prodotti
ƒ Utilizzeremo SPIM per tutti gli esercizi in linguaggio
assembly che vedremo
© 2002-2004 Alberto Montresor, Riccardo Solmi
28
14
Uso di un simulatore
ƒ Perché utilizzare un simulatore MIPS ?
• Ambiente controllato:
• Controllo degli errori
• Meccanismi di debug più sofisticati (potenzialmente)
• Possibilità di utilizzare un ambiente MIPS in qualunque tipo
di ambiente (uniformità):
• A casa con Windows, MacOS o Linux su macchine x86
o PowerPC
• In laboratorio con Linux su macchine x86
• L’alternativa più comune (assembly x86) è molto complessa
e non adatta ad un corso del primo anno
© 2002-2004 Alberto Montresor, Riccardo Solmi
29
SPIM
ƒ
Dove trovare SPIM?
•
ƒ
ƒ
ƒ
http://www.cs.wisc.edu/~larus/spim.html
Esistono due versioni di SPIM
•
MacOS/Linux/Unix (xspim)
•
Windows (PCSpim)
Per installare SPIM nella versione Windows
•
Scaricate pcspim.zip (archivio di installazione)
•
Scompattate e fate doppio clic su Setup
•
Seguite le indicazioni …
Per eseguire SPIM nella versione Windows
•
Trovate la voce PCSpim nel menu programmi
© 2002-2004 Alberto Montresor, Riccardo Solmi
30
15
SPIM
ƒ Per installare SPIM nella versione Unix/Linux
• Scaricate spim.tar.gz
• Scompattatelo (tar zxvf spim.tar.gz)
• Spostatevi nella directory spim-7.0
• Digitate make install per compilare spim e xspim
• Installazioni più complesse possono essere realizzate
seguendo le indicazioni nel file Readme
ƒ Per eseguire SPIM nella versione Unix/Linux
• Digitate xspim (avendo cura di fare in modo che il file
xspim sia nel vostro path)
© 2002-2004 Alberto Montresor, Riccardo Solmi
31
Interfaccia di PCSpim
© 2002-2004 Alberto Montresor, Riccardo Solmi
32
16
Interfaccia di XSPIM
© 2002-2004 Alberto Montresor, Riccardo Solmi
33
Interfaccia utente: sezione registri
ƒ Sezione registers:
• Mostra il valore di tutti i registri della CPU e della FPU
MIPS
• Notare che i registri generali vengono identificati sia dal
numero progressivo (R29) che dall’identificatore
mnemonico ($sp)
• Il valore dei registri viene aggiornato ogni qualvolta il
vostro programma viene interrotto
ƒ Pannello di controllo (in xspim) o menù (in PCSpim)
• Contiene i comandi che possono essere utilizzati su SPIM,
come ad esempio run, load, etc.
© 2002-2004 Alberto Montresor, Riccardo Solmi
34
17
Interfaccia utente: sezione codice
ƒ Segmento text
• Mostra le istruzioni dei vostri programmi e del codice di
sistema che viene caricato automaticamente alla partenza di
SPIM
• La prossima istruzione da eseguire viene evidenziata
invertendo il colore della linea contenente l’istruzione
ƒ Le istruzioni vengono visualizzate nel seguente modo:
[0x00400020]
0x3c011001
lui $1, 4097 [Size]
[0x00400024]
0x8c240014
lw $4, 20($1) [Size]
[0x00400028]
0x34050000
ori $5, $0, 0
1
2
3
;
6: lw $a0, Size
;
7: li $a1, 0
4
© 2002-2004 Alberto Montresor, Riccardo Solmi
35
Visualizzazione istruzioni
ƒ
Descrizione degli elementi
1. Indirizzo esadecimale dell’istruzione
2. Codifica numerica esadecimale dell’istruzione in
linguaggio macchina
3. Descrizione mnemonica dell’istruzione in linguaggio
macchina
4. Linea effettiva presente nel file assembly che si sta
eseguendo
ƒ
Nota:
•
Ad alcune istruzioni assembly (pseudoistruzioni)
corrispondono più istruzioni in linguaggio macchina
© 2002-2004 Alberto Montresor, Riccardo Solmi
36
18
Interfaccia utente: sezioni dati e messaggi
ƒ Segmenti data e stack
• Mostra il contenuto del segmento dati e stack della memoria
del programma
• I valori contenuti nella memoria vengono aggiornati ogni
qualvolta il vostro programma viene interrotto
ƒ Sezione messaggi SPIM
• Utilizzata da SPIM per mostrare messaggi, come ad
esempio messaggi di errore
ƒ Console
• Shell in cui vengono visualizzati i messaggi stampati dai
vostri programmi
© 2002-2004 Alberto Montresor, Riccardo Solmi
37
Interfaccia utente: comandi principali
ƒ Comando LOAD (Unix) e File – Open (Windows)
• Carica un file scritto in assembly (estensione .s, .asm) e ne
assembla il contenuto in memoria
ƒ Comando RUN (Unix) e Simulator – Go (Windows)
• Esegue il programma, fino alla terminazione o fino
all’incontro di un breakpoint
ƒ Comando STEP (Unix) e Simulator – Step (Windows)
• Esegue il programma passo-passo, ovvero una istruzione
alla volta
• Questa modalità permette di studiare nel dettaglio il
funzionamento del programma
© 2002-2004 Alberto Montresor, Riccardo Solmi
38
19
Esercizio sull’uso di SPIM
ƒ Scrivete il seguente programma e dopo averlo caricato in
SPIM provate a seguirne passo a passo il funzionamento
.text
# TotaleSpese.s
.globl main
main:
loop:
la $t0, spese
lw $t1, ($t0)
add $t2, $t2, $t1
# chi assegna un valore iniziale a $t2?
addi $t0, $t0, 4
bnez $t1, loop
sw $t2, result
# al posto di result posso scrivere ($t0)?
jr $ra
.data
spese:
.word 15, 10, 8, 0 # cosa succede se contiene solo 0?
result:
.word 0
# che valore contiene alla fine?
© 2002-2004 Alberto Montresor, Riccardo Solmi
39
Appendice: Strumenti standalone per architettura MIPS
ƒ SPIM vs. un assembler standalone
• SPIM è solo uno strumento didattico; integra le funzionalità
di un assembler con quelle di un simulatore.
• In generale ho bisogno di un assembler che mi trasformi i
sorgenti in un eseguibile.
ƒ Compilatori come strumenti didattici
• Un compilatore di un linguaggio ad alto livello traduce i
costrutti del linguaggio in sequenze di istruzioni assembly
• Confrontare il codice assembly prodotto con il sorgente da
cui deriva è un ottimo strumento didattico.
© 2002-2004 Alberto Montresor, Riccardo Solmi
40
20
Compilatore gcc e assembler as
ƒ Tool a disposizione (in laboratorio, macchine Linux)
• gcc: compilatore C/C++, …
• prende in input un file C con estensione .c
• normalmente:
– ritorna un file eseguibile chiamato a.out
• con opzione –S:
– ritorna un file in assembly, stesso nome, ma con estensione .s
• con opzione –c:
– ritorna un file oggetto, stesso nome, ma con estensione .o
• as: assembler
• Prende in input un file in assembly con estensione .s
• Ritorna un file oggetto, stesso nome, ma con estensione
.o
© 2002-2004 Alberto Montresor, Riccardo Solmi
41
Cross-compiling
ƒ Nota:
• Le versioni di GCC installate in laboratorio producono
programmi eseguibili su processori x86
• Noi vorremmo utilizzare compilatori e assemblatori per
processori MIPS
ƒ Cross-compiling:
• Creazione di programmi eseguibili tramite compilatori
funzionanti su architetture diverse da quella target
• Esempio: utilizzo di PC per creare applicazioni per Palm
ƒ Nel laboratorio sono disponibili:
• mipsel-linux-gcc
• mipsel-linux-as
© 2002-2004 Alberto Montresor, Riccardo Solmi
42
21
Esempio di compilazione in più fasi
vinsanto:~> mipsel-linux-gcc -S prova.c
vinsanto:~> cat prova.s
.file
1 "prova.c"
.abicalls
# GNU C 2.7.2 [AL 1.1, MM 40] Linux/MIPSEL compiled by GNU C
# Cc1 defaults:
# -mgas -mabicalls
# Cc1 arguments (-G value = 0, Cpu = 3000, ISA = 1):
# -quiet -dumpbase -o
gcc2_compiled.:
.align 2
.LC0:
.string
.text
.align
.globl
.type
.ent
"The sum from 0 .. 100 is %d\n"
2
main
main,@function
main
43
© 2002-2004 Alberto Montresor, Riccardo Solmi
Esempio di compilazione in più fasi
main:
lw
.frame $fp,48,$31
.mask
0xd0000000,-8
.fmask 0x00000000,0
.set
noreorder
.cpload $25
.set
reorder
subu
$sp,$sp,48
.cprestore 16
sw
$31,40($sp)
sw
$fp,36($sp)
sw
$28,32($sp)
move
$fp,$sp
sw
$4,48($fp)
sw
$5,52($fp)
sw
$0,28($fp)
sw
$0,24($fp)
.L2:
© 2002-2004 Alberto Montresor, Riccardo Solmi
$2,24($fp)
slt
$3,$2,101
bne
$3,$0,.L5
j
.L3
.L5:
lw
lw
addu
sw
$2,28($fp)
$3,24($fp)
$2,$2,$3
$2,28($fp)
lw
addu
move
sw
j
$3,24($fp)
$2,$3,1
$3,$2
$3,24($fp)
.L2
la
lw
jal
$4,.LC0
$5,28($fp)
printf
.L4:
.L3:
44
22
Esempio di compilazione in più fasi
.L1:
move
lw
lw
addu
j
.end
$sp,$fp
$31,40($sp)
$fp,36($sp)
$sp,$sp,48
$31
main
.Lfe1:
.size
main,.Lfe1-main
© 2002-2004 Alberto Montresor, Riccardo Solmi
45
Esempio di compilazione in più fasi
vinsanto:~> mipsel-linux-as prova.s
vinsanto:~> mipsel-linux-objdump --all-headers prova.o
prova.o:
file format elf32-littlemips
prova.o
architecture: mips:3000,flags 0x00000011: HAS_RELOC, HAS_SYMS
start address 0x00000000
CONTENTS, ALLOC, LOAD, READONLY, DATA
SYMBOL TABLE:
00000000 l
.text 00000000 gcc2_compiled.
00000000 l
.rodata
00000000 .LC0
00000000 g
F .text 000000b4 main
00000000
O *UND* 00000000 _gp_disp
00000034 l
.text 00000000 .L2
00000050 l
.text 00000000 .L5
0000007c l
.text 00000000 .L3
00000064 l
.text 00000000 .L4
00000000
*UND* 00000000 printf
000000a0 l
.text 00000000 .L1
000000b4 l
.text 00000000 .Lfe1
46
© 2002-2004 Alberto Montresor, Riccardo Solmi
23