You are on page 1of 4

MIPS ASSEMBLY LANGUAGE DESCRIZIONE MINIMALE DEL FUNZIONAMENTO DEL MIPS -Il MIPS un LINGUAGGIO ASSEMBLY di basso livello.

. -L'assemblatore (ASSEMBLER) si occupa di codificare l'assembler del suddetto lin guaggio in CODICE OGGETTO (configurazione binaria immediatamente eseguibile dal processore). -Ogni riga pu contenere al massimo una istruzione -Un commento si inizia con il carattere sharp # -Essenzialmente il MIPS possiede tre tipi di istruzioni: -Aritmetico/Logiche -In queste istruzioni il primo registro sempre la destinazione dell'opearazion e (tranne che nella divisione e nella moltiplicazione) -Load & Store -In queste istruzione il primo argomento sempre il registro su cui si carica i l dato o da cui si legge il dato -Condizionale (istruzioni di ciclo) -Il MIPS composto da registri da 32 bit. -I Registri del MIPS sono: -PC (Programm Counter) -contiente l'indirizzo in cui si trova la prossima istruzione da eseguire -generalmente viene incrementato ad ogni esecuzione di un istruzione -controlla il flusso del programma -32 Registri General Purpose(0..31) -sono numerati da 0 a 31 ($0,$1,...,$31) -hanno anche nomi simbolici ($s0,$t0,...) -ogni registro pu essere utilizzato sia tramite il suo nome simbolico che trami te il suo numero ($4 <-> $a0) -Il primo e l'ultimo registro sono speciali cio: -$0 rappresenta la costante 0 -$31 (chiamato anche $ra) contiente l'indirizzo di ritorno di una procedura -Una WORD da 32 bit -La memoria e organizzata a SINGOLI BYTE (8 bit) mentre i registri a gruppi di 4 BYTE (32 bit) cio a WORD -Il MIPS lavora in BIG ENDIAN (memorizza i byte partendo dal MSB) -Nel MIPS sono definiti tre diversi tipi di strutture delle istruzioni - R-> | opcode(6) | rs(5) | rt(5) | rd(5) | shamt(5) | funct(6) | R=registro - I-> | opcode(6) | rs(5) | rt(5) | immediate(16) | I=immediato - J-> | opcode(6) | address(26) | J=jump ed su questo particolare ordine che vengono codificate le istruzioni in binario -Un generico codice scritto nell'assembly del MIPS strutturato in tre parti: -.data -definisce il data segment del programma -le variabili devono essere dichiarate in questo punto -l'assembler allocher spazio ed inizializzer le variabili -una nuova variabile deve essere cosi strutturata -nome: (etichetta)

