The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri L’ISA del DLX contiene 32 (R0-R31)...

31
1 Prof. G. Ascia 1 The DLX Assembly Prof. G. Ascia 2 DLX Instruction Set Architecture 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

Transcript of The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri L’ISA del DLX contiene 32 (R0-R31)...

Page 1: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 2: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 3: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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) ‏

Page 4: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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;

Page 5: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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)‏

Page 6: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 7: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 8: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 9: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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)‏

Page 10: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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)‏

Page 11: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 12: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 13: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 14: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 15: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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.

Page 16: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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.

Page 17: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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)‏

Page 18: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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)‏

Page 19: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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.

Page 20: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 21: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 22: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 23: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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.

Page 24: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 25: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 26: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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;

}

Page 27: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 28: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 29: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 30: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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

Page 31: The DLX Assembly - unict.it2 Prof. G. Ascia 3 Registri 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

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