The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri L’ISA del DLX contiene 32 (R0-R31)...
Transcript of The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri L’ISA del DLX contiene 32 (R0-R31)...
1
Prof. G. Ascia
1
The DLX Assembly
Prof. G. Ascia
2
DLX Instruction Set Architecture
Concetti architetturali:Semplicità del load/store ISSemplicità nella decodifica (istruzioni a lunghezza fissa)
Caratteristiche32 General Purpose Registers 32 Floating Point Registers a singola precisione (condivisi con 16 FPRs a doppia precisione)La lunghezza di una word è di 32 bit.Indirizzamento della memory a byte, Big Endian, indirizzi di 32
2
Prof. G. Ascia
3
Registri
L’ISA del DLX contiene 32 (R0-R31) general-purpose registers da 32 bitI registri R1-R31 sono dei reali GP registers R0 contiene sempre il valore 0 e non può essere modificatoR31 è utilizzato per conservare l’indirizzo di ritorno per le istruzioni JAL e JALR
Prof. G. Ascia
4
Registri
Un registro può essere caricato conun byte (8-bit)un halfword (16-bit)una fullword (32-bit)
I bit dei registri sono numerati come 0-31, da sinistra a destra (0 è il bit più significativo, 31 è quello meno significativo).L’ordinamento dei byte è fatto in modo simile
BYTE 00 7
BYTE 18 15
BYTE 216 23
BYTE 324 31
3
Prof. G. Ascia
5
Registri Floating-Point
32 registri da 32 bit a singola precisione (F0, F1, .., F31)Condivisi con16 registri da 64 bit a doppia precisione (F0, F2, ..., F30)La più piccola unità indirizzabile è in un FPR è 32 bit
F0F1F2F3
F30F31
...
F0
F2
F30
...
Single-PrecisionFloating Point
Registers
Double-PrecisionFloating Point
Registers
Prof. G. Ascia
6
Registri speciali
Ci sono tre registri specialiPC, Program Counter, contiene l’indirizzo dell’istruzione dal leggere dalla memoria (32 bit) IAR, Interrupt Address Register, mantiene l’indirizzo di ritorno di 32 bit del programma interrottoquando una istruzione TRAP viene eseguita (32 bit) FPSR, Floating-Point Status Register, utilizzato nei conditional branch per valutare il risultato di una operazione FP (1 bit)
4
Prof. G. Ascia
7
Classi di Istruzioni
Il DLX contiene 92 istruzioni divise in 6 classiload & store instructionsmove instructionsarithmetic and logical instructionsfloating-point instructionsjump & branch instructionsspecial instructions
Prof. G. Ascia
8
Tipi di istruzioni
Tutte le istruzioni DLX sono di 32 bit e devono essere allineate in memoria a word.Esistono 3 formati delle istruzioni:
I-type (Immediate): manipolano dati forniti da un campo di 16 bit;R-type (Register): manipolano dati forniti da uno o due registri;J-type (Jump): per specificare l’indirizzo di salto non un registro;
5
Prof. G. Ascia
9
I-type Instructions (1 of 3)
Opcode
0 5
6
rs1
6 10
5
rd
11 15
5
immediate
16 31
16
load/store (word, u/s halfword, u/s byte)operazioni ALU con operando immediatotutte le istruzioni di salto condizionato (branch)JR, JALR
Prof. G. Ascia
10
I-type Instructions (2 of 3)
Opcode
0 5
6
rs1
6 10
5
rd
11 15
5
immediate
16 31
16
Opcode: istruzione DLX da eseguirers1: sorgente per l’ALU, indirizzo base per le Load/Store, registro da testare per i conditional branches, indirizzo destinazione per JR & JALRrd: destinazione per la Load e le operazioni ALU operations, sorgente per la store. (Non usato per conditional branches, JR eJALR) immediate: spiazzamento per calcolare l’indirizzo delle load e delle store, operando per l’ALU, spiazzamento esteso in segno da sommare al PC per calcolare l’indirizzo destinazione di un conditional branch. (non usato per JR e JALR)
6
Prof. G. Ascia
11
I-type Instructions (3 of 3)
Opcode0 5
6
rs1
6 10
5
rd11 15
5
immediate16 31
16
lw r3, 6(r2) ; rd=r3, rs1=r2, imm=6 ;r3=Mem[est_segno(6)+r2];
sw -7(r4),r3 ; rd=r3, rs1=r4, imm=7 ; Mem[est_segno(-7)+r4]=r3;
addi r1,r2,5 ; rd=r1, rs1=r2, imm=5 ; r1=r2+est_segno(5);
beqz r1,target ; rs1=r1, imm=target ; if(r1==0) PC=PC+est_segno(target)
jr r1 ; rs1=r1 ; PC=r1
Prof. G. Ascia
12
R-type Instructions
Sono usate per istruzioni che hanno come operandi dell’ALU solo registri, per leggere e scrivere su e da registri speciali (IARe FPSR), e per spostare valori tra i GPR e/o i FPR
R-R ALU0 5
6
rs1
6 10
5
rs2
11 15
5
16 31
rd unused func20 21 25 26
5 5 6
R-R FPU0 5
6
rs1
6 10
5
rs2
11 15
5
16 31
rd unused func20 21 25 26
5 6 5
addf f1,f2,f3 ;rd=f1, rs1=f2, rs2=f3
add r1,r2,r3 ;rd=r1, rs1=r2, rs2=r3
7
Prof. G. Ascia
13
J-type Instructions
Include jump (J), jump & link (JAL), TRAP e return from exception (RFE)
Opcode0 5
6
name6 31
26
name: spiazzamento con segno di 26 bit che è sommato all’indirizzo (PC+4) per generare l’indirizzo di destinazione. Per le TRAP esso specifica un indirizzo assoluto senza segno di 26 bit.
j target;PC=PC+est_segno(target)
Prof. G. Ascia
14
Load & Store GPR
LB (Load Byte), LBU (Load Byte Unsigned), LH (Load Half word), LHU (Load Half word Unsigned), LW (Load Word),SB (Store Byte), SH (Store Half word), SW (Store Word)
LB/LBU/LH/LHU/LW rd,immediate(rs1)SB/SH/SW immediate(rs1),rd
8
Prof. G. Ascia
15
Load & Store FPR
LF/LD Fd,immediate(rs1)SF/SD immediate(rs1),Fd
LF (Load Float), LD (Load Double), SF (Store Float), SD (Store Double)
Prof. G. Ascia
16
Arithmetic and Logical Instructions
Quattro categorie:aritmetichelogicheshiftset-on-comparison
Operano con valori con segno/senza segno memorizzati nei GPR e con immediato
Formato: R-type e I-type
9
Prof. G. Ascia
17
Arithmetic Instructions
ADD (add r1,r2,r3), SUB (sub r1,r2,r3), tratta il contenuto dei registri sorgente con segnooverflow exception
ADDU (addu r1,r2,r3), SUBU (subu r1,r2,r3), tratta il contenuto dei registri sorgente senza segno
ADDI, SUBI, ADDUI, SUBUI (addi r1,r2,17) come prima ma con un operando immediato
MULT,MULTU,DIV,DIVU (mult r1,r2,r3)
Prof. G. Ascia
18
Logical Instructions
AND, OR, XOR (and r1,r2,r3)operazione logica tra il contenuto di due registri
ANDI, ORI, XORI (andi r1,r2,16)operazione logica tra il contenuto di un registro e un immediato zero-extended
LHI (Load High Immediate) (lhi r1,0xff00) Piazza i 16 bit dell’immediate nella porzione più significativa del registro destinazione e riempie la parte restante con '0'Permette di creare una costante di 32 bit in un registro GPR reg con due istruzioni (LHI seguita da ADDI)
10
Prof. G. Ascia
19
Shift Instructions
SLL, SRL(sll r1,r2,r3 ; r1 = r2 << r3 (Fa lo shift di una quantità specificata dal valore di un registro GP
SLLI, SRLI(slli r1,r2,3 ; r1 = r2 << 3)
Fa lo shift di una quantità specificata dal valore immediato
Solo cinque bit vengono considerati
Prof. G. Ascia
20
Arithmetic and Logical InstructionsSet-On-Comparison Instructions
SLT, SGT, SLE, SGE, SEQ, SNE (slt r1,r2,r3 if (r2<r3) r1=1 else r1=0)(sle r1,r2,r3 if (r2<=r3)r1=1 else r1=0)(seq r1,r2,r3 if (r2==r3)r1=1 else r1=0)
Pone il registro destinazione a valore 1 se il risultato del confronto è 'true‘, al valore 0 altrimenti.
SLTI, SGTI, SLEI, SGEI, SEQI, SNEI(sgei r1,r2,5 if (r2 >= 5) r1=1 else r1=0)
Come prima ma con un argomento immediato (esteso in segno)
11
Prof. G. Ascia
21
Branch Instructions
BEQZ, BNEZ (I-type)
beqz r1,target if(r1==0) PC=PC+4+est_segno(target)
bnez r1,target if(r1==1) PC=PC+4+est_segno(target)
L’indirizzo destinazione è calcolato sommando all’immediato esteso in segno il PC+4.
Prof. G. Ascia
22
Move Instructions
Sono tutte nel formato R-type✓ MOVI2S, MOVS2I: GPR ↔ IAR (non implementata)
movi2s rd,rs1 ;rd∈∈∈∈SR, rs1∈∈∈∈GPRmovs2i rd,rs1 ;rd∈∈∈∈GPR, rs1∈∈∈∈SR
MOVF, MOVD: FPR ↔ FPRmovf rd,rs ;rd,rs∈∈∈∈FPRmovd rd,rs ;rd,rs∈∈∈∈FPR (indici pari)
MOVFP2I, MOVI2FP: GPR ↔ FPRmovfp2i rd,rs ;rd∈GPR, rs∈FPRmovi2fp rd,rs ;rd∈FPR, rs∈GPR
12
Prof. G. Ascia
23
Floating-Point InstructionsArithmetic instructions
ADDF, SUBF, MULTF, DIVF (float)addf f0,f1,f2subf f3,f4,f5multf f1,f2,f3divf f1,f2,f3
ADDD, SUBD, MULTD, DIVD (double)addd f0,f2,f4subd f2,f4,f6multd f4,f6,f8divd f6,f8,f10
Prof. G. Ascia
24
Floating-Point Instructions
Tre categoriearitmeticheconversioneSet-on-comparison
Tali istruzioni operano con valori FP memorizzati in un solo registro (per singola precisione) o in una coppia di registri (per doppia precisione) FP
Sono tutte nel formato R-type
13
Prof. G. Ascia
25
Floating-Point InstructionsConvert Instructions
CVTF2D (cvtf2d f6,f3) converte un float (f3) in double (f6)
CVTF2I (cvtf2i f5,f3) converte un float (f3) in integer (f5)
CVTD2F (cvtd2f f3,f4) converte un double (f4) in float (f3)
CVTD2I (cvtd2i f1,f4) converte un double (f4) in integer (f1)
CVTI2F (cvti2f f1,f3) converte un integer (f3) in float (f1)
CVTI2D (cvti2d f4,f1) converte un integer (f1) in double (f4)
Prof. G. Ascia
26
Floating-Point InstructionsSet-On-Comparison Instructions
LTF Fa,Fb; LTD Da,Db; Less Than Float/Double(if( Fa<Fb) FPSR=1; else FPSR=0;)
GTF Fa,Fb; GTD Da,Db; Greater Than Float/Double
LEF Fa,Fb; LED Da,Db; Less Than or Equal To Float/Double
GEF Fa,Fb; GED Da,Db; Greater Than or Equal To Float/Double
EQF Fa,Fb; EQD Da,Db; Equal To Float/Double
NEF Fa,Fb; NED Da,Db; Not Equal To Float/Double
14
Prof. G. Ascia
27
Branch Instructions
BFPT, BFPF (I-type)
bfpt labelif (fpsr==1) PC=PC+4+ est_segno(label)
bfpf labelif (fpsr==0) PC=PC+4+ est_segno(label)
L’indirizzo destinazione è calcolato sommando all’immediato esteso in segno il PC+4.
Prof. G. Ascia
28
Jump Instructions
J, JR, JAL, JALR
j target;PC=PC+4+est_segno(target)
jr r1;PC=r1
jal label;r31=PC+4; PC=PC+4+est_segno(label)
jal r1;r31=PC+4; PC= r1
15
Prof. G. Ascia
29
Procedure
La chiamata ad una procedura avviene mediantejal indirizzo_procedura;
Questa istruzione salva sul registro r31 l’indirizzo dell’istruzione successiva alla jal ( indirizzo di ritorno) e assegna a PC il valore dell’indirizzo della procedura
Al termine della procedura si ritorna all’istruzione successiva a quella chiamante la procedura mediantejr r31;
Questa istruzione salta all’indirizzo di ritorno contenuto in r31
Prof. G. Ascia
30
Procedure che chiamano altre procedure
Nel caso di una procedure A che chiama una procedure B, prima di chiamare B è necessario salvare sullo stack il valore del registro r31 ovvero l’indirizzo di ritorno di A.Senza il salvataggio di r31 la chiamata di B mediante jal renderebbe irrecuperabile l’indirizzo di ritorno del chiamante di A.Al termine della procedura B viene ripristinato il valore dell’indirizzo di ritorno di A copiando in r31 il valore in cima allo stack.L’indirizzo della cima dello stack è conservato nel registro r29.
16
Prof. G. Ascia
31
Esempio di chiamata di una procedura
A: …jal B;
B: …addi r29, r29,4;sw 0(r29),r31;jal C;lw r31, 0(r29);subi r29, r29, 4;…jr r31;
C: …jr r31;
Prof. G. Ascia
32
Passaggio dei parametri di una procedure
Il passaggio dei parametri avviene mediante i registri r2,r3,r4,r5;Se la procedura chiamata deve modificare il valore dei registri, essi devono essere salvati sullo stack prima di eseguire le istruzioni della procedure e, al termine della procedure, i valori originali dei registri vengono ripristinati leggendoli dalla cima allo stack.
17
Prof. G. Ascia
33
Programmazione Assembly
Funzioni dell’AssemblatoreTraduzione da linguaggio mnemonico a linguaggio macchina (Produzione del modulo oggetto) Analisi sintattica
Tipi di Istruzioni dell’AssemblatoreIstruzioni macchina (relative alla fase di esecuzione) Istruzioni per l’Assemblatore (direttive: relative alla fase di traduzione).
Prof. G. Ascia
34
Traduzione del codice Assembler
La traduzione viene realizzata in due passate consecutive.Nella prima passata l’assembler raccoglie tutte le etichette Inizio : Istruzione
e calcola l’indirizzo di memoria ad esse corrispondente.In questa prima passata costruisce la tabella dei simboli, associando ad ogni simbolo l’indirizzo di memoria ad esso associato.
Nella seconda passata le istruzioni avviene la sostituzione di valori numerici al posto dei simboli:
Propri del linguaggio (codici operativi, registri, etc.)Definiti dal programmatore (indirizzi e costanti)
18
Prof. G. Ascia
35
Traduzione del codice Assembler
La necessità di una doppia passata è dovuta alla possibilità di riferimenti in avanti ( uso di una etichetta prima della sua definizione).
Il file prodotto dall’assembler è chiamato file oggetto. Esso può contenere dei riferimenti irrisolti a sottoprogrammmi o dati definiti in altri file.
Un’etichetta è esterna se l’oggetto che l’etichetta indica può essere nominata anche in file diversi da quello in cui l’etichetta èdefinita. (talvolta esse vengono chiamate globali).Un’etichetta è locale se può essere usata solo nel file in cui èdefinita.
L’assembler è in grado di risolvere solo le etichette locali.
Il compito di risolvere i riferimenti esterni è demandato al linker.
Prof. G. Ascia
36
Il Linker
Il Linker (detto anche Loader) deve:Costruire l’eseguibile a partire dai vari moduli oggettoSegnalare gli errori di linking (simboli mancanti e/o duplicati)Creare una mappa della memoria (Opzionale)
19
Prof. G. Ascia
37
Direttive per l’assembler
Le direttive per l’assembler iniziano con il simbolo .
. data <ind> Il codice generato dopo questa direttiva viene allocato nel segmento dei dati.
Se specificato l’indirizzo (facoltativo) ind, l’allocazione inizia a partire dall’indirizzo ind.
. text <ind> Il codice generato dopo questa direttiva viene allocato nel segmento testo.
In questa sezione possono essere presenti solo istruzioni macchina e word allocate mediante la direttiva .word.
Prof. G. Ascia
38
Direttive
.word w1, w2, .., wn Memorizzazione dei valori a 32 bit w1, w2, .., wn in locazioni di memoria consecutive..half h1, h2, .., hn Memorizzazione dei valori a 16 bit h1, h2, .., hn in locazioni di memoria consecutive..byte b1, b2, .., bn Memorizzazione dei valori a 8 bit b1, b2, .., bn..float f1, f2, .., fn Memorizzazione dei numeri reali a singola precisione f1, f2, .., fn in locazioni di memoria consecutive..double d1, d2, .., dn Memorizzazione dei numeri reali a doppia precisione d1, d2, .., dn in locazioni di memoria consecutive.
20
Prof. G. Ascia
39
Direttive
.align n Allineamento dei dati da scrivere in memoria all’indirizzo modulo 2n immediatamente successivo..ascii str Memorizzazione della sequenza di caratteri ASCII corrispondenti alla stringa str, senza inserire il carattere terminale 0. .asciiz str Memorizzazione della sequenza di caratteri ASCII corrispondenti alla stringa str, terminandola con il carattere 0..space n Allocazione di n byte di spazio nel segmento dati.
Prof. G. Ascia
40
Direttive
.global label Rende la label disponibile per riferimenti provenienti da istruzioni macchina relativo ad altri moduli
21
Prof. G. Ascia
41
Traps - The System Interface (1 of 2)
Le trap costituiscono l’interfaccia tra i programmi DLX e il sistema di I/O.Sono definite cinque trap in WinDLXEsse sono:
Trap #0: Termina un programmaTrap #1: Apre un FileTrap #2: Chiude FileTrap #3: Legge un blocco da FileTrap #4: Scrive un blocco su FileTrap #5: Output formattato per lo Standard-Output
Prof. G. Ascia
42
Traps - The System Interface (2 of 2)
Per tutte le trap:Esse corrispondono alle funzioni C open(), close(), read(), write() e printf()i descrittori di file 0,1 ad 2 sono riservati per stdin, stdout e stderrL’indirizzo dei parametri per la chiamata di sistema deve essere caricato nel registro R14Tutti i parametri devono essere di 32 bit I risultato è restituito nel registro R1
22
Prof. G. Ascia
43
Trap 1 apertura di un file
Parameter1. filename: Address of a zero-terminated string, that contains the path of the file to be opened.2. mode, to open the file. Following modes can be combined using logical or-operation:
0x0001 O_RDONLY (read only)0x0002 O_WRONLY (write only)0x0004 O_RDWR (read and write)0x0100 O_CREATE (create file)0x0200 O_TRUNC (truncate file)0x0400 O_EXCL (open file exclusively (with SHARE))0x0800 O_APPEND (append to file)0x4000 O_TEXT (Convert CR/LF)0x8000 O_BINARY (No conversion of CR/LF)
3. Additional Flags:0x0000 S_IFREG (Normal file, no directory etc.)0x0100 S_IREAD (read access permission)0x0080 S_IWRITE (write access permission)0x0040 S_IEXEC (execute permission)
The file descriptor is returned in register R1.
Prof. G. Ascia
44
Trap 1 esempio di apertura di un file
.data
FileName: .asciiz "D:\\Temp\\Dati.DAT".align 2
Par:;*** Parameters for Trap1 (OPEN).word FileName;create for R/W:.word 0x0104;R/W-access permission:.word 0x0180
FileDescr: .space 4
.text
addi r14,r0,Par; trap 1sw FileDescr,R1
23
Prof. G. Ascia
45
Trap 2 Chiusura di un file
Parameter:
1. File descriptor of the file to be closed.
Zero is returned in register R1, if it was successful, -1 otherwise.
.data
FileName: .asciiz "D:\\Temp\\dati.DAT”.align 2
Par:.word FileName, 0x0104, 0x0180
FileDescr: .space 4
.text
addi r14,r0,FileDescr trap 2
Prof. G. Ascia
46
Trap 3 Lettura da file
A file block or a line from stdin can be read with this trap.
Parameter:
1. File descriptor of the file
2. Address, for the destination of the read operation
3. Size of block (bytes) to be read
The actual number of bytes read is returned in register R1.
24
Prof. G. Ascia
47
Trap 3 Esempio di lettura da file
.data
buffer: .space 50
FileName: .asciiz "D:\\Temp\\dati.DAT”.align 2
Par:.word FileName, 0x0001, 0x0100
FileDescr: .space 4.word buffer.word 50
.text
addi r14,r0,Par; trap 1sw FileDescr,R1
;readaddi r14,r0,FileDescr ; trap 3
Prof. G. Ascia
48
Trap 3 – Lettura da stdin
Non serve aprire esplicitamente lo stdin mediante la trap 1Parametro:
Descrittore dello stdin : 0Indirizzo,per la destinazione dell’operazione di letturaNumero di blocchi (byte) da leggere
Il numero di byte è restituito R1
.data
buffer: .space 64FileDesc: .word 0, buffer, 64
.textaddi r14,r0,FileDesctrap 3
trap 0
25
Prof. G. Ascia
49
Trap 4 Scrittura su file
A block can be written to the memory or the standard output.Parameter:
1. File descriptor of file2. Address of block to be written3. Size of the block (bytes)
The actual number of bytes written is returned in register R1.
Prof. G. Ascia
50
Trap 4 Scrittura su file
.data
buffer: .space 50
FileName: .asciiz “D:\\Temp\\dati.DAT”.align 2Par:
.word FileName, 0x0104, 0x0180
FileDescr: .space 4.word buffer.word 50
.text
addi r14,r0,Par; trap 1sw FileDescr,R1
addi r14,r0,FileDescr; trap 4
26
Prof. G. Ascia
51
Trap 5 - Formatted Output to Standard Out
Parametro:Stringa formattata: guardare la funzione C printf()Argomenti: in accordo alla stringa di formato
Il numero di byte trasferiti allo stdout è restituito in R1.data
msg: .asciiz "Hello World!\nreal:%f, integer:%d\n".align 2
msg_addr: .word msg.double 1.23456.word 123456
.textaddi r14,r0,msg_addrtrap 5trap 0
Prof. G. Ascia
52
Esempio: Input Unsigned (C code)
Legge una stringa dal stdin e la converte in decimaleint InputUnsigned(char *PrintfPar) {
char ReadPar[80];int i, n;char c;printf(“%s”, PrintfPar);scanf(“%s”, ReadPar);i = 0;n =0;while (ReadPar[i] != '\n') {
c = ReadPar[i] - 48;n = (n * 10) + c;i++
}return n;
}
27
Prof. G. Ascia
53
Esempio: Input Unsigned
Legge una stringa dal stdin e la converte in decimale;expect the address of a zero-;terminated prompt string in R1;returns the read value in R1;changes the contents of registers R1,R13,R14
.data
;*** Data for Read-TrapReadBuffer: .space 80ReadPar: .word 0,ReadBuffer,80
;*** Data for Printf-TrapPrintfPar: .space 4
SaveR2: .space 4SaveR3: .space 4SaveR4: .space 4SaveR5: .space 4
Prof. G. Ascia
54
Esempio: Input Unsigned
.text
.global InputUnsignedInputUnsigned:
;*** save register contentssw SaveR2,r2sw SaveR3,r3sw SaveR4,r4sw SaveR5,r5;*** Promptsw PrintfPar,r1addi r14,r0,PrintfPartrap 5
;*** call Trap-3 to read lineaddi r14,r0,ReadPartrap 3
;*** determine valueaddi r2,r0,ReadBufferaddi r1,r0,0addi r4,r0,10 ;Dec system
Loop:;*** reads digits to end of linelbu r3,0(r2) seqi r5,r3,10 ;LF -> Exitbnez r5,Finishsubi r3,r3,48 ;´́́́0´́́́multu r1,r1,r4 ;Shift decimaladd r1,r1,r3addi r2,r2,1 ;inc pointerj Loop
Finish: ;*** restore old regs contentslw r2,SaveR2lw r3,SaveR3lw r4,SaveR4lw r5,SaveR5jr r31 ; Return
28
Prof. G. Ascia
55
Esempio: Fattoriale (1/2)
.dataPrompt: .asciiz "A value >1: "
PrintfFormat: .asciiz "Factorial = %g\n\n".align 2
PrintfPar: .word PrintfFormat
PrintfValue: .space 8
.text
.global mainmain:
;*** Read from stdin into R1addi r1,r0,Promptjal InputUnsigned
Prof. G. Ascia
56
Esempio: Fattoriale (2/2)
;*** init valuesmovi2fp f10,r1cvti2d f0,f10 ;D0..Count registeraddi r2,r0,1movi2fp f11,r2cvti2d f2,f11 ;D2..resultmovd f4,f2;D4..Constant 1
Loop:;*** Break loop if D0 = 1led f0,f4;D0<=1 ?bfpt Finish
;*** Multiplication and next loopmultdf2,f2,f0subd f0,f0,f4j Loop
Finish: ;*** write result to stdoutsd PrintfValue,f2addi r14,r0,PrintfPartrap 5trap 0
29
Prof. G. Ascia
57
Somma tra gli elementi di un vettore (1).data
vett: .space 20
msg_lett: .asciiz "\nInserire un numero\n"
msg_somma: .asciiz "\nLa somma e' %d"
.align 2
msg_sm_addr: .word msg_somma
somma: .space 4
.text
.global main
main: addi r3,r0,5
addi r2,r0, 0
loop_lett: addi r1,r0,msg_lett
jal InputUnsigned
sw vett(r2), r1
addi r2,r2,4
subi r3,r3,1
bnez r3, loop_lett
Prof. G. Ascia
58
Somma tra gli elementi di un vettore (2)
calcolo: addi r3,r0,5
addi r2,r0,0
addi r4,r0,0
loop_somma: lw r5,vett(r2)subi r3,r3,1
add r4,r4,r5
addi r2,r2,4
bnez r3,loop_somma
stampa: sw somma(r0),r4
addi r14,r0, msg_sm_addr
trap 5
fine: trap 0
30
Prof. G. Ascia
59
Esempio: Minimo (1/4)
.data
vett: .space 20
msg_lettura: .asciiz "\nInserire un numero"
msg_stampa: .asciiz "\nIl minimo e' %d e si trova in posizione %d"
.align 2
msg_stampa_addr: .word msg_stampa
minimo: .space 4
posmin: .space 4
Prof. G. Ascia
60
Esempio: Minimo (2/4).text
.global main
main: addi r2,r0,0
loop_lettura:addi r1,r0,msg_lettura
jal InputUnsigned
sw vett(r2), r1
addi r2, r2,4
slti r3,r2,20
bnez r3, loop_lettura
31
Prof. G. Ascia
61
Esempio: Minimo (3/4)
calcolo_min: addi r2,r0,0
addi r3,r0,5
addi r6,r0,0
lw r5, vett(r2)
loop_min: addi r2,r2,4
subi r3,r3,1
lw r4, vett(r2) if_Vi_min: slt r15, r4,r5
beqz r15, fine_ciclo_min
add r5,r0,r4
srli r6,r2,2
fine_ciclo_min: bnez r3, loop_min
Prof. G. Ascia
62
Esempio: Minimo (4/4)
stampa: sw minimo(r0),r5
sw posmin(r0), r6
addi r14,r0,msg_stampa_addr
trap 5
fine: trap 0