PROGETTO DI UN SISTEMA BASATO SU mP PROBLEMA REALE SVILUPPO HARDWARE SVILUPPO SOFTWARE INTEGRAZIONE DEL SISTEMA Università di Pavia - corso di Calcolatori Elettronici 1 SVILUPPO HARDWARE SPECIFICHE PROGETTO DEL CIRCUITO SCHEDA DI PROVA REALIZZ. PROTOTIPO DEBUG HARDWARE Università di Pavia - corso di Calcolatori Elettronici 2 SVILUPPO SOFTWARE SPECIFICHE FLOW CHART STESURA SORGENTE ASSEMBLATORE/COMPILATORE LINKER DEBUG SW (SIMULAZIONE) Università di Pavia - corso di Calcolatori Elettronici 3 INTEGRAZIONE HW/SW HW INTEGRAZIONE SW RICERCA ERRORI (EMULAZIONE REAL TIME) ROM PROGRAM COSTRUZIONE Università di Pavia - corso di Calcolatori Elettronici 4 EMULAZIONE IN TEMPO REALE SISTEMA DI SVILUPPO PROTOTIPO ICE: In Circuit Emulator MEMORIA DI EMULAZIONE CPU MEMORIA DEL PROTOTIPO Università di Pavia - corso di Calcolatori Elettronici 5 CREAZIONE DI UN ESEGUIBILE • • • Source file Assembler Object file Source file Assembler Object file Linker Source file Assembler Object file Program library Executable file Utilizzo di linguaggio assemblativo quando occupazione di memoria e velocità sono critici (sistemi embedded e applicazioni real time) Approccio ibrido con parti scritte in linguaggio ad alto livello e parti critiche scritte in linguaggio assemblativo Svantaggi: lunghezza, leggibilità, portabilità High-level language program Program Compiler Assembler Linker Computer Assembly language program Università di Pavia - corso di Calcolatori Elettronici 6 MEMORIA 7fffffffhex Suddivisione in 3 segmenti: • testo: istruzioni di programma a partire da 0x400000 • dati a partire da 0x10000000 (statici e dinamici) • stack: a partire da 0x7fffffff (si espande in senso opposto all’area dati) Stack segment Dynamic data Static data Data segment 10000000hex Text segment 400000hex Reserved Università di Pavia - corso di Calcolatori Elettronici 7 xspim PC Status SPIM •Interfaccia Windows/Unix •Display dei registri BadVaddr = 00000000 = 00000000 = 00000000 R0 R1 R2 R3 R4 R5 R6 R7 (r0) (at) (v0) (v1) (a0) (a1) (a2) (a3) = = = = = = = = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 R8 R9 R10 R11 R12 R13 R14 R15 = = = = 0.000000 0.000000 0.000000 0.000000 FP8 FP10 FP12 FP14 (t0) (t1) (t2) (t3) (t4) (t5) (t6) (t7) = = = = = = = = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 R16 R17 R18 R19 R20 R21 R22 R23 (s0) (s1) (s2) (s3) (s4) (s5) (s6) (s7) = = = = = = = = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 R24 R25 R26 R27 R28 R29 R30 R31 0.000000 0.000000 0.000000 0.000000 FP24 FP26 FP28 FP30 (t8) (s9) (k0) (k1) (gp) (sp) (s8) (ra) = = = = = = = = 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 = = = = 0.000000 0.000000 0.000000 0.000000 Double floating-point registers FP0 FP2 FP4 FP6 = = = = 0.000000 0.000000 0.000000 0.000000 FP16 FP18 FP20 FP22 = = = = Single floating-point registers Control buttons quit load run step clear print breakpt help terminal mode set value Text segments Text segments •Pulsanti di controllo (Unix) •Segmento testo: istruzioni Cause LO = 00000000 = 00000000 General registers •Simulatore: software che esegue programmi scritti Register display in linguaggio assemblativo MIPS (debugging) •Pseudoistruzioni che vengono tradotte in sequenze di istruzioni MIPS EPC HI = 00000000 = 00000000 [0x00400000] [0x00400004] [0x00400008] [0x0040000c] [0x00400010] [0x00400014] [0x00400018] [0x0040001c] 0x8fa40000 0x27a50004 0x24a60004 0x00041080 0x00c23021 0x0c000000 0x3402000a 0x0000000c lw $4, 0($29) addiu $5, $29, 4 addiu $6, $5, 4 sll $2, $4, 2 addu $6, $6, $2 jal 0x00000000 [main] ori $2, $0, 10 syscall ; ; ; ; ; ; ; ; 89: 90: 91: 92: 93: 94: 95: 96: lw $a0, 0($sp) addiu $al, $sp, 4 addiu $a2, $al, 4 sll $v0, $a0, 2 addu $a2, $a2, $v0 jal main li $v0 10 syscall Data segments Data and stack segments •Segmenti dati e Stack •Messaggi SPIM messages [0x10000000] ... [0x10010000] 0x00000000 [0x10010004] 0x74706563 0x206e6f69 [0x10010010] 0x72727563 0x61206465 [0x10010020] 0x000a6465 0x495b2020 [0x10010030] 0x0000205d 0x20200000 [0x10010040] 0x61206465 0x65726464 [0x10010050] 0x642f7473 0x20617461 [0x10010060] 0x555b2020 0x696c616e [0x10010070] 0x73736572 0x206e6920 0x636f2000 0x6920646e 0x7265746e 0x616e555b 0x69207373 0x63746566 0x64656e67 0x726f7473 SPIM Version 5.9 of January 17, 1997 Copyright (c) 1990– 1997 by James R. Larus ([email protected]) All Rights Reserved. See the file README for a full copyright notice. 0x726f6e67 0x74707572 0x6e67696c 0x6e69206e 0x00205d68 0x64646120 0x00205d65 SPIM: versione per Windows Università di Pavia - corso di Calcolatori Elettronici 9 Principali Direttive per l’assemblatore MIPS .ascii stringa .asciiz stringa .byte b1, … , bn .data <indirizzo> .float f1, … , fn .double d1 , … , dn .globl simbolo .text <indirizzo> .word w1 , … , wn .space n Università di Pavia - corso di Calcolatori Elettronici 10 SYSCALL PROGRAMMA UTENTE SPIM PREPARAZIONE CHIAMATA CHIAMATA ESPLETAMENTO SERVIZIO RITORNO RISULTATI SPIM fornisce tramite System Call (Syscall) servizi analoghi a quelli del sistema operativo. Syscall vista come l’invocazione di una subroutine. Passaggio parametri alla syscall attraverso $a0-$a3, se interi, o $f12, se in virgola mobile; codice della chiamata attraverso $v0. Risultati restituiti in $v0, o $f0, se in virgola mobile. Se ci sono più parametri si usa la memoria. Università di Pavia - corso di Calcolatori Elettronici 11 Syscall - Esempio Per stampare sulla console “risposta =5”: .data #segmento dati str: COMANDO CODICE Input CHIAMATA Output Print_int 1 $a0 Print_float 2 $f12 Print_double 3 $f12 Print_string 4 Sa0 Read_int 5 $v0 Read_float 6 $f0 Read_double 7 $f0 Read_string 8 .asciiz “risposta =“ .text #segmento testo li $v0, 4 #chiamata print_string la $a0, str #stringa da stampare syscall li $v0, 1 #chiamata print_int li $a0, 5 #intero da stampare syscall $a0=buffer $a1=lungh. Università di Pavia - corso di Calcolatori Elettronici 12