Prof. G. Ascia The DLX Assembly 1 DLX Instruction Set Architecture Prof. G. Ascia Concetti architetturali: Semplicità del load/store IS Semplicità nella decodifica (istruzioni a lunghezza fissa) Caratteristiche 32 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 1 Registri Prof. G. Ascia L’ISA del DLX contiene 32 (R0-R31) general-purpose registers da 32 bit I registri R1-R31 sono dei reali GP registers R0 contiene sempre il valore 0 e non può essere modificato R31 è utilizzato per conservare l’indirizzo di ritorno per le istruzioni JAL e JALR 3 Registri Prof. G. Ascia 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 0 7 8 15 16 23 24 31 BYTE 0 BYTE 1 BYTE 2 BYTE 3 Un registro può essere caricato con 8 un byte (8-bit) 8 un halfword (16-bit) 8 una fullword (32-bit) 4 2 Registri Floating-Point Prof. G. Ascia 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 Single-Precision Floating Point Registers F0 F1 F2 F3 ... F30 F31 F0 F2 ... Double-Precision Floating Point Registers F30 5 Registri speciali Prof. G. Ascia Ci sono tre registri speciali PC, 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) 6 3 Classi di Istruzioni Prof. G. Ascia Il DLX contiene 92 istruzioni divise in 6 classi 8 load & store instructions 8 move instructions 8 arithmetic and logical instructions 8 floating-point instructions 8 jump & branch instructions 8 special instructions 7 Tipi di istruzioni Prof. G. Ascia 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; 8 4 I-type Instructions (1 of 3) Prof. G. Ascia load/store (word, u/s halfword, u/s byte) operazioni ALU con operando immediato tutte le istruzioni di salto condizionato (branch) JR, JALR 0 5 6 10 11 15 16 31 Opcode rs1 rd immediate 6 5 5 16 9 I-type Instructions (2 of 3) Prof. G. Ascia 0 56 10 11 15 16 31 Opcode rs1 rd immediate 6 5 5 16 Opcode: istruzione DLX da eseguire rs1: sorgente per l’ALU, indirizzo base per le Load/Store, registro da testare per i conditional branches, indirizzo destinazione per JR & JALR rd: destinazione per la Load e le operazioni ALU operations, sorgente per la store. (Non usato per conditional branches, JR e JALR) 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) 10 5 I-type Instructions (3 of 3) Prof. G. Ascia 0 56 10 11 15 16 31 Opcode rs1 rd immediate 6 5 5 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 PC=r1 ; rs1=r1 ; ; 11 R-type Instructions Prof. G. Ascia Sono usate per istruzioni che hanno come operandi dell’ALU solo registri, per leggere e scrivere su e da registri speciali (IAR e FPSR), e per spostare valori tra i GPR e/o i FPR 0 56 10 11 15 16 20 21 25 26 R-R ALU rs1 rs2 rd unused 6 5 5 5 5 add 31 func 6 r1,r2,r3 ;rd=r1, rs1=r2, rs2=r3 0 56 10 11 15 16 20 21 25 26 31 R-R FPU rs1 rs2 rd unused func 6 5 5 5 6 5 addf f1,f2,f3 ;rd=f1, rs1=f2, rs2=f3 12 6 J-type Instructions Prof. G. Ascia Include jump (J), jump & link (JAL), TRAP e return from exception (RFE) 0 5 6 Opcode 6 31 name 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) 13 Load & Store GPR Prof. G. Ascia 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 SB/SH/SW rd,immediate(rs1) immediate(rs1),rd 14 7 Load & Store FPR Prof. G. Ascia LF (Load Float), LD (Load Double), SF (Store Float), SD (Store Double) LF/LD SF/SD Fd,immediate(rs1) immediate(rs1),Fd 15 Arithmetic and Logical Instructions Prof. G. Ascia Quattro categorie: aritmetiche logiche shift set-on-comparison Operano con valori con segno/senza segno memorizzati nei GPR e con immediato Formato: R-type e I-type 16 8 Arithmetic Instructions Prof. G. Ascia ADD (add r1,r2,r3), SUB (sub r1,r2,r3), 9 tratta il contenuto dei registri sorgente con segno 9 overflow exception ADDU (addu r1,r2,r3), SUBU (subu r1,r2,r3), 9 tratta il contenuto dei registri sorgente senza segno ADDI, SUBI, ADDUI, SUBUI (addi r1,r2,17) 9 come prima ma con un operando immediato MULT,MULTU,DIV,DIVU (mult r1,r2,r3) 17 Logical Instructions AND, OR, XOR (and r1,r2,r3) 9 operazione logica tra il contenuto di due registri Prof. G. Ascia ANDI, ORI, XORI (andi r1,r2,16) 9 operazione logica tra il contenuto di un registro e un immediato zero-extended LHI (Load High Immediate) (lhi r1,0xff00) 9 Piazza i 16 bit dell’immediate nella porzione più significativa del registro destinazione e riempie la parte restante con '0' 9 Permette di creare una costante di 32 bit in un registro GPR reg con due istruzioni (LHI seguita da ADDI) 18 9 Shift Instructions Prof. G. Ascia SLL, SRL (sll r1,r2,r3 ; r1 = r2 << r3 ) 9 Fa lo shift di una quantità specificata dal valore di un registro GP SLLI, SRLI (slli r1,r2,3 ; r1 = r2 << 3) 9 Fa lo shift di una quantità specificata dal valore immediato Solo cinque bit vengono considerati 19 Arithmetic and Logical Instructions Set-On-Comparison Instructions Prof. G. Ascia SLT, SGT, SLE, SGE, SEQ, SNE (slt r1,r2,r3 (sle r1,r2,r3 (seq r1,r2,r3 if (r2<r3) r1=1 else r1=0) if (r2<=r3)r1=1 else r1=0) if (r2==r3)r1=1 else r1=0) 9 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) 9 Come prima ma con un argomento immediato (esteso in segno) 20 10 Branch Instructions Prof. G. Ascia 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) 8 L’indirizzo destinazione è calcolato sommando all’immediato esteso in segno il PC+4. 21 Move Instructions Sono tutte nel formato R-type Prof. G. Ascia MOVI2S, MOVS2I: GPR ↔ IAR (non implementata) ✓ movi2s rd,rs1 ;rd∈ ∈SR, rs1∈ ∈GPR movs2i rd,rs1 ;rd∈ ∈GPR, rs1∈ ∈SR MOVF, MOVD: FPR ↔ FPR movf rd,rs ;rd,rs∈ ∈FPR movd rd,rs ;rd,rs∈ ∈FPR (indici pari) MOVFP2I, MOVI2FP: GPR ↔ FPR movfp2i rd,rs ;rd∈GPR, rs∈FPR movi2fp rd,rs ;rd∈FPR, rs∈GPR 22 11 Floating-Point Instructions Arithmetic instructions Prof. G. Ascia ADDF, SUBF, MULTF, DIVF 9 addf f0,f1,f2 9 9 9 subf f3,f4,f5 multf f1,f2,f3 divf f1,f2,f3 ADDD, SUBD, MULTD, DIVD 9 addd f0,f2,f4 9 9 9 (float) (double) subd f2,f4,f6 multd f4,f6,f8 divd f6,f8,f10 23 Floating-Point Instructions Prof. G. Ascia Tre categorie 8 aritmetiche 8 conversione 8 Set-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 24 12 Floating-Point Instructions Convert Instructions Prof. G. Ascia 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) 25 Floating-Point Instructions Set-On-Comparison Instructions Prof. G. Ascia LTF Fa,Fb; LTD Da,Db; Less Than Float/Double (if( Fa<Fb) FPSR=1; else FPSR=0;) GTF Fa,Fb; GTD Da,Db; LEF Fa,Fb; LED Da,Db; Greater Than Float/Double 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 26 13 Branch Instructions Prof. G. Ascia BFPT, BFPF (I-type) bfpt label if (fpsr==1) PC=PC+4+ est_segno(label) bfpf label if (fpsr==0) PC=PC+4+ est_segno(label) 8 L’indirizzo destinazione è calcolato sommando all’immediato esteso in segno il PC+4. 27 Jump Instructions Prof. G. Ascia 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 28 14 Procedure Prof. G. Ascia La chiamata ad una procedura avviene mediante jal 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 mediante jr r31; Questa istruzione salta all’indirizzo di ritorno contenuto in r31 29 Procedure che chiamano altre procedure Prof. G. Ascia 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. 30 15 Esempio di chiamata di una procedura Prof. G. Ascia 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; 31 Passaggio dei parametri di una procedure Prof. G. Ascia 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. 32 16 Programmazione Assembly Prof. G. Ascia Funzioni dell’Assemblatore Traduzione da linguaggio mnemonico a linguaggio macchina (Produzione del modulo oggetto) Analisi sintattica Tipi di Istruzioni dell’Assemblatore Istruzioni macchina (relative alla fase di esecuzione) Istruzioni per l’Assemblatore (direttive: relative alla fase di traduzione). 33 Traduzione del codice Assembler Prof. G. Ascia ß ß 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) 34 17 Traduzione del codice Assembler Prof. G. Ascia ß 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. 35 Il Linker Prof. G. Ascia Il Linker (detto anche Loader) deve: ß Costruire l’eseguibile a partire dai vari moduli oggetto ß Segnalare gli errori di linking (simboli mancanti e/o duplicati) ß Creare una mappa della memoria (Opzionale) 36 18 Direttive per l’assembler Prof. G. Ascia 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. 37 Direttive Prof. G. Ascia .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. 38 19 Direttive Prof. G. Ascia .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. 39 Direttive Prof. G. Ascia .global label Rende la label disponibile per riferimenti provenienti da istruzioni macchina relativo ad altri moduli 40 20 Traps - The System Interface (1 of 2) Prof. G. Ascia Le trap costituiscono l’interfaccia tra i programmi DLX e il sistema di I/O. Sono definite cinque trap in WinDLX Esse sono: 8 8 8 8 8 8 Trap #0: Termina un programma Trap #1: Apre un File Trap #2: Chiude File Trap #3: Legge un blocco da File Trap #4: Scrive un blocco su File Trap #5: Output formattato per lo Standard-Output 41 Traps - The System Interface (2 of 2) Prof. G. Ascia Per tutte le trap: 8 Esse corrispondono alle funzioni C open(), close(), read(), write() e printf() 8 i descrittori di file 0,1 ad 2 sono riservati per stdin, stdout e stderr 8 L’indirizzo dei parametri per la chiamata di sistema deve essere caricato nel registro R14 8 Tutti i parametri devono essere di 32 bit 8 I risultato è restituito nel registro R1 42 21 Trap 1 apertura di un file Prof. G. Ascia Parameter 1. 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 0x0100 S_IREAD 0x0080 S_IWRITE 0x0040 S_IEXEC (Normal file, no directory etc.) (read access permission) (write access permission) (execute permission) 43 The file descriptor is returned in register R1. Trap 1 esempio di apertura di un file Prof. G. Ascia .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 1 sw FileDescr,R1 44 22 Trap 2 Chiusura di un file Prof. G. Ascia 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 45 Trap 3 Lettura da file Prof. G. Ascia 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. 46 23 Trap 3 Esempio di lettura da file Prof. G. Ascia .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 1 sw FileDescr,R1 ;read addi r14,r0,FileDescr trap 3 ; 47 Trap 3 – Lettura da stdin Prof. G. Ascia Non serve aprire esplicitamente lo stdin mediante la trap 1 Parametro: 8 Descrittore dello stdin : 0 8 Indirizzo,per la destinazione dell’operazione di lettura 8 Numero di blocchi (byte) da leggere Il numero di byte è restituito R1 .data buffer: .space 64 FileDesc: .word 0, buffer, 64 .text addi trap trap r14,r0,FileDesc 3 0 48 24 Trap 4 Scrittura su file Prof. G. Ascia A block can be written to the memory or the standard output. Parameter: 1. File descriptor of file 2. Address of block to be written 3. Size of the block (bytes) The actual number of bytes written is returned in register R1. 49 Trap 4 Scrittura su file Prof. G. Ascia .data buffer: .space 50 FileName: .asciiz “D:\\Temp\\dati.DAT” .align 2 Par: .word FileName, 0x0104, 0x0180 FileDescr: .space 4 .word buffer .word 50 .text addi r14,r0,Par; trap 1 sw FileDescr,R1 addi r14,r0,FileDescr; trap 4 50 25 Trap 5 - Formatted Output to Standard Out Parametro: Prof. G. Ascia 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 .text addi r14,r0,msg_addr trap 5 trap 0 51 Esempio: Input Unsigned (C code) Prof. G. Ascia Legge una stringa dal stdin e la converte in decimale int 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; } 52 26 Esempio: Input Unsigned Prof. G. Ascia 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-Trap ReadBuffer: .space 80 ReadPar: .word 0,ReadBuffer,80 ;*** Data for Printf-Trap PrintfPar: .space 4 SaveR2: SaveR3: SaveR4: SaveR5: .space .space .space .space 4 4 4 4 53 Esempio: Input Unsigned Prof. G. Ascia .text .global InputUnsigned InputUnsigned: ;*** save register contents sw SaveR2,r2 sw SaveR3,r3 sw SaveR4,r4 sw SaveR5,r5 ;*** Prompt sw PrintfPar,r1 addi r14,r0,PrintfPar trap 5 ;*** call Trap-3 to read line addi r14,r0,ReadPar trap 3 ;*** determine value addi r2,r0,ReadBuffer addi r1,r0,0 addi r4,r0,10 ;Dec system Loop: ;*** reads digits lbu r3,0(r2) seqi r5,r3,10 bnez r5,Finish subi r3,r3,48 multu r1,r1,r4 add r1,r1,r3 addi r2,r2,1 j Loop to end of line ;LF -> Exit ;´0´ ;Shift decimal ;inc pointer Finish: ;*** restore old regs contents lw r2,SaveR2 lw r3,SaveR3 lw r4,SaveR4 lw r5,SaveR5 jr r31 ; Return 54 27 Esempio: Fattoriale (1/2) Prof. G. Ascia .data Prompt: .asciiz "A value >1: " PrintfFormat: .asciiz "Factorial = %g\n\n" .align 2 PrintfPar: .word PrintfFormat PrintfValue: .space 8 .text .global main main: ;*** Read from stdin into R1 addi r1,r0,Prompt jal InputUnsigned 55 Esempio: Fattoriale (2/2) Prof. G. Ascia ;*** init movi2fp cvti2d addi movi2fp cvti2d movd values f10,r1 f0,f10 ;D0..Count register r2,r0,1 f11,r2 f2,f11 ;D2..result f4,f2 ;D4..Constant 1 Loop: ;*** Break loop if D0 = 1 led f0,f4 ;D0<=1 ? bfpt Finish ;*** Multiplication and next loop multd f2,f2,f0 subd f0,f0,f4 j Loop Finish: ;*** write result to stdout sd PrintfValue,f2 addi r14,r0,PrintfPar trap 5 trap 0 56 28 Somma tra gli elementi di un vettore (1) .data Prof. G. Ascia vett: msg_lett: msg_somma: .space 20 .asciiz "\nInserire un numero\n" .asciiz "\nLa somma e' %d" .align 2 msg_sm_addr: .word msg_somma somma: .space 4 .text .global main main: loop_lett: addi r3,r0,5 addi r2,r0, 0 addi r1,r0,msg_lett jal InputUnsigned sw vett(r2), r1 addi r2,r2,4 subi r3,r3,1 bnez r3, loop_lett 57 Somma tra gli elementi di un vettore (2) Prof. G. Ascia calcolo: loop_somma: addi r3,r0,5 addi r2,r0,0 addi r4,r0,0 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 58 29 Esempio: Minimo (1/4) Prof. G. Ascia .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: posmin: .space 4 .space 4 59 Esempio: Minimo (2/4) Prof. G. Ascia .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 60 30 Esempio: Minimo (3/4) Prof. G. Ascia 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 61 Esempio: Minimo (4/4) Prof. G. Ascia stampa: sw minimo(r0),r5 sw posmin(r0), r6 addi r14,r0,msg_stampa_addr trap 5 fine: trap 0 62 31