-.tipo (BYTE,HALF,WORD,FLOAT,DOUBLE,ASCII,ASCIIZ,SPACE) -BYTE = valori a 8 bit -HALF = valori a 16 bit -WORD = valori a 32 bit -FLOAT = valori floating point a singola precisione -DOUBLE = valori floating point a doppia precisione -ASCII = valori come stringa ascii -ASCIIZ = valori come stringa ascii terminata da NULL -SPACE = alloca spazio per n bytes non inizializzati (in questo caso il val ore che lo segue non lo inizializza ma il numero di bytes da allocare) -valore (valore a cui inizializzare la variabile) -.text -definisce il code segment di un programma (esso contiene le istruzioni) -.globl -dichiara un elemento come globale -gli elementi globali possono essere riferiti da altri file -il MAIN di un programma viene dichiarato in questa sezione -L'istruzione .align n allinea i dati definiti successivamente in blocchi da 2^n byte -L'assembly del MIPS permette anche di utilizzare funzioni -esse vengono inserite tramite un etichetta che identificher il nome della funzi one e possono essere scritte dopo la syscall di chiusura del main -per chiamare la funzione si usa la jal <etichetta> in modo tale da salvare l'a ttuale PC nel registro $ra per poter poi ritornare in quel punto -come return a fine funzione si utilizza il jr $ra che permette appunto di salt are all'indirizzo contenuto nel registro $ra che conteneva il vecchio pc -per passare i parametri e sufficiente utilizzare una memoria visibile a tutti (registri o stack) -chiaramente poich i registri sono gli stessi per tutti necessario salvare lo s tato dei registri che si andranno ad utilizzare nelle funzioni per poi rispristi narlo a funzione ultimata -per lavorare con lo stack si deve far utilizzo del registro $sp -al registro $sp (che parte inizialmente da 100 che sono il numero di byte r iservati allo stack) va sempre aggiunta una quantit negativa pari al numero di by te che si intendono memorizzare -al registro $sp in fase di recupero dei dati bisogna riaggiungere la quanti t sottratta in fase di memorizzazione per riportarlo in testa allo stack -sia in fase di memorizzazione che di recupero dei dati $sp va utilizzato co me parametro dell'offset per lw e sw o chi per loro SINTASSI MINIMALE DEL MIPS //1)Operazioni aritmetiche add $d, $s, $t addi $t, $s, cost div $s, $t mult $s, $t sub $d, $s, $t ; ; ; ; ; s=s+t t=s+costante //presenti di queste 2 anche addu e addiu LO=int(s/t) HI=s%t //presente di questa anche la divu LO=s*t //presente di questa anche la multu d=s-t //di questa esiste anche la subu

//2)Operazioni logiche and $d, $s, $t andi $t, $s, cost or $d, $s, $t ori $t, $s, cost xor $d, $s, $t ; ; ; ; ; d=s & t //and bit-a-bit t=s & cost //and bit-a-bit con costante d=s | t or bit-a-bit t=s | cost or bit-a-bit d=s(xor)t

xori $t, $s, cost ; t=s(xor)cost //3)Memorizzazione, caricameto e movimento sb $t, offset($s) ; memorizza il byte meno significativo di t nell'indirizzo di memoria indicato da [s+offset] sw $t, offset($s) ; memorizza la word contenuta in t nell'indirizzo di memoria indicato da [s+offset] lb $t, offset($s) ; t=MEM[s+offset] carica il byte indicato dall'indirizzo [s+o ffset] nel registro t lui $t, cost ; carica in t la parte alta della costante lw $t, offset($s) ; t=MEM[s+offset] carica la word indicata dall'indirizzo [s+o ffset] nel registro t li $t, cost ; t=cost la $t, address ; t=indirizzo di memoria (o etichetta) mfhi $d ; d=HI sposta il contenuto del registro HI nel registro d mflo $d ; d=LO sposta il contenuto del registro LO nel registro d move $t, $s ; t=s //4)Controlli e salti beq $s, $t, offset bne $s, $t, offset bgez $s, offset bgtz $s, offset blez $s, offset bltz $s, offset slt $d, $s, $t slti $t, $s, cost ltu e sltiu j target jr $s jal target ; ; ; ; ; ; ; ; if(s==t)then offset if(s!=t)then offset if(s>=0)then offset if(s>0)then offset if(s<=0)then offset if(s<0)then offset if(s<t) then d=1 else d=0 if(s<cost) then t=1 else t=0 //di queste 2 esistono anche s

; goto target ; salto all'indirizzo contenuto in s ; goto target e salva l'attuale PC in $ra

//5)Funzioni di sistema noop ; no operation syscall ; genera un interrupt (indispensabile per input ed output) // in particolare si sceglie il tipo di interrupt caricando il codice corrispettivo nel registro $v0 //6)Lista basilare di funzioni per la syscall Service Results Code in $v0 Arguments $a0 = integer to print $f12 = float to print $a0 = address of null-te $a0 = character to print $a0 = address of input b

print integer 1 print float 2 print string 4 rminated string to print print character 11 read integer 5 $v0 contains ____________integer read read float 6 $f0 contains float ____________read read string 8 uffer | $a1 = maximum number of characters to read read character 12 $v0 contains ____________character read

exit (terminate execution)

10

You might also like